2015-03-24 23 views
4

我發現我的模型運行速度非常慢,我縮小到龜的運行半徑內命令。底線是在下面兩個過程中,test1檢查每個補丁的[var],但運行得比test2快,它應該只檢查8個補丁的一小部分。爲什麼NetLogo的半徑很慢,是否有更快的方法呢?

set patches-of-interest (patch-set patches with [var > 1]) 

to test1 
    ask min-one-of other patches-of-interest with-max [var][distance myself][set pcolor red] 
end 

to test2 
    ask min-one-of other patches-of-interest in-radius 1.5 with-max [var][distance myself][set pcolor yellow] 
end 

您可以使用事件探查器擴展,下面的代碼檢查他們的速度:

profiler:start   
repeat 100 [ 
ask one-of turtles [test1 test2] 
]  
profiler:stop   
print profiler:report 
profiler:reset  

首先,爲什麼是test2的運行慢?其次,是否有替代test2的方法可以完成大致相同的工作,但效率更高?

我發現這個名單的NetLogo這個一對夫婦的討論,但他們是有點老了,可能是過時的: https://github.com/NetLogo/NetLogo/issues/402

http://netlogo-users.18673.x6.nabble.com/Re-in-radius-efficiency-question-td5003840.html

編輯:我離開了,在我的模型我實際上使用補丁集不是完整的「補丁」。我已經更新了上面的代碼示例,但Bryan已經部分解釋了評論放緩的原因。 Bryan說得對,如果使用所有補丁,test2要快得多,但是我還沒有能夠提前對補丁進行分類,或者在兩次測試中都不會減慢test2。

+3

嘗試把周圍半徑'補丁1.5'括號。對所有補丁的「半徑內」檢查可以進行優化,但對其他補丁集的「半徑內」檢查無法進行。 – 2015-03-24 23:36:00

+1

我有機會測試這個,我得到了不同的結果。 'test2'的運行速度明顯快於'test1'。我使用相同的代碼來發布您的內容。我用一隻烏龜初始化模型,並以幾種不同的方式初始化每個補丁「var」:'0','random 10','random 2','random-float 1'等。在所有情況下'test2'運行明顯更快。你如何初始化世界?你使用的是什麼版本的NetLogo? – 2015-03-26 18:16:11

+0

我使用您帖子中的更新信息對其進行了測試。對我來說,test2的運行速度也比test1慢。我試圖在ask語句之前定義半徑補丁集,現在它的運行速度明顯加快,甚至快於test1'set set-in-radius其他補丁半徑爲1.5'的問題。 -radius with-max [var] [distance myself] [set pcolor green]' – Tyr 2015-04-07 12:46:09

回答

2

@ bryan-head給出了代碼爲什麼很慢的原因(補丁集中的半徑內檢查不能被優化)。我認爲這是Netlogo代碼的內部特性。

但是,我終於找到了一個解決辦法,加快速度,並具有相同的效果,所以我想我會張貼它。首先添加補丁變量binaryvar然後,

ask patches [ifelse var > 1 [ set binaryvar 1][set binaryvar 0] 
to test3 
    ask min-one-of other patches-of-interest in-radius 1.5 with-max [var * binaryvar][distance myself][set pcolor yellow] 
end 

當然,如果在半徑所有的細胞也有變種= 0仍然失敗......