不同动作的NetLogo调度

NetLogo scheduling of different actions

我是 NetLogo 的新手,现在我试图了解 NetLogo 背后的逻辑。我正在构建我的第一个模型,但无法弄清楚必须如何命令程序才能执行我希望它们执行的操作。 我的模型应该做什么:

模型的作用:

我想这是一个真正的初学者错误......你能向我解释一下如何正确吗?

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