为什么NetLogo不要求并行?

时间:2017-07-19 09:44:05

标签: parallel-processing netlogo

我阅读了NetLogo中ask原语的文档以及它如何模拟parallelsim。我还发现here为什么NetLogo不是并行的。虽然我仍然不明白为什么只是问题原语不能并行?有人可以解释一下这个选择背后的原因是什么?

提前谢谢

2 个答案:

答案 0 :(得分:3)

有许多技术原因ask无法并行(主要是由于操纵共享状态),但在较高级别,请考虑以下代码:

create-turtles 3
ask turtles [
  let target one-of other turtles-here
  ask target [
    die
  ]
]

假设ask并行运行。然后不同的海龟会在上面ask不可预测地(或多或少)交织执行命令。首先,让我们看一下我们期望发生的事情。类似下面的内容(可能在当前的NetLogo语义下发生):

turtle 2 assigns target to turtle 1
turtle 2 asks turtle 1 to die
turtle 1 dies
turtle 0 assigns target to turtle 2
turtle 0 asks turtle 2 to die
turtle 2 dies

如果ask平行,则可能发生以下情况:

turtle 2 assigns target to turtle 1
turtle 0 assigns target to turtle 1
turtle 0 asks turtle 1 to die
turtle 1 dies
turtle 2 asks turtle 1 to die, but turtle 1 no longer exists, so an error occurs

因此,如果我们在完全相同的状态下运行此模型两次,一次可能成功,另一次它可能会出错,只是取决于并行执行中固有的随机性。

更糟糕的是,我们可以在没有错误的情况下结束意外状态。请考虑以下代码尝试将乌龟与链接配对:

ask turtles [
  let target one-of other turtles with [ not any? link-neighbors ]
  create-link-with target
]

通过与上述相同的推理,两只乌龟可能最终连接到同一只乌龟,导致模型状态无效,此时模型将给出不正确的结果而不会出现实际错误。

答案 1 :(得分:1)

在这种情况下你想要发生什么?

ask turtles [move-to one-of patches with [not any? turtles-here]]