
本文介绍在anylogic中对来自同一信源、经同一服务模块处理的多类智能体(如6类患者),实现**按类型分组统计队列平均等待时间**的实用方法,涵盖分流建模、时间测量与数据聚合三大核心步骤。
在AnyLogic中,当所有患者(Agent)均源自同一个Source、共用同一个Service模块,但需按类型(如patientType = 1~6)分别统计其在队列中的平均等待时间时,直接依赖单一Service块内置的“Waiting time in queue”统计项是不够的——它仅输出全局均值,无法自动按类型切片。此时,最可靠且易于理解的工程实践是基于类型进行逻辑分流,而非强行在单一流程中做条件聚合。
✅ 推荐方案:类型驱动的并行子流程(推荐初学者使用)
-
在Source后插入SelectOutputN(如SelectOutput5,可扩展至6路)
在其“Condition”字段中,为每条出口设置类型判断逻辑,例如:agent.patientType == 1 // 出口1 → 类型1患者 agent.patientType == 2 // 出口2 → 类型2患者 ... agent.patientType == 6 // 出口6 → 类型6患者
? 提示:确保patientType已在Agent类中正确定义为int或enum,并在Source的“Agent type”或“On startup”中正确赋值(如调用您图1中的分类函数)。
-
为每类患者配置独立子流程
每条出口后接:- Queue(可命名如 queue_type1)
- TimeMeasureStart(放置于Queue入口前)
- Service(复用同一资源,如machine,无需复制)
- TimeMeasureEnd(放置于Service出口后)
这样,每个TimeMeasureStart/End对会自动记录该类型患者的端到端服务等待时间(即Queue中排队时长 + Service内实际服务前等待时长,等价于标准“waiting time in queue”)。
-
启用并读取各类型统计结果
每个TimeMeasureEnd默认生成一个timeMeasureEnd_x.statistics()对象,其中:- timeMeasureEnd_1.statistics().mean() → 类型1平均等待时间
- timeMeasureEnd_2.statistics().mean() → 类型2平均等待时间
…以此类推。
可在实验(Experiment)的“After simulation run”中汇总输出:traceln("Type 1 mean wait: " + timeMeasureEnd_1.statistics().mean()); traceln("Type 2 mean wait: " + timeMeasureEnd_2.statistics().mean()); // 或写入Excel、数据库等
⚠️ 注意事项与进阶提示
- 资源复用无冲突:多个Service块可指向同一ResourcePool(如machine),AnyLogic自动协调资源占用,不会导致重复分配。
- 避免冗余建模:若仅需统计、不需可视化分流,也可用Enter+Exit配合collector收集事件时间戳,但代码复杂度显著升高,易出错。
- 验证分流完整性:在SelectOutputN的“Otherwise”出口连接Sink并启用traceln("Unrouted agent: " + agent.patientType),防止类型未覆盖导致流程中断。
- 性能考量:本方案内存开销极小(仅增加6个轻量级统计对象),远优于运行时遍历collection或dataset做条件过滤。
通过该结构化分流设计,您不仅能精准获取6类患者的平均队列等待时间,还可自然延伸分析各类型的最大等待、95%分位数、等待时间分布直方图等高级指标——所有统计均由AnyLogic底层高效完成,无需手动编码累加或同步。










