不同动作的NetLogo调度
NetLogo scheduling of different actions
我是 NetLogo 的新手,现在我试图了解 NetLogo 背后的逻辑。我正在构建我的第一个模型,但无法弄清楚必须如何命令程序才能执行我希望它们执行的操作。
我的模型应该做什么:
- 在“早上”(模拟开始)随机分散我的代理人
- 然后让他们“上坡”,稍微随机一点,去到周围日照度最高的地方。
- 在那里停留一些刻度(25 到 34 之间)
- 我的计时器到期后,他们应该开始觅食——到目前为止只是随机移动——计时器不应该再次启动,也不应该再次执行“上坡”行为
模型的作用:
- 代理随机分布
- 他们移动到周围日照最高的地方(上坡)
- 计时器开始倒计时
- 特工们又开始移动了——但我被困在上坡了——呆在原地,直到计时器再次“循环”结束
我想这是一个真正的初学者错误......你能向我解释一下如何正确吗?
to go
move-turtles
tick
end
to move-turtles
ask turtles
[ifelse insolation <= max [insolation] of neighbors
[continue]
[bask]
pen-down
]
end
to continue ;; a turtle procedure
ifelse random-float 1.0 < 0.7
[uphill insolation]
[move-to one-of neighbors]
end
to bask ;; a turtle procedure
set count-down count-down - 1
set label count-down
if count-down = 0
[
forage
set label ""
]
end
to forage ;; turtle procedure
set heading (random-normal 180 30)
fd random-normal 3 2
end
如果我对你的问题理解正确,你只希望他们每天爬山/晒太阳一次,但他们会反复这样做。想象一只乌龟已经完成了它们的晒太阳,草料程序将它们发送到一个随机方向一次。现在,下一个价格变动,他们将面临:
ifelse insolation <= max [insolation] of neighbors
[ continue ]
[ bask ]
所以他们环顾四周并比较日照值,然后根据比较情况 select 'continue' 或 'bask' 程序。如果他们得到继续过程,他们将移动到相邻的补丁之一,要么移动到具有最大日照值的那个,要么随机移动。如果他们得到 bask 程序,除了标签被打开之外什么也不会发生。这是因为从他们上次晒到倒计时的值为0,所以代码检查值是否为0时为-1。
一旦什么都没有发生,他们将在下一次报价时面临相同的选择,并且会有相同的结果。所以一旦乌龟到了日照高峰期,它就会一直呆在那里。
如果您希望某件事只发生一次,最简单的做法是添加一个变量来记住它是否已经发生。 NetLogo 约定有 true/false (yes/no) 个变量,末尾有一个问号。所以你可以做类似的事情(假设你已经将 'bask-over?' 添加到 turtles-own
并将其初始化为 false):
to bask ;; a turtle procedure
set count-down count-down - 1
set label count-down
if count-down = 0
[ forage
set label ""
set bask-over? true
]
end
然后您将该变量带入测试是继续还是晒太阳:
to move-turtles
ask turtles
[ ifelse bask-over? or insolation <= max [insolation] of neighbors
[ continue ]
[ bask ]
pen-down
]
end
请注意 if bask-over?
与 if bask-over? = true
相同。同样,您可以使用 if not bask-over?
而不是 if bask-over? = false
。
我是 NetLogo 的新手,现在我试图了解 NetLogo 背后的逻辑。我正在构建我的第一个模型,但无法弄清楚必须如何命令程序才能执行我希望它们执行的操作。 我的模型应该做什么:
- 在“早上”(模拟开始)随机分散我的代理人
- 然后让他们“上坡”,稍微随机一点,去到周围日照度最高的地方。
- 在那里停留一些刻度(25 到 34 之间)
- 我的计时器到期后,他们应该开始觅食——到目前为止只是随机移动——计时器不应该再次启动,也不应该再次执行“上坡”行为
模型的作用:
- 代理随机分布
- 他们移动到周围日照最高的地方(上坡)
- 计时器开始倒计时
- 特工们又开始移动了——但我被困在上坡了——呆在原地,直到计时器再次“循环”结束
我想这是一个真正的初学者错误......你能向我解释一下如何正确吗?
to go
move-turtles
tick
end
to move-turtles
ask turtles
[ifelse insolation <= max [insolation] of neighbors
[continue]
[bask]
pen-down
]
end
to continue ;; a turtle procedure
ifelse random-float 1.0 < 0.7
[uphill insolation]
[move-to one-of neighbors]
end
to bask ;; a turtle procedure
set count-down count-down - 1
set label count-down
if count-down = 0
[
forage
set label ""
]
end
to forage ;; turtle procedure
set heading (random-normal 180 30)
fd random-normal 3 2
end
如果我对你的问题理解正确,你只希望他们每天爬山/晒太阳一次,但他们会反复这样做。想象一只乌龟已经完成了它们的晒太阳,草料程序将它们发送到一个随机方向一次。现在,下一个价格变动,他们将面临:
ifelse insolation <= max [insolation] of neighbors
[ continue ]
[ bask ]
所以他们环顾四周并比较日照值,然后根据比较情况 select 'continue' 或 'bask' 程序。如果他们得到继续过程,他们将移动到相邻的补丁之一,要么移动到具有最大日照值的那个,要么随机移动。如果他们得到 bask 程序,除了标签被打开之外什么也不会发生。这是因为从他们上次晒到倒计时的值为0,所以代码检查值是否为0时为-1。
一旦什么都没有发生,他们将在下一次报价时面临相同的选择,并且会有相同的结果。所以一旦乌龟到了日照高峰期,它就会一直呆在那里。
如果您希望某件事只发生一次,最简单的做法是添加一个变量来记住它是否已经发生。 NetLogo 约定有 true/false (yes/no) 个变量,末尾有一个问号。所以你可以做类似的事情(假设你已经将 'bask-over?' 添加到 turtles-own
并将其初始化为 false):
to bask ;; a turtle procedure
set count-down count-down - 1
set label count-down
if count-down = 0
[ forage
set label ""
set bask-over? true
]
end
然后您将该变量带入测试是继续还是晒太阳:
to move-turtles
ask turtles
[ ifelse bask-over? or insolation <= max [insolation] of neighbors
[ continue ]
[ bask ]
pen-down
]
end
请注意 if bask-over?
与 if bask-over? = true
相同。同样,您可以使用 if not bask-over?
而不是 if bask-over? = false
。