无法在 NetLogo 中为每个品种生成多个 'species'
Unable to generate multiple 'species' per breed in NetLogo
我是 NetLogo 的新手,我正在尝试在每个品种中创建 2 个子品种(用不同的形状表示),总共 2 个品种(即鲨鱼和鱼)。当 运行 单独时,代码块按预期工作,但是,当 运行 两个块时,鱼的第一个子品种似乎没有在界面选项卡中初始化。出于某种原因,鲨鱼品种的初始化似乎干扰了鱼类品种的初始化。
知道我做错了什么吗?下面的代码。
; Create the agents
breed [sharks shark]
breed [fishes fish]
; Create the agents' variables
fishes-own
[
x0
y0
]
globals
[
species
species-f
]
to setup
; Always start with this
clear-all
reset-ticks
; Create sharks and species
create-sharks N-sharks ; N-sharks is a slider
[
set color blue
setxy random-xcor random-ycor
set species N-sharks
ask sharks
[
set shape "default"
set size 2.5
]
ask sharks with [who >= (species * (1 / 2))]
[
set shape "square"
set size 2
]
ask sharks with [who < (species * (1 / 6))]
[
set shape "star"
set size 3
]
] ; End create sharks and species
; Create fishes
create-fishes N-fishes
[
setxy random-xcor random-ycor
set x0 xcor
set y0 ycor
set species-f (N-fishes * species-ratio)
ifelse who <= species-f
[
set shape "sheep"
set size 5
]
[
set shape "cow"
set size 3
]
set color white
] ; End create fishes
end
问题是您正在使用 who
来确定您的目标。引用 Netlogo programming guide:“无论品种如何,都会分配给谁编号。如果您已经有一只青蛙 0,那么第一只老鼠将是老鼠 1,而不是老鼠 0,因为编号 0 已经被占用。”。 =17=]
因此,您需要考虑鲨鱼的数量来确定鱼类的分界点
set species-f (N-fishes * species-ratio) + N-sharks - 1
我对您的代码的另一个评论是您使用了以下结构:
create-sharks N-shark [
ask sharks [...]
]
每只鲨鱼执行create-sharks
的整个命令块。这意味着每只鲨鱼都要求每只鲨鱼做某事。因此,每条鲨鱼都将其形状设置为默认 N-shark 次。
使用以下结构之一效率更高
create-sharks N-shark [...]
ask sharks [...]
或
create-sharks N-shark [
if <condition> [<reshape-self>]
]
关于 NetLogo 的 运行 代码是什么,以及某些代码片段的作用,似乎存在许多误解:当您使用 create-turtles *number* [*commands*]
时(或使用 breeds,如在您的case), commands 是 运行 一次 被创建的每个乌龟 (first the new turtles are created, then they run the commands in turn).
这意味着每次您在 create-sharks
' 命令块中使用 ask sharks
时,每条新鲨鱼都会要求所有其他鲨鱼设置形状和大小。例如,如果您创建 100 条鲨鱼,而不是只设置一次形状和大小,您需要执行 10,000 次 (100 * 100)。
所以你需要将所有这些命令从它们各自的 create-<breed>
命令块中取出;例如:
create-sharks N-sharks [
set color blue
setxy random-xcor random-ycor
]
ask sharks [
set size 2.5
]
ask sharks with [who >= (species * (1 / 2))] [
set shape "square"
set size 2
]
ask sharks with [who < (species * (1 / 6))] [
set shape "star"
set size 3
]
这仍然是可改进的代码,但它展示了如何通过执行一次而不是执行 N-sharks ^ 2
次来实现完全相同的事情。
更好的方法是将这些命令带回 create-<breed>
的命令块中,但让每个代理只为自己执行任务。即不使用ask sharks
而是使用ifelse
,这样每只鲨鱼都会检查自己的条件:
create-sharks N-sharks [
set color blue
setxy random-xcor random-ycor
(ifelse
who >= (species * (1 / 2)) ; the first condition
[set shape "square" set size 2]
who < (species * (1 / 6)) ; the second condition
[set shape "star" set size 3]
; else
[set size 2.5])
]
所有这些也适用于其他品种。
一般说使用who
是代码应该改进的标志,但我们现在先不关注这个。
你会注意到我省略了你 set species N-sharks
的部分。这是因为我认为这里还有另一个误解,我不清楚你想做什么:species
(例如 species-f
代表其他品种)是一个全局变量。您基本上要求 100 条鲨鱼中的每一条(再次,例如 100 条)做同样的事情:将全局变量的值设置为等于另一个全局变量的值。在这种情况下,您要求每条鲨鱼 set species 100
。这似乎非常不必要,特别是考虑到 N-sharks
是用于设置的滑块,因此在模拟期间可能不会更改(这意味着可能不需要存储 current N-sharks
的值作为单独的全局变量)。
为什么要根据 species
的值对 sub-breeds 进行重新分区?你想让 species
代表什么?将它作为 N-sharks
的单独变量是否正确?如果是,那么不清楚它的意义是什么;如果没有,则可以淘汰。
您需要确保使用 N-sharks
和 species
以及 N-fishes
和 species-f
可以更好地反映在您的代码中。
还因为我认为这就是您的第一条鱼 sub-breed 没有出现的原因。首先,什么是species-ratio
?它不存在于您的示例中,但它似乎与您的问题相关。无论如何,如果你的第一条鱼 sub-breed 没有出现,这意味着没有 fish
满足条件 who <= species-f
.
这并不让我吃惊。 who
海龟的数字是渐进的:如果你创造了 15 条鲨鱼,后来又创造了 10 条鱼......
- ...最老的鲨鱼会有
who = 0
- ...最年轻的鲨鱼会有
who = 14
- ...最老的鱼会有
who = 15
- ...最小的鱼会有
who = 24
如您在此示例中所见,who <= N-fishes
(其中 N-fishes = 10
)没有鱼。更不用说在你的情况下你 set species-f (N-fishes * species-ratio)
并且,虽然你没有告诉 species-ratio
是什么,但我想它是一个介于 0 和 1 之间的值 - 因此 species-f
的值甚至更小。
我是 NetLogo 的新手,我正在尝试在每个品种中创建 2 个子品种(用不同的形状表示),总共 2 个品种(即鲨鱼和鱼)。当 运行 单独时,代码块按预期工作,但是,当 运行 两个块时,鱼的第一个子品种似乎没有在界面选项卡中初始化。出于某种原因,鲨鱼品种的初始化似乎干扰了鱼类品种的初始化。
知道我做错了什么吗?下面的代码。
; Create the agents
breed [sharks shark]
breed [fishes fish]
; Create the agents' variables
fishes-own
[
x0
y0
]
globals
[
species
species-f
]
to setup
; Always start with this
clear-all
reset-ticks
; Create sharks and species
create-sharks N-sharks ; N-sharks is a slider
[
set color blue
setxy random-xcor random-ycor
set species N-sharks
ask sharks
[
set shape "default"
set size 2.5
]
ask sharks with [who >= (species * (1 / 2))]
[
set shape "square"
set size 2
]
ask sharks with [who < (species * (1 / 6))]
[
set shape "star"
set size 3
]
] ; End create sharks and species
; Create fishes
create-fishes N-fishes
[
setxy random-xcor random-ycor
set x0 xcor
set y0 ycor
set species-f (N-fishes * species-ratio)
ifelse who <= species-f
[
set shape "sheep"
set size 5
]
[
set shape "cow"
set size 3
]
set color white
] ; End create fishes
end
问题是您正在使用 who
来确定您的目标。引用 Netlogo programming guide:“无论品种如何,都会分配给谁编号。如果您已经有一只青蛙 0,那么第一只老鼠将是老鼠 1,而不是老鼠 0,因为编号 0 已经被占用。”。 =17=]
因此,您需要考虑鲨鱼的数量来确定鱼类的分界点
set species-f (N-fishes * species-ratio) + N-sharks - 1
我对您的代码的另一个评论是您使用了以下结构:
create-sharks N-shark [
ask sharks [...]
]
每只鲨鱼执行create-sharks
的整个命令块。这意味着每只鲨鱼都要求每只鲨鱼做某事。因此,每条鲨鱼都将其形状设置为默认 N-shark 次。
使用以下结构之一效率更高
create-sharks N-shark [...]
ask sharks [...]
或
create-sharks N-shark [
if <condition> [<reshape-self>]
]
关于 NetLogo 的 运行 代码是什么,以及某些代码片段的作用,似乎存在许多误解:当您使用 create-turtles *number* [*commands*]
时(或使用 breeds,如在您的case), commands 是 运行 一次 被创建的每个乌龟 (first the new turtles are created, then they run the commands in turn).
这意味着每次您在 create-sharks
' 命令块中使用 ask sharks
时,每条新鲨鱼都会要求所有其他鲨鱼设置形状和大小。例如,如果您创建 100 条鲨鱼,而不是只设置一次形状和大小,您需要执行 10,000 次 (100 * 100)。
所以你需要将所有这些命令从它们各自的 create-<breed>
命令块中取出;例如:
create-sharks N-sharks [
set color blue
setxy random-xcor random-ycor
]
ask sharks [
set size 2.5
]
ask sharks with [who >= (species * (1 / 2))] [
set shape "square"
set size 2
]
ask sharks with [who < (species * (1 / 6))] [
set shape "star"
set size 3
]
这仍然是可改进的代码,但它展示了如何通过执行一次而不是执行 N-sharks ^ 2
次来实现完全相同的事情。
更好的方法是将这些命令带回 create-<breed>
的命令块中,但让每个代理只为自己执行任务。即不使用ask sharks
而是使用ifelse
,这样每只鲨鱼都会检查自己的条件:
create-sharks N-sharks [
set color blue
setxy random-xcor random-ycor
(ifelse
who >= (species * (1 / 2)) ; the first condition
[set shape "square" set size 2]
who < (species * (1 / 6)) ; the second condition
[set shape "star" set size 3]
; else
[set size 2.5])
]
所有这些也适用于其他品种。
一般说使用who
是代码应该改进的标志,但我们现在先不关注这个。
你会注意到我省略了你 set species N-sharks
的部分。这是因为我认为这里还有另一个误解,我不清楚你想做什么:species
(例如 species-f
代表其他品种)是一个全局变量。您基本上要求 100 条鲨鱼中的每一条(再次,例如 100 条)做同样的事情:将全局变量的值设置为等于另一个全局变量的值。在这种情况下,您要求每条鲨鱼 set species 100
。这似乎非常不必要,特别是考虑到 N-sharks
是用于设置的滑块,因此在模拟期间可能不会更改(这意味着可能不需要存储 current N-sharks
的值作为单独的全局变量)。
为什么要根据 species
的值对 sub-breeds 进行重新分区?你想让 species
代表什么?将它作为 N-sharks
的单独变量是否正确?如果是,那么不清楚它的意义是什么;如果没有,则可以淘汰。
您需要确保使用 N-sharks
和 species
以及 N-fishes
和 species-f
可以更好地反映在您的代码中。
还因为我认为这就是您的第一条鱼 sub-breed 没有出现的原因。首先,什么是species-ratio
?它不存在于您的示例中,但它似乎与您的问题相关。无论如何,如果你的第一条鱼 sub-breed 没有出现,这意味着没有 fish
满足条件 who <= species-f
.
这并不让我吃惊。 who
海龟的数字是渐进的:如果你创造了 15 条鲨鱼,后来又创造了 10 条鱼......
- ...最老的鲨鱼会有
who = 0
- ...最年轻的鲨鱼会有
who = 14
- ...最老的鱼会有
who = 15
- ...最小的鱼会有
who = 24
如您在此示例中所见,who <= N-fishes
(其中 N-fishes = 10
)没有鱼。更不用说在你的情况下你 set species-f (N-fishes * species-ratio)
并且,虽然你没有告诉 species-ratio
是什么,但我想它是一个介于 0 和 1 之间的值 - 因此 species-f
的值甚至更小。