我讀了NetLogo中的ask原語的文檔,以及它如何模擬parallelsim。我也發現here爲什麼NetLogo不平行。雖然我還是不明白爲什麼只有問原語不能平行?有人可以解釋一下這個選擇背後的原因嗎?爲什麼不是NetLogo要求並行?
預先感謝您
我讀了NetLogo中的ask原語的文檔,以及它如何模擬parallelsim。我也發現here爲什麼NetLogo不平行。雖然我還是不明白爲什麼只有問原語不能平行?有人可以解釋一下這個選擇背後的原因嗎?爲什麼不是NetLogo要求並行?
預先感謝您
有大量的技術原因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
]
通過同樣的推理如上,二龜可能最終連接到同一龜,產生在模型中的一個無效的狀態,在該點該模型會給出不正確的結果而不會實際發生錯誤。
你想在這種情況下怎麼辦?
ask turtles [move-to one-of patches with [not any? turtles-here]]
下面的兩個答案都給出了並行處理會導致錯誤的具體示例。在更理論層面上,並行處理取決於將更大任務分解爲可以獨立運行的更小任務的能力。但是基於代理的建模從根本上涉及代理之間的交互,所以沒有獨立性來利用。如果你沒有互動,那麼使用這種方法就沒有實際意義。然而,行爲空間 - NetLogo的批量操作 - 並行運行單獨的模擬。 – JenB
謝謝你的解釋和Bryan的回答,現在我明白了爲什麼它不是那麼容易,因爲我想做一個並行'問' –
總之,因爲並行編程非常困難,NetLogo需要很容易。 –