NetLogo中turtle离开或死亡后存储停留时长等变量结果的实现方案问询
解决方案
核心思路是使用全局列表存储已离开turtle的停留时长数据,turtle完成流程后将对应数值写入列表即可直接销毁,无需留存agent占用算力。
第一步:声明全局存储变量
在代码的globals段新增存储列表,同时在setup过程中初始化该列表:
extensions [csv] ; 如需要导出CSV文件需先启用CSV扩展 globals [ completed-stay-list ; 新增:存储所有已完成流程的turtle停留时长 ; 其余原有全局变量保持不变 ] to setup clear-all set completed-stay-list [] ; 初始化空列表 ; 其余原有setup逻辑保持不变 end
第二步:修改turtle退出逻辑
调整to undergo-process中的退出代码,turtle满足离开条件时,将自身time-in-system写入全局列表后直接调用die销毁:
to undergo-process ask turtles with [shape = "person"] [ set time-in-system time-in-system + 1 ] ask turtles-on area-name [ if ticks = length-of-stay [ ; 新增:将当前turtle的停留时长追加到全局列表末尾 set completed-stay-list lput time-in-system completed-stay-list ; 直接销毁agent,无需留存占用算力 die ] ] end
第三步:使用存储的数据
后续需要绘图、统计、导出数据时直接调用全局列表即可:
- 绘制直方图直接替换原来的代码为:
histogram completed-stay-list - 模型结束后导出为CSV文件可以使用:
csv:to-file "stay-length.csv" (map [list ?] completed-stay-list),导出的文件每行对应一个turtle的独立停留时长值
可选优化
如果你的模型运行周期极长、数据量极大,可以分批写入本地文件避免内存占用过高,每累计固定条数数据就写入一次文件再清空列表即可:
; 可加在go过程末尾,每累计1000条数据就追加写入本地文件 if length completed-stay-list >= 1000 [ csv:to-file "stay-length.csv" (map [list ?] completed-stay-list) true ; 最后一个true参数代表追加写入 set completed-stay-list [] ]
内容的提问来源于stack exchange,提问作者Nicola
相关产品推荐
相关产品推荐

