NetLogo中实现turtle-own变量utility与24刻度关联及每日更新求助
解决NetLogo智能体24小时Utility追踪与每日更新问题
嘿,我来帮你搞定这个智能体小时级utility追踪的需求!咱们一步步来实现你要的功能:
核心思路
每个司机智能体需要一个24元素的列表来存储一天中每个小时的utility值,列表的索引对应一天中的小时(索引0=00:00,索引1=01:00...索引23=23:00)。利用ticks mod 24来定位当前属于一天中的哪个小时,实现自动覆盖每日同一时段的旧数据,完全契合你要的“每日更新”需求。
修改后的完整代码
turtle-own [ utility ; 当前小时的即时utility值 hourly-utility ; 存储24小时utility的列表(索引0-23对应00:00-23:00) ] globals [ start-time current-time ] to setup __clear-all-and-reset-ticks ;; 设置时间锚点,1tick=1小时 set start-time time:create "2020/01/01 00:00" set current-time time:anchor-to-ticks start-time 1.0 "hour" time:anchor-schedule start-time 1.0 "hour" setup-turtles end to setup-turtles create-turtles 10 [ ; 示例创建10个司机智能体 setxy random-xcor random-ycor set utility 0 ;; 初始化24小时列表,所有值设为0 set hourly-utility n-values 24 [0] ] end to go ;; 更新当前小时的utility值(这里用你的占位逻辑,后续替换为真实效用函数即可) ask turtles [ set utility utility + 1 ;; 计算当前属于一天中的第几个小时(0-23) let current-hour mod ticks 24 ;; 将当前utility值存入对应小时的列表位置,自动覆盖旧值 set hourly-utility replace-item current-hour hourly-utility utility ] ;; 可选:打印某个智能体的24小时数据,方便调试 if ticks mod 24 = 0 [ ask one-of turtles [ print (word "智能体" who "的24小时utility数据:" hourly-utility) ] ] tick end
关键细节解释
- 列表初始化:用
n-values 24 [0]快速生成一个包含24个0的列表,作为每个智能体的初始小时数据。 - 定位当前小时:
mod ticks 24会返回0到23的整数,完美对应一天的24小时——比如tick=25时,25 mod24=1,刚好对应01:00的时段,自动覆盖周一01:00的旧数据。 - 更新列表值:用
replace-item函数直接替换列表中对应索引的元素,这比foreach遍历更高效。不过如果你想用foreach来做批量操作(比如计算平均效用),可以参考这段代码:
;; 示例:用foreach遍历hourly-utility列表,计算总效用 let total-utility 0 foreach hourly-utility [ u -> set total-utility total-utility + u ] let avg-utility total-utility / 24
扩展建议
- 如果你需要查看历史多天的数据,可以把
hourly-utility改成一个列表的列表(比如daily-utility-logs),每天结束时把当前的24小时列表添加进去,但这样会占用更多内存,根据你的模型需求选择。 - 可以在界面添加一个
plot或者table组件,实时展示某个智能体的小时utility变化,方便调试。
内容的提问来源于stack exchange,提问作者CoffeeloverGER
相关产品推荐
相关产品推荐

