为什么 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
]
同理,两只海龟可能最终连接到同一只海龟,导致模型处于无效状态,此时模型会给出错误的结果,但实际上并没有出错。
我阅读了 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
]
同理,两只海龟可能最终连接到同一只海龟,导致模型处于无效状态,此时模型会给出错误的结果,但实际上并没有出错。