首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >优化网络标识代码-太多的滴答每次运行?

优化网络标识代码-太多的滴答每次运行?
EN

Stack Overflow用户
提问于 2015-01-20 10:50:39
回答 1查看 623关注 0票数 2

我想优化我的网络标识代码,并通过使用分析器扩展来跟踪瓶颈。此外,我正在运行我的模型在无头模式,我给2GB的内存(-Xmx2048m),并有2601补丁与约100-1500代理。我使用时间延展作为网络标识。

现在,我有四个一般性问题。

1)是否更好地在模型( .nlogo)或BehaviorSearch (在无头模式下与.xml文件一起使用)中写入退出条件(见下文),还是没有任何区别?

模型中的

代码语言:javascript
运行
复制
if count turtles = 0 [ stop ]
if time:is-equal dt (time:create "1722-04-05") [ stop ] ;using the time extension

代码语言:javascript
运行
复制
<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的代码片段:

代码语言:javascript
运行
复制
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

这部分代码是最近关于堆栈溢出的这里讨论的主题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-20 18:50:44

谢谢你张贴你的代码!幸运的是,它可以被优化!patches with [pcolor = green]将遍历每一个补丁,检查哪些是绿色的。... in-radius 3将遍历所有绿色的,检查哪些足够接近。但是,如果您首先执行patches in-radius 3,NetLogo可以精确地计算出该半径中的哪些补丁,而无需检查它们的全部。然后,也有更少的补丁来检查颜色。我从交换这些命令中得到了将近10倍的加速:

代码语言:javascript
运行
复制
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

快速回答你的问题:

  1. 不应该有什么不同,但我喜欢把我的放在BehaviorSpace里。
  2. 更多的滴答不一定是坏的。例如,见Ising。
  3. 还没用过,但如果成功了我会很惊讶的。最后一次提交是在4年前,这是许多NetLogo版本之前的情况。也就是说,如果你能让它起作用,我很想知道!
  4. 不太清楚您的意思,但NetLogo完全运行内存。也就是说,如果NetLogo和其他同时运行的程序使用的内存比你拥有的内存多,操作系统就会将内存卸载到硬盘上,这在某些情况下可能会导致严重的减速。这是不太可能的,但肯定是一个超级大模型的关注(而你的不是)。你的电脑有多少内存?

最后,确保让BehaviorSpace在您的机器上每个核心使用一个线程。这是默认的,所以除非您设置线程数,否则应该会发生这种情况。当然,在运行NetLogo时,每个核心应该接近100%。您的OSes活动监视器应该能够向您提供此信息。如果没有发生这种情况(也许NetLogo不正确地检测内核的数量),您可以尝试显式地设置--threads选项。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28043466

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档