每次打勾而不是连续更新一次监视器。慢模型

时间:2017-12-05 20:04:30

标签: netlogo

我知道监视器每秒更新几次,这在检查模型的输出时会有所帮助;然而,对于我的模型来说情况并非如此,它只是权衡它。

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

我的模型目前正在运行,但每次更新多次都会陷入困境。我希望有人可以通过每次更新一次来帮助我最小化模型的计算工作量。

当前代码示例:

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,因为记者提供了一份清单。

就上下文而言,我正在做一个简单的&#34;牧羊掠夺&#34;风格模型,但我想监测最初的草健康与草的健康随着时间的推移,多种草类型(ptype)。我有海龟,但这里没有包含这些代码。如果您需要更多我的代码,请告诉我。

这段代码只是以速度为代价给出了我想要的输出。我认为每次滴答只报告一次会节省一些计算时间。有关清洁和加速的建议吗?

1 个答案:

答案 0 :(得分:2)

您的代码示例对我不可用(未定义的变量,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 ms),一次没有(均值go包容性时间:678.56 ms) - 没有可检测到的差异。 但是,我不确定profiler是否会占用监视器,因此在这种情况下,评估可能没用。也可能是你正在处理的补丁数量非常大(在我的测试示例中,我正在做100 X 100补丁),这样计算就会陷入困境。

我想知道你是否可以通过使用一个监视器来解决你的问题,该监视器只报告每个tick(而不是to-report报告者)手动计算的变量 - 例如按照上面的例子,监视变量用以下内容更新:

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

这样就可以控制计算何时完成,如果计算实际上减慢了模型的速度,可能会加快模型的速度。