You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AnyLogic建模疑问:如何实现万名带独立队列的家庭医生模拟?

解决AnyLogic中万名家庭医生独立队列的模拟方案

核心思路:基于Agent建模实现医生个体独立队列

无需手动复制模块或依赖共享队列的ResourcePool,将每个家庭医生封装为独立Agent,自带专属队列和诊疗流程,通过Population组件批量生成万名医生,完全匹配「每个医生独立队列」的实际场景。

具体实现步骤

  1. 定义Agent类型

    • 创建Patient Agent:添加诊疗时长(如double consultationTime,可设置为服从特定分布的随机值)、到达时间等属性。
    • 创建FamilyDoctor Agent:
      • 内置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);
        }
        
  2. 批量生成医生群体
    在主环境中添加Population<FamilyDoctor>组件,设置Population的数量为10000,自动生成万名独立的医生Agent,每个都自带专属队列和诊疗逻辑。若不需要可视化医生,可取消Population的「Show in animation」选项以提升性能。

  3. 患者分配与入队

    • 用Source组件生成Patient Agent,设置患者到达规律(如泊松分布、时间间隔分布)。
    • 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 10:05:26