我想优化我的网络标识代码,并通过使用分析器扩展来跟踪瓶颈。此外,我正在运行我的模型在无头模式,我给2GB的内存(-Xmx2048m)
,并有2601补丁与约100-1500代理。我使用时间延展作为网络标识。
现在,我有四个一般性问题。
1)是否更好地在模型( .nlogo)或BehaviorSearch (在无头模式下与.xml文件一起使用)中写入退出条件(见下文),还是没有任何区别?
模型中的:
if count turtles = 0 [ stop ]
if time:is-equal dt (time:create "1722-04-05") [ stop ] ;using the time extension
:
<exitCondition>count turtles = 0</exitCondition>
<exitCondition>time:is-equal dt (time:create "1722-04-05")</exitCondition>
2)我认为我可以通过优化代码来优化我的模型,以至于它几乎不能更快地运行(参见屏幕截图,我在运行了6,5小时的模拟后拍摄了这张截图):
但是,我越来越怀疑如何在我的模型中标出每一个滴答来代表一天(这实际上是一个关键因素)。我开始怀疑,因为在我的模型中,最大的时间跨度可能是472年。这将使172280滴答为一个完整的运行模式!我不知道在Net徽标中每次运行大量的滴答是否会成为一个巨大的瓶颈,因为我有这样的性能(参见上面的分析器输出)。
3)将gpu扩展添加到模型中以获得更快的速度是合理的,还是实现起来并不那么容易?我这么问是因为我没有找到任何关于这方面的文件。这种可能性似乎在很大程度上被忽略了,参见这条线。
4)是否有意义,技术上是否有可能在内存中运行无头网络标识?在这些问题上,你可能已经看到,我对这些技术细节并不是很坚定,而是对可能性感兴趣。
编辑:按照请求,在下面找到orientation
的代码片段:
to orientation
ifelse (energy < 4) [ ;if hungry
let nearest-resource min-one-of (patches with [pcolor = green] in-radius 3 ) [ distance myself ] ;check distance between you and nearest resource (3 fields 360 degrees view)
if is-patch? nearest-resource [ ;if green patch exist at all
move-to nearest-resource ]
]
[ rt random-float 30 - random-float 30 ] ;otherwise just walk randomly around
end
这部分代码是最近关于堆栈溢出的这里讨论的主题。
发布于 2015-01-20 10:50:44
谢谢你张贴你的代码!幸运的是,它可以被优化!patches with [pcolor = green]
将遍历每一个补丁,检查哪些是绿色的。... in-radius 3
将遍历所有绿色的,检查哪些足够接近。但是,如果您首先执行patches in-radius 3
,NetLogo可以精确地计算出该半径中的哪些补丁,而无需检查它们的全部。然后,也有更少的补丁来检查颜色。我从交换这些命令中得到了将近10倍的加速:
to orientation
ifelse (energy < 4) [ ;if hungry
let nearest-resource min-one-of (patches in-radius 3 with [pcolor = green] ) [ distance myself ] ;check distance between you and nearest resource (3 fields 360 degrees view)
if is-patch? nearest-resource [ ;if green patch exist at all
move-to nearest-resource ]
]
[ rt random-float 30 - random-float 30 ] ;otherwise just walk randomly around
end
您必须小心查询补丁,因为通常有很多补丁。在其他检查之前执行in-radius
检查会有很大帮助,因为NetLogo可以优化patches in-radius
。
快速回答你的问题:
最后,确保让BehaviorSpace在您的机器上每个核心使用一个线程。这是默认的,所以除非您设置线程数,否则应该会发生这种情况。当然,在运行NetLogo时,每个核心应该接近100%。您的OSes活动监视器应该能够向您提供此信息。如果没有发生这种情况(也许NetLogo不正确地检测内核的数量),您可以尝试显式地设置--threads
选项。
https://stackoverflow.com/questions/28043466
复制相似问题