2017-07-19 74 views
1

我讀了NetLogo中的ask原語的文檔,以及它如何模擬parallelsim。我也發現here爲什麼NetLogo不平行。雖然我還是不明白爲什麼只有問原語不能平行?有人可以解釋一下這個選擇背後的原因嗎?爲什麼不是NetLogo要求並行?

預先感謝您

+4

下面的兩個答案都給出了並行處理會導致錯誤的具體示例。在更理論層面上,並行處理取決於將更大任務分解爲可以獨立運行的更小任務的能力。但是基於代理的建模從根本上涉及代理之間的交互,所以沒有獨立性來利用。如果你沒有互動,那麼使用這種方法就沒有實際意義。然而,行爲空間 - NetLogo的批量操作 - 並行運行單獨的模擬。 – JenB

+0

謝謝你的解釋和Bryan的回答,現在我明白了爲什麼它不是那麼容易,因爲我想做一個並行'問' –

+0

總之,因爲並行編程非常困難,NetLogo需要很容易。 –

回答

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

你想在這種情況下怎麼辦?

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