AnyLogic生产模型如何排除排班空闲时间统计工单流程耗时与时间分布
AnyLogic排班场景下工单有效流转时长统计方案
方案1:使用内置时间测量组件(无代码,最简便)
- 在原材料入场节点后放置
Time Measure Start模块,在成品完工节点前放置Time Measure End模块 - 打开
Time Measure Start属性面板,找到仅在满足条件时计数(Count time only when)配置项,填入排班状态判断表达式:你的排班Schedule对象名.get() == 工作状态值,例如你用布尔值排班,工作时段返回true,就填workSchedule.get() == true - 组件会自动跳过非工作时段的时间,
Time Measure End模块输出的统计值就是剔除了空闲时间的有效流转时长,直接读取其mean()属性即可得到平均车间流转时长
方案2:调用Schedule内置计算方法(灵活可控)
- 在工单Agent中新增变量
enterTime,类型为double,原材料入场时赋值为当前模型时间:enterTime = time(); - 工单完工时,调用Schedule的
calculateDuration方法直接计算有效时长:// 方法参数说明:起始时间、结束时间、需要统计的Schedule状态值(即你定义的工作时段对应的值,比如1/true) double validFlowTime = workSchedule.calculateDuration(enterTime, time(), true); - 你提到的34小时总时长场景,该方法会自动扣除中间16小时非工作时段,直接返回约18的有效时长,无需手动计算跨班次扣除逻辑
- 将所有工单的
validFlowTime存入Statistics统计对象,读取其mean属性即可得到平均流转时长
方案3:自定义时间累加器(适配复杂特殊规则)
如果你的业务有额外的暂停统计规则(比如设备检修时段也需要剔除),可以用自定义变量实现:
- 在工单Agent中新增两个变量:
double validFlowTime = 0.0、double lastUpdateTime = 0.0 - 工单入场时初始化
lastUpdateTime = time() - 给排班Schedule添加状态变化触发动作:
- 从工作状态切换为非工作状态时,遍历所有在制工单,累加有效时长:
agent.validFlowTime += time() - agent.lastUpdateTime; - 从非工作状态切换为工作状态时,更新所有在制工单的
lastUpdateTime = time()
- 从工作状态切换为非工作状态时,遍历所有在制工单,累加有效时长:
- 工单完工时,如果当前处于工作时段,先补加当前段的有效时长:
validFlowTime += time() - lastUpdateTime;,再存入统计对象计算平均值
内容的提问来源于stack exchange,提问作者HARSH GOYAL
相关产品推荐
相关产品推荐

