Netlogo:代码要求补丁移动,但指令在询问乌龟上
Netlogo: Code is asking patches to move, but the instructions are on ask turtle
因此,我之前曾询问过没有存储特定邻居值的补丁,多亏了 Matteo、JenB 和 Lena,我才能够取得进一步的进展。 Sicen 然后代码进步了一点,因此我遇到了一个新的错误。
首先,如果复制和粘贴代码可以工作,但有两件事是必要的,我没有底片,所以有必要将中心更改为角落,我不知道如何不创建设置按钮,所以它会需要。
现在,代码生成了3个区域,3种颜色,每个边界根据一个随机数移动。有了这个,靠近边界的海龟应该同时改变补丁的颜色和它自己的颜色,同时随机转动和移动。
问题是我不知道我缺少什么但是补丁确实改变了颜色,但是乌龟没有改变或移动,说指令正在被补丁应用并且补丁不移动,这是有道理的。但为什么?我设定的条件是,如果海龟有一定的能量,那么它们应该按照我的要求去做。
问题再次出现在 move-potrero 中,分号中的部分。
turtles-own [energia]
patches-own
[bordear
abandono
reforestado
potrerizado
temperatura
humedad
dosel
]
breed [ potreros potrero ]
breed [ bordes borde ]
breed [ bosques bosque ]
to setup
clear-all
ask patches with [
pxcor <= 30 and
pxcor >= min-pxcor and
pycor <= 60 and
pycor >= min-pycor ] [
set pcolor 35
set temperatura 26.5
set dosel 1
set humedad 90.4
]
;Potrero
ask patches with [
pxcor <= 60 and
pxcor >= 30 and
pycor <= 60 and
pycor >= min-pycor ] [
set pcolor 44
set temperatura 29
set dosel 84.3
set humedad 79.3;
]
;Borde
ask patches with [
pxcor <= 90 and
pxcor >= 60 and
pycor <= 60 and
pycor >= min-pycor ] [
set pcolor 66
set temperatura 26.3
set dosel 85.2
set humedad 94 ;
]
;Bosque
;se establece la forma de la rana
; Se establecen las condiciones de las ranas, tamaño color y lugar de aparicion. La energia sera igual en todas las ranas en el set up.
create-potreros 50
[ set size 3 ;; easier to see
set color yellow
setxy random xcor random ycor
move-to one-of patches with [pcolor = 35]
set heading random 45 + 45
set energia 50
] ;; red = not carrying food
;Potrero
reset-ticks
end
to go
ask potreros [
if energia < 50 [descansar-potrero]
if energia >= 50 and energia <= 80 [move-potrero]
if energia > 80 [ if ticks mod 50 = 0 [reproducirse]]
set heading random 270
fd 1
set energia energia - 2
morir]
ask patches [ reforestacion ]
ask patches [ deforestacion ]
ask patches [abandonacion]
ask patches [borderizacion]
if ticks >= 500 [stop]
tick
end
to reforestacion
if pcolor = 44 [
set reforestado count neighbors with [pcolor = 66] ]
if reforestado >= 3 [if random 100 <= 50 [
set pcolor 66
set temperatura 27 + random 3
set humedad 90 + random 5
set dosel 70 + random 10 ]
]
end
to deforestacion
if pcolor = 44 [
set potrerizado count neighbors with [pcolor = 35] ]
if potrerizado >= 3 [if random 100 <= 50 [
set pcolor 35
set temperatura 26.5 + random 3
set humedad 80 + random 10
set dosel 40 + random 10]
]
end
to abandonacion
if pcolor = 35 [
set abandono count neighbors with [pcolor = 44] ]
if abandono >= 3 [if random 100 <= 50 [
set pcolor 44
set temperatura 26.5 + random 3
set humedad 80 + random 10
set dosel 40 + random 10]
]
end
to borderizacion
if pcolor = 66 [
set bordear count neighbors with [pcolor = 44] ]
if bordear >= 3 [if random 100 <= 50 [
set pcolor 44
set temperatura 27 + random 3
set humedad 90 + random 5
set dosel 70 + random 10]
]
end
to move-potrero
ask neighbors in-radius 2
[if temperatura >= 28.6 or temperatura <= 22.6 or dosel >= 5 or humedad <= 84
[ set pcolor red
;facexy random 30 random 60
;fd 5
;set energia energia - 10]]
;[ask potreros [descansar-potrero]]
]]
end
to descansar-potrero
ifelse pcolor = 35 [
set energia energia + 6]
[set energia energia + 1]
end
to reproducirse
if energia > 80 [ if random 100 > 60 [set energia energia - 70
hatch 1 [ rt random-float 360 fd 2
set energia energia / 3]]]
end
to morir
if energia <= 1 [die]
end
1
问题是你要求补丁执行 turtle 命令(例如 facexy
和 fd
),因为 neighbors
报告补丁。来自 NetLogo dictionary:
Reports an agentset containing the 8 surrounding patches (neighbors) or 4 surrounding patches (neighbors4).
因此,诀窍是将 neighbors
替换为 turtles
;
to move-potrero
ask turtles in-radius 2 [
if temperatura >= 28.6 or temperatura <= 22.6 or dosel >= 5 or humedad <= 84 [
set pcolor red
facexy random 30 random 30
fd 5
set energia energia - 10
]
]
ask potreros [descansar-potrero]
end
允许此代码 运行 的是海龟可以对它们所站立的补丁的变量进行操作(请参阅 User Manual > 编程指南 > 变量)。
因此,例如,要求海龟检查 temperatura
不会产生错误,即使 temperatura
是 patches-own
.
另一种选择可能是要求补丁(即您使用 neighbors
调用的补丁)要求“他们的”海龟做事。您可以使用 turtles-here
:
to move-potrero
ask neighbors in-radius 2 [
if temperatura >= 28.6 or temperatura <= 22.6 or dosel >= 5 or humedad <= 84 [
ask turtles-here [
set pcolor red
facexy random 30 random 30
fd 5
set energia energia - 10
]
]
]
ask potreros [descansar-potrero]
end
有了这个设置,每个相邻的补丁都会检查那些与补丁相关的条件,如果其中一个为真,就要求那里的每只乌龟做点什么。
结果 将是 相同,尽管我认为前一个选项需要更少的计算时间:由您选择您喜欢的样式。
为什么我说“会相同”?见下一点。
2
表达式neighbors in-radius 2
在NetLogo中没有多大意义:neighbors
将报告8个相邻的补丁,这些不会随着一定的半径而改变。我也可以写 neighbors in-radius 1000
,但我总是会收到相同的 8 个补丁,因为只有这 8 个补丁是某个补丁的邻居。
知道这一点特别重要,因为 NetLogo 不会告诉你,即如果你写 neighbors in-radius 2
它不会给出错误消息(事实上这不是语法错误,因为 in-radius
出现在代理集之后和数字之前,就像它 requires): NetLogo 将仅通过仅报告相邻的补丁来继续。
因此,从上面的第 1 点中您应该更喜欢的选项是第一个选项,即带有 ask turtles in-radius 2
的选项。事实上,这是唯一能让你玩 in-radius
.
的选项
3
请注意,存在 resize-world
命令(参见 here)。通过将 0 包含为 min-pxcor
和 min-pycor
,您将能够在您的代码中自动执行您的世界不包含负坐标的事实。
因此,我之前曾询问过没有存储特定邻居值的补丁,多亏了 Matteo、JenB 和 Lena,我才能够取得进一步的进展。 Sicen 然后代码进步了一点,因此我遇到了一个新的错误。
首先,如果复制和粘贴代码可以工作,但有两件事是必要的,我没有底片,所以有必要将中心更改为角落,我不知道如何不创建设置按钮,所以它会需要。
现在,代码生成了3个区域,3种颜色,每个边界根据一个随机数移动。有了这个,靠近边界的海龟应该同时改变补丁的颜色和它自己的颜色,同时随机转动和移动。
问题是我不知道我缺少什么但是补丁确实改变了颜色,但是乌龟没有改变或移动,说指令正在被补丁应用并且补丁不移动,这是有道理的。但为什么?我设定的条件是,如果海龟有一定的能量,那么它们应该按照我的要求去做。
问题再次出现在 move-potrero 中,分号中的部分。
turtles-own [energia]
patches-own
[bordear
abandono
reforestado
potrerizado
temperatura
humedad
dosel
]
breed [ potreros potrero ]
breed [ bordes borde ]
breed [ bosques bosque ]
to setup
clear-all
ask patches with [
pxcor <= 30 and
pxcor >= min-pxcor and
pycor <= 60 and
pycor >= min-pycor ] [
set pcolor 35
set temperatura 26.5
set dosel 1
set humedad 90.4
]
;Potrero
ask patches with [
pxcor <= 60 and
pxcor >= 30 and
pycor <= 60 and
pycor >= min-pycor ] [
set pcolor 44
set temperatura 29
set dosel 84.3
set humedad 79.3;
]
;Borde
ask patches with [
pxcor <= 90 and
pxcor >= 60 and
pycor <= 60 and
pycor >= min-pycor ] [
set pcolor 66
set temperatura 26.3
set dosel 85.2
set humedad 94 ;
]
;Bosque
;se establece la forma de la rana
; Se establecen las condiciones de las ranas, tamaño color y lugar de aparicion. La energia sera igual en todas las ranas en el set up.
create-potreros 50
[ set size 3 ;; easier to see
set color yellow
setxy random xcor random ycor
move-to one-of patches with [pcolor = 35]
set heading random 45 + 45
set energia 50
] ;; red = not carrying food
;Potrero
reset-ticks
end
to go
ask potreros [
if energia < 50 [descansar-potrero]
if energia >= 50 and energia <= 80 [move-potrero]
if energia > 80 [ if ticks mod 50 = 0 [reproducirse]]
set heading random 270
fd 1
set energia energia - 2
morir]
ask patches [ reforestacion ]
ask patches [ deforestacion ]
ask patches [abandonacion]
ask patches [borderizacion]
if ticks >= 500 [stop]
tick
end
to reforestacion
if pcolor = 44 [
set reforestado count neighbors with [pcolor = 66] ]
if reforestado >= 3 [if random 100 <= 50 [
set pcolor 66
set temperatura 27 + random 3
set humedad 90 + random 5
set dosel 70 + random 10 ]
]
end
to deforestacion
if pcolor = 44 [
set potrerizado count neighbors with [pcolor = 35] ]
if potrerizado >= 3 [if random 100 <= 50 [
set pcolor 35
set temperatura 26.5 + random 3
set humedad 80 + random 10
set dosel 40 + random 10]
]
end
to abandonacion
if pcolor = 35 [
set abandono count neighbors with [pcolor = 44] ]
if abandono >= 3 [if random 100 <= 50 [
set pcolor 44
set temperatura 26.5 + random 3
set humedad 80 + random 10
set dosel 40 + random 10]
]
end
to borderizacion
if pcolor = 66 [
set bordear count neighbors with [pcolor = 44] ]
if bordear >= 3 [if random 100 <= 50 [
set pcolor 44
set temperatura 27 + random 3
set humedad 90 + random 5
set dosel 70 + random 10]
]
end
to move-potrero
ask neighbors in-radius 2
[if temperatura >= 28.6 or temperatura <= 22.6 or dosel >= 5 or humedad <= 84
[ set pcolor red
;facexy random 30 random 60
;fd 5
;set energia energia - 10]]
;[ask potreros [descansar-potrero]]
]]
end
to descansar-potrero
ifelse pcolor = 35 [
set energia energia + 6]
[set energia energia + 1]
end
to reproducirse
if energia > 80 [ if random 100 > 60 [set energia energia - 70
hatch 1 [ rt random-float 360 fd 2
set energia energia / 3]]]
end
to morir
if energia <= 1 [die]
end
1
问题是你要求补丁执行 turtle 命令(例如 facexy
和 fd
),因为 neighbors
报告补丁。来自 NetLogo dictionary:
Reports an agentset containing the 8 surrounding patches (neighbors) or 4 surrounding patches (neighbors4).
因此,诀窍是将 neighbors
替换为 turtles
;
to move-potrero
ask turtles in-radius 2 [
if temperatura >= 28.6 or temperatura <= 22.6 or dosel >= 5 or humedad <= 84 [
set pcolor red
facexy random 30 random 30
fd 5
set energia energia - 10
]
]
ask potreros [descansar-potrero]
end
允许此代码 运行 的是海龟可以对它们所站立的补丁的变量进行操作(请参阅 User Manual > 编程指南 > 变量)。
因此,例如,要求海龟检查 temperatura
不会产生错误,即使 temperatura
是 patches-own
.
另一种选择可能是要求补丁(即您使用 neighbors
调用的补丁)要求“他们的”海龟做事。您可以使用 turtles-here
:
to move-potrero
ask neighbors in-radius 2 [
if temperatura >= 28.6 or temperatura <= 22.6 or dosel >= 5 or humedad <= 84 [
ask turtles-here [
set pcolor red
facexy random 30 random 30
fd 5
set energia energia - 10
]
]
]
ask potreros [descansar-potrero]
end
有了这个设置,每个相邻的补丁都会检查那些与补丁相关的条件,如果其中一个为真,就要求那里的每只乌龟做点什么。 结果 将是 相同,尽管我认为前一个选项需要更少的计算时间:由您选择您喜欢的样式。
为什么我说“会相同”?见下一点。
2
表达式neighbors in-radius 2
在NetLogo中没有多大意义:neighbors
将报告8个相邻的补丁,这些不会随着一定的半径而改变。我也可以写 neighbors in-radius 1000
,但我总是会收到相同的 8 个补丁,因为只有这 8 个补丁是某个补丁的邻居。
知道这一点特别重要,因为 NetLogo 不会告诉你,即如果你写 neighbors in-radius 2
它不会给出错误消息(事实上这不是语法错误,因为 in-radius
出现在代理集之后和数字之前,就像它 requires): NetLogo 将仅通过仅报告相邻的补丁来继续。
因此,从上面的第 1 点中您应该更喜欢的选项是第一个选项,即带有 ask turtles in-radius 2
的选项。事实上,这是唯一能让你玩 in-radius
.
3
请注意,存在 resize-world
命令(参见 here)。通过将 0 包含为 min-pxcor
和 min-pycor
,您将能够在您的代码中自动执行您的世界不包含负坐标的事实。