第一次接触医院流程优化是在三年前,当时我参与了一个三甲医院的门诊改造项目。早上8点的门诊大厅永远人满为患,自助挂号机前队伍比人工窗口还长,内科诊室门口挤满了人而外科医生却在喝茶。院方尝试过增加设备和人员,但效果总是不理想。直到我们用Anylogic建了个仿真模型,才发现问题根本不在资源数量上。
医院门诊是个典型的复杂动态系统:患者到达随机、服务时间不确定、资源分配存在耦合。传统Excel表格或数学公式很难准确模拟这种多因素交互的场景。而仿真建模可以:
举个真实案例:某医院将自助机从5台增加到10台后,挂号等待时间反而更长了。仿真显示是因为引导标识不足,导致患者在不同区域反复走动。这个反直觉的结论只有通过动态仿真才能发现。
打开Anylogic时,建议先画个简单的流程图。门诊核心流程就三步:到达→挂号→就诊。对应到模型里:
java复制// 设置到达速率为每小时120人
source.set_rate(120/60.0);
java复制// 设置60%选择自助机,40%选人工窗口
selectOutput.set_probability(0.6, 0.4);
新手常犯的错误是直接开始拖模块。我建议先在纸上画出类似这样的草图:
code复制患者到达 → [挂号选择] → 自助机(60%)
↘ 人工窗口(40%)
到达模式的设置直接影响模型真实性。多数医院都有明显的就诊高峰:
在Anylogic中可以用**时间表(Timetable)**实现:
挂号时间的设置更有讲究。实测数据显示:
对应的Anylogic代码:
java复制// 自助机延迟时间(三角分布)
delay.set_delayTime(triangular(0.5, 1, 1.5));
// 人工窗口延迟时间(正态分布)
service.set_serviceTime(normal(3, 0.5));
人工窗口的核心瓶颈在于人力资源。我们遇到过这样的情况:上午配置3个窗口员,下午减到2个,但模型显示这样会导致下午等待时间激增。解决方案是:
java复制// 早班(8:00-12:00)3人
resourcePool.set_capacity(3, 8*60, 12*60);
// 午班(12:00-17:00)2人
resourcePool.set_capacity(2, 12*60, 17*60);
更复杂的场景可以引入技能等级。比如:
基础模型用固定概率分流,但真实场景更复杂。我们可以通过条件分流实现:
java复制// 老年患者优先人工窗口
if(agent.age > 60)
selectOutput.set_condition(true, false);
java复制// 当自助机队列>5人时引导至人工窗口
selectOutput.set_condition(queue.size()>5, false);
最近一个项目还加入了实时调度算法:当外科候诊超过30分钟时,自动调配内科医生支援。这在Anylogic中需要用自定义Java代码实现。
好的可视化能让抽象数据一目了然。我的经验是:
java复制// 显示当前等待人数
text.setText("等待人数:" + queue.size());
Anylogic的3D库有很多现成素材:
有个实用技巧:给不同患者类型设置不同外观。比如:
java复制// 内科患者显示为红色
person_3d.set_color(agent.type==1 ? "red" : "blue");
我们通常监控这些核心指标:
在Anylogic中设置数据收集:
java复制// 在Sink模块记录停留时间
agent.timeStay = time() - agent.arrivalTime;
导出到Excel后,我习惯用帕累托分析找出关键瓶颈。比如某次分析显示:
基于这些数据,我们建议:
用同样的模型测试不同改进方案:
对比各场景下的指标变化,选择性价比最高的方案。记得运行至少100次仿真消除随机误差。
最后分享一个踩过的坑:有次模型显示增加诊室能缩短等待时间,实际改造后效果却不明显。后来发现是走廊宽度不足导致人流堵塞。现在建模时一定会考虑空间约束因素。