【问题标题】:Update a monitor once per tick instead of continuously. Slow model每滴答声更新一次监视器,而不是连续更新。慢模型
【发布时间】:2017-12-07 04:05:05
【问题描述】:

我知道监视器每秒会更新几次,这在检查模型的输出时会很有帮助;但是,我的模型并非如此,它只是对其进行了权衡。

我正在尝试从监视器绘制数据。如果可能的话,我希望监视器每次只更新一次报告器。

我的模型目前可以正常运行,但每秒更新多次时陷入困境。我希望有人可以通过每次更新一次来帮助我最大程度地减少模型的计算量。

当前代码示例:

globals [initial-patch0-health patch0-health intial-patch2-health patch2-health]
patches-own [ptype penergy max-penergy alive?]

to setup
 clear-all
 set patch-health 0
 ask-patches [
    setup-patches
    ]
 reset-ticks
end
to setup-patches
 let temp random 100
 if temp <= 50 [
  set ptype 2
  set max-penergy random-in-range 0 5
  set alive? true
 ]
 if temp > 50 and temp <= 75 [
  set ptype 0
  set max-penergy random 10
  set alive? true
 ]
 set penergy max-penergy
 set patch2-health (ptype2-health)
 set patch0-health (ptype0-health)
end

to go
 ask-patches
  update-patch-health
 tick
end

to patch-health
 if ptype = 2[
   set patch2-health (ptype2-health)
 ]
 if ptype = 0 [
  set patch0-health (ptype0-health) 
 ]
end

to-report ptype2-health
  report [penergy] of patches with [ptype = 2]
end

to-report ptype0-health
  report [penergy] of patches with [ptype = 0]
end  

我的监视器和绘图读取(patch2-health 相同):

sum (initial-patch0-health)

plot sum (patch0-health)

我在这种情况下使用 sum,因为记者提供了一份清单。

对于上下文,我正在做一个简单的“羊狼捕食”样式模型,但我想监控初始草健康与草健康随着时间的推移,具有多种草类型 (ptype)。我有海龟,但这里没有包含该代码。如果您需要我提供更多代码,请告诉我。

此代码以牺牲速度为代价提供了我想要的输出。我认为每个刻度只报告一次会节省一些计算时间。有什么清洁和加速的建议吗?

【问题讨论】:

  • 您是否尝试过移除/禁用显示器以查看它是否真的是您运行缓慢的原因?如果不是,您可以尝试分析器扩展来跟踪哪些部分需要很长时间来计算。如果监视器速度变慢,您是否可以改为使用输出区域,并且每次更新只更新一次?

标签: netlogo


【解决方案1】:

您的代码示例对我不可用(未定义的变量,patch0-health 不是从记者输出,其他错误)- 检查MCVE guidelines。考虑到这一点,我在复制您描述的问题时遇到了麻烦-我在存在和不存在监视器的情况下运行了一些 profiler 测试,并且在运行时没有任何差异。使用此设置:

extensions [ profiler ]
globals [ patch-turtle-sum profiler-results]

to setup
  ca
  ask n-of ( ( count patches ) / 2 ) patches [
    set pcolor red
  ]
  crt 1000 [
    setxy random-pxcor random-pycor
  ]
  set profiler-results []
  reset-ticks
end

to profile-check
  repeat 20 [
    profiler:start
    repeat 20 [ 
      go
    ] 
    set profiler-results lput profiler:inclusive-time "go" profiler-results
    profiler:reset
  ]
  print profiler-results
end

to go
  ask turtles [
    fd 1
  ]
  tick
end

to-report patch-turtle-sum-report
  report sum [count turtles-here] of patches with [ pcolor = red ]
end 

我从界面运行profile-check 程序,一次使用监控patch-turtle-sum-report 存在的监视器(平均go 包含时间:678.59 毫秒),一次没有(平均go 包含时间:678.56 毫秒)-没有可察觉的差异。 但是,我不确定profiler 是否占监视器,所以在这种情况下,这种评估可能没有用。也可能是您正在处理的补丁数量非常大(在我的测试示例中,我正在处理 100 X 100 个补丁),因此计算陷入困境。

我想知道您是否可以通过使用仅报告您每次滴答手动计算一次的变量的监视器(而不是 to-report 报告器)来解决您的问题 - 例如,按照我上面的示例,监控一个变量更新为:

set patch-turtle-sum sum [count turtles-here] of patches with [ pcolor = red ]

通过这种方式,您可以控制计算何时完成,如果计算实际上会减慢您的模型速度,这可能会加快模型速度。

【讨论】:

  • “使用一个只报告一个变量的监视器,你每次手动计算一次”——是的,这就是我的建议
猜你喜欢
  • 1970-01-01
  • 2019-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多