首页 > 解决方案 > 如何让代理在特定滴答内停留在 netlogo 中的特定补丁?

问题描述

我正在编写代码以使代理在世界各地漫游以觅食。

找到食物后,他们应该在找到食物的地方停留一段时间。但我有一个问题是让它们在食物区停留一段时间。

一定时间:每只海龟都有自己的变量“s”,“s”是NetLogo生成的随机数,这个数字在每个tick内不应该改变,我有一个问题是让“s”不改变。

例如,乌龟 1 的“s”=60,乌龟 1 找到食物后,会在食物上停留 60 刻。乌龟 1 在那里停留 60 刻后,它会离开食物,“s”的值将再次重置为另一个随机值。每只海龟都有不同的“s”值

我尝试使用计时器编码,但是每次代理遇到食物时计时器只会减少(就像他们只是在食物上行走而不是呆在那里)我不能使用bk 1 or fd -1命令,因为海龟在他们走路后只是继续前进向后 1 个刻度。

任何帮助表示赞赏。

这是代码:

turtles-own
[ 
  food
  location 
  s
]

patches-own
[
  food-quality
]

to go
  move
  forage
end

to move
 ask turtles
  [fd 1]
end


to forage

 set s random 100

   ask turtles
     [ [ if food < food-quality  ;meaning that turtle will only keep the best food's value each time they found food
        [set food food-quality  ;food-quality is patch-own, the food's value
          set location patch-here]
          if s >= 50  
           [stay] ]

    ]
    ]

end

to stay   
  set s s - 1   ;decrement-timer  
  if s = 0 
    [move
      set label ""
      reset-s
    ]    

end

to reset-count-down   
  set s random 100
end

编辑:使问题更清晰并更新一些代码。

标签: netlogo

解决方案


我认为您有逻辑问题而不是编码问题,但这并不是特别清楚。如果您的变量 's' 应该是类似于停留计时器(更具描述性的名称),那么不要set在草料过程的开头使用它。相反,set当乌龟找到食物时,它只会在没有被停留计时器持有的情况下移动/觅食。您的代码中也没有tick任何内容,因此您没有推进时钟。我想你想要这样的东西:

to forage
  ask turtles
  [ if food < food-quality  ; has found food that is more than currently owned
    [ set stay-timer random 5 + 20    ; sets number of ticks to stay between 5 and 24
      set food food-quality  ; food-quality is patch-own, the food's value
      set location patch-here
    ]
    set stay-timer stay-timer - 1 
  ]
end

to go
  ask turtles with [stay-timer = 0] [ move ]
  forage
  tick
end

推荐阅读