为什么NetLogo';它的半径太慢了,有没有更快的办法?

为什么NetLogo';它的半径太慢了,有没有更快的办法?,netlogo,Netlogo,我发现我的模型运行得非常慢,我把它缩小到了海龟们正在运行的半径范围内的命令。底线是,在下面的两个过程中,test1检查每个补丁的[var],但运行速度比test2快,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 myse

我发现我的模型运行得非常慢,我把它缩小到了海龟们正在运行的半径范围内的命令。底线是,在下面的两个过程中,test1检查每个补丁的[var],但运行速度比test2快,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:start         
repeat 100 [ 
ask one-of turtles [test1 test2]
 ]      
profiler:stop         
print profiler:report  
profiler:reset    
首先,为什么test2运行得较慢?第二,是否有一种替代test2的方法,它可以做大致相同的事情,但效率更高

我在Netlogo列表中发现了一些关于这方面的讨论,但它们有点过时了,所以可能已经过时了:


编辑:我忽略了在我的模型中,我实际上使用的是一个补丁集,而不是完整的“补丁”。我已经更新了上面的代码示例,但是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

当然,如果radius中的所有单元格也有var=0,则此操作仍然失败。

尝试在radius 1.5中的
补丁周围加上括号
in-radius
可以优化对所有修补程序的检查,但对其他修补程序集的检查不能优化。我有机会测试了这一点,我从中得到了完全不同的结果<对我来说,code>test2
运行速度明显快于
test1
。我使用的代码与你发布的代码相同。我用一只海龟初始化了模型,并用几种不同的方式初始化了每个补丁的
var
random 10
random 2
random float 1
,等等。在所有情况下
test2
运行速度都显著加快。你的世界怎么样?你使用的是什么版本的NetLogo?我用你帖子中的更新信息对它进行了测试。对我来说,test2的运行速度也比test1慢。在ask语句之前,我尝试定义半径内补丁集,现在它运行速度明显更快,甚至比test1
在半径内设置补丁radius 1.5中的其他补丁快
使用max[var][distance imf][set pcolor green]
@tyr在半径内设置一个补丁,您的版本运行得更快,因为在
设置radius中的补丁
行中,您使用的是
补丁
,而不是像我编辑的版本那样使用有限的补丁集
感兴趣的补丁
。修复此问题后,它的运行方式与上面的test2相同。@cwren,是的,您是对的。如果我使用以前定义的
补丁
补丁集,我的版本也会慢得多。我刚刚测试了以下内容:在我的示例中,我将radius 1.5中的
补丁更改为带有[distance]的
感兴趣补丁