AnyLogic建模疑问:如何实现万名带独立队列的家庭医生模拟?
解决AnyLogic中万名家庭医生独立队列的模拟方案
核心思路:基于Agent建模实现医生个体独立队列
无需手动复制模块或依赖共享队列的ResourcePool,将每个家庭医生封装为独立Agent,自带专属队列和诊疗流程,通过Population组件批量生成万名医生,完全匹配「每个医生独立队列」的实际场景。
具体实现步骤
定义Agent类型
- 创建
PatientAgent:添加诊疗时长(如double consultationTime,可设置为服从特定分布的随机值)、到达时间等属性。 - 创建
FamilyDoctorAgent:- 内置
Queue<Patient>组件(命名为patientQueue),作为该医生的专属等待队列。 - 内置
Delay组件(命名为consultationProcess),设置诊疗时间为动态值(关联患者的consultationTime属性)。 - 在医生Agent的
On startup事件中编写流程触发代码,让队列患者自动进入诊疗:while (true) { // 等待队列中有患者 Patient nextPatient = patientQueue.take(); // 设置当前患者的诊疗时长 consultationProcess.setDelayTime(nextPatient.consultationTime); // 将患者送入诊疗流程 consultationProcess.send(nextPatient); // 等待当前诊疗完成,再处理下一位 waitUntil(consultationProcess.isBusy() == false); }
- 内置
- 创建
批量生成医生群体
在主环境中添加Population<FamilyDoctor>组件,设置Population的数量为10000,自动生成万名独立的医生Agent,每个都自带专属队列和诊疗逻辑。若不需要可视化医生,可取消Population的「Show in animation」选项以提升性能。患者分配与入队
- 用
Source组件生成PatientAgent,设置患者到达规律(如泊松分布、时间间隔分布)。 - 在
Source的On exit事件中编写代码,将患者分配到目标医生的队列:// 示例:随机分配一名医生,可替换为签约关系/就近等自定义规则 int randomDocIndex = uniformInt(0, familyDoctors.size() - 1); FamilyDoctor targetDoctor = familyDoctors.get(randomDocIndex); // 将当前患者加入目标医生的队列 targetDoctor.patientQueue.add(this);
- 用
性能优化建议
- 关闭非必要的Agent可视化:万名医生的动画会大幅占用资源,仅保留患者或关键统计的可视化即可。
- 优化统计逻辑:尽量在
FamilyDoctor内部记录诊疗次数、等待时长等数据,定期汇总到全局变量,避免频繁遍历万名医生。 - 使用高效集合:主环境中用
AgentList<FamilyDoctor>替代普通List来管理医生群体,提升查找和访问效率。
内容的提问来源于stack exchange,提问作者Wissem Aboub
相关产品推荐
相关产品推荐

