为什么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.

最佳答案 @ 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,则仍然会失败…

点赞