我知道监视器每秒更新几次,这在检查模型的输出时会有所帮助;然而,对于我的模型来说情况并非如此,它只是权衡它。
我正在尝试从监视器中绘制数据。我希望监视器只在每个滴答时更新一次报告,如果可能的话。
我的模型目前正在运行,但每次更新多次都会陷入困境。我希望有人可以通过每次更新一次来帮助我最小化模型的计算工作量。
当前代码示例:
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)。我有海龟,但这里没有包含这些代码。如果您需要更多我的代码,请告诉我。
这段代码只是以速度为代价给出了我想要的输出。我认为每次滴答只报告一次会节省一些计算时间。有关清洁和加速的建议吗?
答案 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 ]
这样就可以控制计算何时完成,如果计算实际上减慢了模型的速度,可能会加快模型的速度。