NetLogo SEI模型中turtle感染个体数统计方法
SEI NetLogo模型个体感染计数器修正方案
现有代码核心问题
- 计数主体完全错位:当前
infection-counter +1的执行主体是被传染的turtle,统计的是「该turtle被感染的次数」,而非「该turtle作为传染源传染了多少其他个体」 - 传播逻辑存在漏洞:将传播概率
prob定义在所有turtle判定逻辑外,单tick内所有传播判定共用同一个随机值;且仅判断周围是否存在感染者,未锁定具体传染源,无法给对应传染源累加计数 - 判定逻辑顺序错误:原有传播判定写在非感染turtle的执行块里,无法关联到具体造成传播的感染源。
修正逻辑
- 保留已定义的turtle自有变量
infection-counter,原有康复转易感时计数器清零的逻辑符合需求,无需修改 - 把传播判定逻辑调整为由已感染的turtle作为执行主体,逐个检查周围1单位半径内的易感turtle,对每个易感个体单独生成随机传播概率
- 传播成功时,给发起传播的感染源turtle的
infection-counter加1,而非给被感染者加 - 修正概率生成位置,每个传播事件单独判定,避免全模型共用概率值的bug。
修正后完整代码
to spread ; 1. 传播判定:由感染者主动传播给周围易感者 ask turtles with [infected?] [ ; 遍历周围所有未被感染(易感状态)的turtle ask other turtles in-radius 1 with [not infected? and not latent?] [ ; 每个传播事件单独生成随机概率 let prob random-float 1.0 if prob <= transmission-probability [ become-latent set latent-period-length random-exponential average-latent-period * ticks-per-day set latent-period-time 0 ; 给传染源(即当前ask外层的感染turtle)计数器+1 ask myself [ set infection-counter infection-counter + 1 ] ] ] ] ; 2. 潜伏转感染逻辑(原有逻辑无问题,保留) ask turtles [ if latent-period-time > latent-period-length [ become-infected set infectious-period-length random-exponential average-infectious-period * ticks-per-day set infectious-period-time 0 set latent-period-time 0 ] ] ; 3. 康复转易感逻辑(原有计数器重置逻辑符合需求,保留) ask turtles [ if infectious-period-time > infectious-period-length [ become-susceptible set infectious-period-time 0 set infection-counter 0 ] ] ; 4. 感染/潜伏时间累加逻辑(原有逻辑无问题,保留) ask turtles [ if latent? [ set latent-period-time latent-period-time + 1 ] if infected? [ set infectious-period-time infectious-period-time + 1 ] ] end
效果说明
- 每个turtle在感染状态下,每成功传染1个周围的易感个体,自身的
infection-counter对应+1 - 当turtle结束感染期回到易感状态时,计数器自动重置为0,下一轮进入感染状态后重新计数
- 避免了原代码中概率共用、计数主体错位的问题,统计值和需求完全匹配。
内容的提问来源于stack exchange,提问作者natalie stein
相关产品推荐
相关产品推荐

