如何在AnyLogic中合并状态图与流程?流程调用异常及返回问题排查
问题分析与解决方案
1. 仅首个人员进入流程的问题
你在Pharmacy状态中调用enter1.take(this)导致只有第一个人能进入流程,核心原因是:
- 默认情况下,流程的
Seize块(即你说的enter1)容量为1,后续人员无法被接纳。 - 直接在状态图的状态内调用
take(this),无法保证每个到达的Person都能触发该动作。
解决方法:
- 调整
enter1(Seize块)的Capacity参数,设置为实际药房窗口数,或直接设为Infinite。 - 把
enter1.take(this)的调用移到Person到达Pharmacy的触发逻辑中:比如在GIS区域的on enter事件,或者状态图中“到达Pharmacy”的转移动作里,确保每个Person到达时都会执行该调用。
2. 从流程返回状态图的逻辑修正
你当前的转移弧设置存在逻辑缺陷:直接从Pharmacy状态到家的转移没有触发条件,会导致Person还没完成服务就直接离开,同时流程和状态图的衔接断裂,Person进入流程后无法回到状态图。
正确实现步骤:
- 在流程的Exit块(最后一个节点)的
on exit事件中,给当前Person发送触发信号:send(this, "serviceFinished")。 - 在Person的状态图中,给Pharmacy状态添加一条事件触发的转移弧:触发事件选择
serviceFinished,目标状态设为“前往家”的状态或直接到家的状态。 - 删除原来无触发条件的Pharmacy到家的转移弧,避免提前触发。
3. 统计指标的实现建议
- 队列长度:直接调用流程中Queue块的
size()属性,或Seize块的queue.size(),将数值绑定到仪表盘或存入数据集。 - 设施利用率:使用Seize块的
utilization()方法直接获取,或自行计算:(所有Person的服务时长总和) / (模拟总运行时间)。 - 系统停留时间:给Person添加两个变量
arrivalTime和departureTime,到达药房时记录arrivalTime = time(),离开流程时记录departureTime = time(),计算差值departureTime - arrivalTime并收集到数据集做统计。
内容的提问来源于stack exchange,提问作者Morshed Dolon
相关产品推荐
相关产品推荐

