我发现我的模型运行速度非常慢,我将其缩小到半径命令,即海龟正在运行。底线是下面两个过程中的一个,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。答案 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 ...
,则仍然会失败