NetLogo老年与年轻智能体行为无差异问题排查及模拟求助
NetLogo疫情模拟代码问题排查与修正
核心问题分析
你的代码未体现年龄差异的原因集中在以下几点:
- 智能体状态变量未初始化:
days-after-infected和days-of-sick创建时未设初始值,导致潜伏期、发病天数逻辑完全失效 - 死亡率未区分年龄:老年与年轻群体共用同一个
mortality变量,无法体现老年死亡率更高的设定 - 感染逻辑不符合需求:老年感染半径设为3(比年轻的2大),违背「社交接触少」的设定;且缺失老年智能体之间的感染路径
- 全局变量未声明:
transmission_rate、incubation_period、population-old等关键参数没有定义,运行时会报错
分步修正方案
1. 声明全局变量
添加全局变量定义,区分不同年龄组的核心参数:
globals [ transmission_rate ; 基础感染率 incubation_period ; 潜伏期天数 mortality_old ; 老年死亡率 mortality_young ; 年轻死亡率 population-old ; 老年群体数量 population-young ; 年轻群体数量 ]
2. 初始化智能体状态变量
创建智能体时,将状态变量设为0,确保时间逻辑正常运转:
to setup-old create-old population-old [ setxy random-xcor random-ycor set color 4 set shape "person" set days-after-infected 0 ; 初始化潜伏期计数 set days-of-sick 0 ; 初始化发病天数计数 ] end to setup-young create-young population-young [ setxy random-xcor random-ycor set shape "person" set color 96 set days-after-infected 0 set days-of-sick 0 ] end
3. 区分年龄组死亡率
修改sickness过程,为老年群体设置更高的死亡率:
to sickness ask old with [ color = red ] [ifelse days-of-sick < 14 [set days-of-sick days-of-sick + 1] [ifelse random 100 < mortality_old ; 使用老年专属死亡率 [die] [ set color blue ] ] ] ask young with [ color = red ] [ifelse days-of-sick < 14 [set days-of-sick days-of-sick + 1] [ifelse random 100 < mortality_young ; 使用年轻专属死亡率 [die] [ set color blue ] ] ] end
4. 修正感染逻辑
- 缩小老年感染半径,匹配「社交接触少」设定
- 补充老年之间的感染路径
- 允许感染的老年智能体传播病毒:
to transmission-old ; 感染的年轻/老年智能体都能传染易感老年 ask (young with [color = orange] + old with [color = orange]) [let susceptible-person one-of old in-radius 1 with [color = 4] ; 缩小老年接触范围 if susceptible-person != nobody [ask susceptible-person [if random 100 < transmission_rate [set color orange] ] ] ] end to transmission-young ; 感染的年轻/老年智能体都能传染易感年轻 ask (young with [color = orange] + old with [color = orange]) [let susceptible-person one-of young in-radius 2 with [color = 96] if susceptible-person != nobody [ask susceptible-person [if random 100 < transmission_rate [set color orange] ] ] ] end
5. 补充参数初始化(调试用)
在setup开头添加参数赋值,方便快速验证效果:
to setup clear-all ; 示例参数,可根据需求调整 set transmission_rate 20 set incubation_period 5 set mortality_old 30 set mortality_young 5 set population-old 50 set population-young 150 setup-old setup-young setup-patches reset-ticks end
效果验证
修正后可观察到:
- 老年智能体移动速度慢(
forward 1vs 年轻的forward 3) - 老年感染范围更小,社交接触频率更低
- 老年死亡率显著高于年轻群体
- 潜伏期、发病天数逻辑正常触发
内容的提问来源于stack exchange,提问作者Борис Дорис
相关产品推荐
相关产品推荐

