【问题标题】:Deliberate timing delay in netlogo?在netlogo中故意延迟时间?
【发布时间】:2015-07-02 03:35:02
【问题描述】:

尊敬的 Netlogo 社区,

我想在我的模拟中设置一些计时器约束,让代理做出决定。我知道我们可以通过使用滴答声来实现,但在我的模拟中,所有代理都应该在一个滴答声中做出决定,并且为了避免任何死锁,我想为代理做出决定引入一些时间限制。如果代理没有在规定时间内做出决定,资源的控制权应该交给其他代理。任何帮助将非常感激。谢谢

【问题讨论】:

  • 在我看来,这里有一个更根本的问题。延迟会减慢模拟速度,但实际上不会改变 NetLogo 处理命令的顺序。代理(海龟)实际上并没有同时做他们的决定。当您执行ask turtles [...] 时,一个海龟会在 [] 中执行所有操作,然后是下一个,以此类推,直到所有海龟都已完成,然后再继续执行下一组命令。所以你可能想要更像ask turtles with [some sort of filter about resource availability][commands] 然后ask turtles with [different filter][different commands]

标签: netlogo


【解决方案1】:

如果您没有与任何滴答限制相关的任何约束,您可以创建一个程序来计算自龟主程序启动以来的滴答数,例如...

已编辑代码:

procedure turtle-decision-making
set time_passed 0
while time_passed < time_limit
  decision-taking-part << 
     if decision taken
      break while loop
     else
     set time_passed (ticks_passed + 1)
  ;; tick Might be that this procedure is the outermost loop, might be that is not.
end while
end turtle-decision-making

【讨论】:

  • 我喜欢这个建议,除了我不会将代理审议的时间单位称为“滴答”,因为这是 NetLogo 对整个模拟中时间进展的术语。您的所有代码都在一个刻度内运行。
  • @SethTisue 更新了代码,使其在循环内运行。你怎么看?
  • 我的建议是完全避免使用刻度计数器。在 NetLogo 上下文中,在内部循环中修改滴答计数器基本上是没有意义的,只有在模拟的最外层循环中。所以我建议保留ticks_passed,但给它一个不同的名称,其中没有tick,这在特定的NetLogo上下文中会产生误导。
【解决方案2】:

如果您想根据经过多少 CPU 或“挂钟”时间来停止海龟,这在 NetLogo 中根本是不可能的。在不停止整个模型的情况下,无法从外部阻止任意一段 NetLogo 代码。此外,NetLogo 是单线程的,所以任何时候都只有一段 NetLogo 代码在运行,所以没有办法让其他 NetLogo 代码中断或干预。

您必须做一些更像 JenB 建议或 David 建议的事情——这两种方法似乎都是潜在有效的方法,具体取决于您的目标。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-22
    相关资源
    最近更新 更多