有没有什么办法可以加快速度;勾选“代码”;Netlogo的功能?

有没有什么办法可以加快速度;勾选“代码”;Netlogo的功能?,netlogo,Netlogo,前言:我是一名经济学家,没有接受过编程方面的正式培训 我正在Netlogo中组装一个ABM,随着代码越来越长,“检查”功能——在任何更改后运行代码所需的功能——正在花费越来越长的时间。现在在我非常快的桌面上大约需要30秒。我试着在非常慢的ultrabook上运行代码,花了10分钟检查。我想知道是否有任何方法可以加快或绕过这个过程,或者是否有任何最佳实践可以将我的代码组织得更快 编辑:我有大量的代码(大约5000行,100000个字符),随着程序变大,“检查”时间成比例地增加。我不知道代码的哪些组

前言:我是一名经济学家,没有接受过编程方面的正式培训

我正在Netlogo中组装一个ABM,随着代码越来越长,“检查”功能——在任何更改后运行代码所需的功能——正在花费越来越长的时间。现在在我非常快的桌面上大约需要30秒。我试着在非常慢的ultrabook上运行代码,花了10分钟检查。我想知道是否有任何方法可以加快或绕过这个过程,或者是否有任何最佳实践可以将我的代码组织得更快

编辑:我有大量的代码(大约5000行,100000个字符),随着程序变大,“检查”时间成比例地增加。我不知道代码的哪些组件导致了执行时间的增加,也不知道如何以与此问题相关的方式将模型简化为伪代码

然而,我已经添加了一些示例代码,这些代码捕获了我的程序的一个元素(许多品种类型——虽然不是这么多),并花费了相当多的时间进行检查

我的模型有很多种类型,因为我有数千个代理,需要定期调用搜索特定代理,发现代理集太慢

breed [types1 type1]
breed [types2 type2]
...
breed [types250 type250]


types1-own [ a b c d]
types2-own [ a b c d]
...
types250-own [ a b c d]

globals [
  iter

]
to setup
  ca
ask types1 [set a 1 set b 2 set c 3 set d 4 set xcor 1 set ycor 1]
ask types2 [set a x set b y set c z set d w set xcor 15 set ycor 12]
....
ask types250 [set a A set b B set c C set d D set xcor 3 set ycor 14]


end
编辑2:


为了回应关于品种数量可能存在问题的建议,我将品种数量从大约75个减少到大约25个,并用agentsets代替。这显著提高了我的模型中的设置时间(从~0.8秒提高到~0.3秒),但对语法检查/编译/单击“检查”时实际发生的任何事情都没有明显的影响。

我制作了一个包含250个品种和250个
品种自己的
声明的NetLogo模型示例,它在我的2015 MacBook Pro上快速检查/编译,不到1秒。我为每个品种添加了一些
setup
命令,比如
create-types1[;…]
,检查速度变慢了。然后我添加了一些
go
语句,如您的示例中的那样,
ask types1[;…]
,它变得更慢了,大约1000行代码需要5秒钟

我从模型库中打开了DNA复制叉模型,它大约有900行代码,大约有12个品种,而且加载似乎也需要大约5秒钟。这是非常不科学的,我只是想弄清楚问题的根源。至少在我的MacBook上,我不能很好地确认许多品种是检查/编译缓慢的罪魁祸首,但这肯定是一种不寻常的方式来编写模型,所以我也不会把它算出来

不管怎样,30秒到10分钟对于检查/编译来说显然太长了。如果您愿意将您的完整模型提交给bugs@ccl.northwestern.edu我们可以更仔细地看一看,并可能打开一个问题,不管是什么,缓慢的核心原因是最终得到修复

除了查看更新之外 在创建下面的示例时,我遇到了一件事:当我使用大约75000个代理调用
reset ticks
时,NetLogo desktop更新视图的速度非常慢。你提到有数千名特工,但我不确定是否有那么多。在任何情况下,如果在模型运行时不需要查看某些代理,可以执行
设置隐藏?创建视图更新或完全关闭视图更新时为true

您提到切换到多品种有助于您的模型的运行时性能,所以我不认为这是您的问题,但我想提及它以防万一

无种子期权 冒着回答一个你没有问过的问题的风险,这里有一个选项,可以尝试让不受约束的解决方案发挥作用

正如JenB指出的,您可以在变量中预先存储AgentSet,以避免重复计算它们。您给出的示例只是为每种类型设置了自己的变量值,我不希望仅使用筛选的AgentSet会非常慢(但我可能错了!)

您提到要寻找特定的代理,我想知道这里是否存在嵌套搜索问题。类似于
ask turtles with[type=1][ask turtles with[type=2][;…do Something]]
的方法在很多代理中可能会变得非常缓慢,因为带有[type=2]
的内部
海龟将为每只1型海龟计算。预先计算过滤后的代理集应有助于这一点,如果代理没有死亡或更改类型,则每
设置一次,或者如果代理没有死亡或更改类型,则每
go
勾选一次

这里有一个例子。我使用这个版本来存储预先计算的代理集,因为有了这么多类型的代理,代码会简化很多。事实上,它已经有了一个基本的
组代理
,它可以根据代理变量的值对代理进行分组。因为我不知道代理在您的模型中到底在做什么,所以我填写了一些设置一些链接的
go
代码,以显示您实际如何使用存储的代理集

extensions [ table ]

globals [ turtle-type-numbers turtle-sets ]

turtles-own [ turtle-type a b c d ]

to setup
  clear-all

  ; store the turtle type number list so we don't keep re-creating it
  set turtle-type-numbers range 250
  set turtle-sets table:make

  foreach turtle-type-numbers [ turtle-type-number ->
    create-turtles 100 [
      set turtle-type turtle-type-number
      set hidden? true
      set a random 10
      set b random 10
      set c one-of [true false]
      set d one-of ["apples" "oranges" "bananas"]
    ]
  ]

  reset-ticks
end

to go
  ; at the start of each tick, re-query our turtle-sets
  ; if new turtles are not made and existing turtles do not change types
  ; then this could just be done once at the end of `setup` instead
  set turtle-sets table:group-agents turtles [turtle-type]

  ask links [ die ]

  foreach turtle-type-numbers [ turtle-type-number ->
    let typed-turtles (table:get turtle-sets turtle-type-number)
    ask typed-turtles [
      fd turtle-type mod 10

      ; link this turtle to one of the other types
      ; we just choose the next type number, get the agentset
      ; we stored previosuly, then choose `one-of` those
      ; turtles to link to.
      let next-type (turtle-type + 1) mod 250
      let next-turtles (table:get turtle-sets next-type)
      create-link-with one-of next-turtles
    ]
  ]

  tick
end

我希望这会有帮助。

@JenB谢谢你的更正。我不确定我能帮你解决你的具体问题。然而,您提到您切换到品种是因为代理设置太慢。确实,创建agentsets很慢,但是您可能会发现使用agentsets并将它们存储在全局变量中更容易。因此,您只需使用海龟的相关组合创建一次agentset。这在不牺牲性能(至少在理论上)的情况下减少了代码重复。这也可能减少语法检查时间。只是为了比较,我有一个NetLogo3D模型,大约4000行分布在大约10个.nls文件中。它使用四个扩展。在4000行代码中,大约90%是真正的代码行,所以大约3500行代码。所有这些在我的普通桌面上“检查”只需要不到5秒的时间。然而,我只有五个品种。我同意@JenB的建议。如果你以前使用过品种,p