NetLogo技术问题:如何从感染触发点开始计数Ticks,实现病毒模拟器中turtles的病程管控与免疫功能
解决NetLogo病毒模拟器中患病时长计数与免疫实现问题
嘿,这个需求在NetLogo里非常好实现,核心思路就是给每个海龟添加状态跟踪变量,精准记录它们的患病时长,下面给你两种实用的方案:
方案一:直接累计患病时长(直观易理解)
这种方法给每个海龟设置一个变量,每次tick就给患病的海龟累加时长,达到阈值后触发恢复和免疫。
1. 初始化变量
首先在代码开头定义海龟的状态变量:
globals [ recovery-time ] ; 全局变量:需要患病多少tick才能恢复 turtles-own [ sick? ; 是否处于患病状态 immune? ; 是否获得免疫 time-sick ; 累计患病的tick数 ]
在setup过程里完成初始设置:
to setup clear-all set recovery-time 10 ; 这里可以自定义需要的tick数,比如10 create-turtles 100 [ set sick? false set immune? false set time-sick 0 setxy random-xcor random-ycor set color green ; 健康状态颜色 ] ; 设置初始患病个体 ask n-of 5 turtles [ set sick? true set color red ; 患病状态颜色 set time-sick 0 ; 初始化患病时长为0 ] reset-ticks end
2. 核心逻辑处理
在go过程里,先更新患病海龟的时长,再处理感染逻辑:
to go ; 处理患病海龟的时长计数与恢复 ask turtles with [sick?] [ set time-sick time-sick + 1 ; 检查是否达到恢复阈值 if time-sick >= recovery-time [ set sick? false set immune? true set time-sick 0 ; 重置计数 set color blue ; 免疫状态颜色,方便区分 ] ] ; 处理感染逻辑:仅感染健康且未免疫的海龟 ask turtles with [sick?] [ ask other turtles in-radius 1 with [not sick? and not immune?] [ set sick? true set color red set time-sick 0 ; 关键:感染瞬间重置时长计数! ] ] tick end
方案二:记录患病起始tick(更节省变量)
这种方法通过记录海龟开始患病的tick数,用当前ticks减去起始tick来计算时长,不需要单独的累计变量:
1. 初始化变量
globals [ recovery-time ] turtles-own [ sick? immune? sick-start-tick ; 记录开始患病的tick值,用-1表示未患病 ]
setup过程:
to setup clear-all set recovery-time 10 create-turtles 100 [ set sick? false set immune? false set sick-start-tick -1 set color green setxy random-xcor random-ycor ] ask n-of 5 turtles [ set sick? true set color red set sick-start-tick ticks ; 感染瞬间记录当前tick ] reset-ticks end
2. 核心逻辑处理
to go ; 处理恢复逻辑 ask turtles with [sick?] [ ; 计算已患病时长:当前tick - 起始tick if (ticks - sick-start-tick) >= recovery-time [ set sick? false set immune? true set sick-start-tick -1 set color blue ] ] ; 处理感染逻辑 ask turtles with [sick?] [ ask other turtles in-radius 1 with [not sick? and not immune?] [ set sick? true set color red set sick-start-tick ticks ; 关键:记录感染时的tick ] ] tick end
关键注意事项
- 必须在感染瞬间初始化计数:不管用哪种方案,都要在海龟刚被感染的时候,把时长相关的变量(
time-sick或sick-start-tick)设置正确,否则计数会出错。 - 免疫状态判断:感染逻辑里一定要加上
not immune?的条件,确保已经免疫的海龟不会被再次感染。 - 参数可配置化:用全局变量
recovery-time来存储阈值,后续调整时长只需要改这个变量的值,不用修改核心逻辑。
内容的提问来源于stack exchange,提问作者Marten Tabak
相关产品推荐
相关产品推荐

