为什么 NetLogo 不询问并行?

Why isn't NetLogo ask parallel?

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

提前致谢

在这种情况下你希望发生什么?

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

有大量的技术原因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

因此,如果我们 运行 这个模型两次处于完全相同的状态,一次它可能成功,而另一次它可能出错,这取决于并行执行中固有的 运行domness .

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

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

同理,两只海龟可能最终连接到同一只海龟,导致模型处于无效状态,此时模型会给出错误的结果,但实际上并没有出错。