【问题标题】:NetLogo: how to use tick in correct contextNetLogo:如何在正确的上下文中使用刻度
【发布时间】:2016-02-23 17:53:10
【问题描述】:

我对 NetLogo 比较陌生,并且已经尝试了很长一段时间。我有一个搜索路径算法,可以确定模型中每个海龟(船)的最佳路径,将每个路径存储为单独的补丁列表。目标是让海龟沿着补丁列表遍历,同时让刻度计数器增加海龟每走一步(即每次所有海龟从一个补丁移动到下一个补丁时一个刻度) - 直到它到达目的地。看起来很简单,但由于某种原因,我似乎无法找出使用“tick”上下文的正确方法。

这是我的代码对应于移动部分的示例(一旦路径列表已经生成)。

to move
  tick
  ask-concurrent ships
    [
      while [length current-path != 0]
      [ 
        face first current-path
        move-to first current-path
        set current-path remove-item 0 current-path
        wait 0.08
      ]
    ]

end

目前,滴答计数器在整个模拟中只滴答一次。任何人都可以帮助我以不同的方式编码,以便每次海龟(集体)从一个补丁移动到另一个补丁时都会增加刻度? 任何帮助将不胜感激。

这是调用 move 的代码部分

  to find-shortest-path-to-destination
  place-turtles
  label-destination
  foreach sort ships
 [ ask ? 
  [ 
    set path find-a-path current-waypoint target-waypoint
    set optimal-path path
    set current-path path  
  ]
 ]
  move
end

【问题讨论】:

  • @mattsap 在确定路径后调用一次移动它。重置滴答声仅在设置过程的开始出现。我在我的问题中添加了更多代码,显示调用 move 的位置。感谢您的帮助
  • 通常将tick 放在程序的末尾,而不是开头 — 参见ccl.northwestern.edu/netlogo/docs/programming.html#ticks

标签: netlogo


【解决方案1】:

我会将您的代码更改为以下代码并将 move 放在重复块内。本质上,每个人一次移动 1 个路径单元,然后再次调用 move,然后调用下一个 tick-event 发生

to move
     tick
     ask-concurrent ships with [length current-path != 0]
     [
        face first current-path
        move-to first current-path
        set current-path remove-item 0 current-path
        wait 0.08
     ]

end
to go
    while [any? ships with [length current-path != 0]] [move]
end

【讨论】:

  • 这是一个很好的答案,但应该不惜一切代价避免ask-concurrent。它仅包含在 NetLogo 中是为了向后兼容。我也建议不要使用wait,而是使用速度滑块来控制模型的速度。
  • 我同意。我不确定原来的上下文,所以我把它们留在里面以保持完整性。 ask-concurrent 和 wait 真的应该去掉。
  • 非常感谢,这似乎有效。但是,要让重复块重复到达目的地所需的总次数,我会将其编码为if length current-path != 0 [ repeat 1 [move] ],但是移动是在海龟上下文中。关于如何避免这种情况的任何想法?
  • 我已经编辑了解决方案;但是,我认为您应该使用永久按钮并调用 move,而不是自己编写控制逻辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多