为什么NetLogo的半径如此之慢,是否有更快的方法呢?

时间:2015-03-24 21:14:11

标签: netlogo

我发现我的模型运行速度非常慢,我将其缩小到半径命令,即海龟正在运行。底线是下面两个过程中的一个,test1检查每个补丁的[var]但运行速度比test2快,后者应该只检查8个补丁的一小部分。

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扩展程序和以下代码检查其速度:

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。

1 个答案:

答案 0 :(得分: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

当然,如果半径范围内的所有单元格也具有var = 0 ...

,则仍然会失败