SEIR与行人混合仿真中如何复制已有智能体状态机到pedSource新生成智能体
解决方案
方案1:直接复用已有智能体(优先推荐,完全避免状态重置)
你不需要通过pedSource生成新智能体,直接将存储在personasEnCasa中的已有智能体注入到行人流程中即可,所有状态机状态、倒计时参数都可以完整保留,操作步骤如下:
- 打开pedSource的属性面板,将生成模式修改为
Manual call of inject(),关闭自动生成逻辑,由你自己控制智能体注入时机。 - 替换原有pedSource出口的代码为以下逻辑:
// 判断当前区域内人数未达上限,且有可复用的智能体 if (personasEnCasa.size() > 0 && (personasEnCasa.size() + personasEnSuper.size()) <= poblacionMaxima) { Persona p = randomFrom(personasEnCasa); // 直接将已有智能体注入行人流程 pedSource.inject(p); // 更新智能体所属的存储结构 personasEnCasa.remove(p); personasEnSuper.add(p); }
- 后续智能体离开仿真区域时,不要调用
destroy()方法销毁,仅将其从personasEnSuper和行人环境中移除,加入personasEnCasa即可,所有属性都会完整保留。
方案2:全属性拷贝给新生成的智能体
如果你不想改动现有pedSource自动生成逻辑,也可以在新智能体生成时,将待复用智能体的所有相关属性完整拷贝到新智能体上,代码示例如下:
if (personasEnCasa.size() + personasEnSuper.size() <= poblacionMaxima) { Persona p = randomFrom(personasEnCasa); // 拷贝状态机当前状态 ped.statechart.setState(p.statechart.getState()); // 拷贝所有和SEIR状态关联的自定义参数,需根据你实际的变量名调整 ped.tiempoRestanteRecuperacion = p.tiempoRestanteRecuperacion; ped.tiempoRestanteExposicion = p.tiempoRestanteExposicion; ped.esAsintomatico = p.esAsintomatico; // 其他你定义的和智能体状态相关的参数均需要在此处补充拷贝 // 更新存储结构,销毁已完成拷贝的旧智能体 personasEnCasa.remove(p); p.destroy(); personasEnSuper.add(ped); }
注意该方案必须完整拷贝所有和智能体状态相关的变量,遗漏任意参数都会导致状态异常,因此更推荐使用方案1。
内容的提问来源于stack exchange,提问作者NicolasA13
相关产品推荐
相关产品推荐

