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