用于流程的 Monte Carlo 仿真:它能做什么以及什么时候会误导
Monte Carlo 模拟对同一流程进行数百次运行,运行时随机抽取持续时间和数量,并对结果分布进行评估。与单一的“6,4 天”通行时间相比,您会得到一个区间(例如 P10 4,1 到 P90 11,8 天),从而得到在实际运行中可靠的结论。当运行次数不足、对明显偏斜的持续时间误用对称分布、忽略输入之间的依赖关系或将预热阶段纳入统计时,结果会产生误导。
Inhaltsverzeichnis
“Monte-Carlo” 听起来比实际复杂,但这正好好,因为该方法异常简明。这就是有系统的掷骰子。
这个方法用四句话说明
您不是说明某一步持续 10 分钟,而是说明它在 5 到 20 分钟之间,大多数情况下为 8 分钟。计算机会让一个流程项通过该流程,并在每一步从该区间随机抽取一个时长。然后它用一整天的流程项重复这个过程,重复数百次。最后它得到的不是一个通过时间,而是数百个通过时间,并由此得到一个分布。
就是这些。不是宇宙的模型,也不是人工智能。只是拒绝假装世界是精确的。
为什么流程需要这种方法
显而易见的反对意见是:如果我知道均值,为什么不直接用均值来计算?
因为流程是非线性的。两个例子可以立刻说明:
排队。 一步 85% 的利用率会产生相当于其处理时间 5.7 倍的等待时间;当利用率为 95% 时,等待时间是 19 倍。如果您的一天内利用率在 70% 到 100% 之间波动,这些等待时间的平均值不是中间利用率时的等待时间。实际要显著更多。(具体计算方法见 Engpass berechnen。)
最长的路径获胜。 如果两个并行支路都必须完成,则总耗时为两者的最大值,而最大值的期望大于期望的最大值。用均值计算的项目计划因此系统性地过于乐观。
两者合起来就是詹森不等式,通俗称为“Flaw of Averages”。Monte Carlo 避开了这个问题,因为它根本不先求平均,而是先计算,然后再评估。
您需要输入什么
| 说明 | 为什么需要 | 如果缺失 |
|---|---|---|
| 到达率与分布 | 产生负载 | 排队要么永远不会发生,要么总是发生 |
| 每步持续时间作为区间 | 驱动等待时间 | 结果系统性偏优 |
| 每个角色或池的容量 | 产生限制 | 没有利用率、没有排队 |
| 分支比例 | 分配数量 | 后续步骤的数量错误 |
| 日历与班次 | 使等待时间真实 | 等待时间低估约 3 倍 |
最常见的缺口是最后一项。没有日历的话,周五 16:50 到达的流程项会等待十分钟;有日历的话,它会等到周一。
要跑多少次?
这个问题总会被问到,答案令人不满意:直到结果不再变化为止。
实务上的经验:
- 100 次 足以看出哪个步骤是瓶颈。步骤的排序在数值稳定之前就已经稳定了。
- 500 到 1000 次 需要得到可靠的分位数,尤其是 P90,因为它本质上依赖于罕见事件。
- 超过 5000 次 在此类流程中几乎从不带来额外见解,只有更多计算时间。
您可以自己检验:用不同的起始种子运行同一模型两次。如果结果明显不同,则运行次数不足。
哪种分布?
大多数人在这里犯第二个错误。处理时间几乎从不对称:一个流程项不可能比“非常快”更快,但可以任意慢。因此分布通常在右侧有长尾。
- 三角分布(最小值、最可能值、最大值)对大多数行政流程完全足够,且优点是这三个值可以在研讨会上询得。
- 对数正态分布 更好地描述右侧长尾,当异常值决定流程表现时应选用它。
- 正态分布 几乎总是错误的。它是对称的,并允许负时长。
经验法则:如果不确定,就用三角分布,并将结果以区间形式呈现。分布的选择会移动分位数,但几乎不会改变哪个步骤是瓶颈。
使结果毫无价值的四个错误
1. 运行次数太少。 可通过两次运行得到不同答案来识别。两分钟即可检验。
2. 对偏斜时长使用对称分布。 导致 P90 明显偏低,也就是您应该用于计划的值被低估。
3. 忽略相关性。 如果一个复杂案例在每一步都比普通情况花更长时间,则各步时长是相关的。将每个时长独立随机抽取的模型会消除该效应并低估波动。解决方法:分离流程项类型并分别建模,而不是对所有情况使用一个很宽的分布。
4. 将预热阶段计入评估。 在一次运行开始时系统是空的,没有排队且通过时间很短。将这一阶段计入会用一种在实际运行中从不出现的状态稀释结果。
如何阅读结果
Monte-Carlo 评估不只给出一个数,而至少给出三个:
- P10: 有利情况。大约每十个周期中会出现一次这样的好结果。
- P50: 中位数。半数情况低于它。
- P90: 不利情况。用它来规划容量,而不是用均值。
把结果再缩减为单一数值的人就白做了。区间本身就是结果。如何解读以及 P50 如何误导,见 P10, P50, P90 richtig lesen。
Monte-Carlo 做不到的事
它不能把糟糕的输入变好。如果您的数量是猜的,结果也是猜的,仅仅带了小数位。这正是该方法的真正危险:它会产生比数据基础所支持更多的信任。
因此每份评估的文档里应包含三项说明:哪些输入是测量得到的、哪些是估计的,计算了多少次运行,以及使用了哪个起始种子。 缺少这些说明,结果就不可复现。而不可复现的结果在有疑问时就毫无价值。
FlowVisual 就是这样计算并把种子与运行次数打印到手册里。不是出于拘泥,而是因为一个无法复现的数字不应出现在决策材料中。
常见问题
一个流程模型需要多少次 Monte Carlo 运行?
要判断哪个步骤是瓶颈,大约 100 次运行就足够。排序很早就会稳定。要得到可靠的分位数,特别是 P90,应为 500 到 1000 次。是否足够,您可以通过使用不同的起始种子再次运行同一模型来检查:如果结果明显不同,则次数不足。
哪种分布适用于处理时长?
在大多数行政流程中,最合适的是由最小值、最可能值和最大值构成的三角分布。这三个值可以在研讨会中询问得到。在离群值主导流程的情况下,对数正态分布更合适。正态分布几乎总是错误的,因为它是对称的并允许负持续时间。
Monte Carlo 是否等同于离散事件仿真?
不是,这两者互为补充。离散事件仿真会让单次运行发生:任务到达、等待、被处理。Monte Carlo 则是将该单次运行用新抽取的随机值重复多次,并分析结果分布。
为什么必须记录种子?
因为无法复现的结果在决策文档中没有位置。使用相同的起始种子和相同的运行次数,任何人都会得到相同的数字,并能检查差异是由假设变化还是仅由随机性造成。
在您自己的流程上进行计算验证
FlowVisual 会把本文中的数字变成一个可运行的模型,使用您的数量、您的产能、您的利润率。
Guide: seven steps to the number