项目管理中的蒙特卡洛模拟:让风险可见

「项目将在 9 月 30 日完工。」这样的说法听起来很确定,但实际上从来都不是。蒙特卡洛模拟用一个诚实的表述取代了这种虚假的精确:「有 80% 的概率在 10 月 15 日前完工。」本指南讲解模拟如何运作,以及它为何优于关键路径。

估算是对未来的一种断言。「五天」听起来很精确,却隐瞒了一个事实:同样一项任务,在糟糕的日子里要花八天,在顺利的日子里只需三天。用一个固定值来规划,就是在用一种幻觉来规划。蒙特卡洛模拟认真对待这种幻觉,把波动一并算进来,而不是把它平均掉。

什么是蒙特卡洛模拟?

蒙特卡洛模拟 通过反复的随机抽样来刻画不确定性。它不是用一个固定值来计算,比如「这项任务需要五天」,而是用概率分布,并让模型运行上千次。每一次运行都从这些分布中抽取随机值。最终得到的不是单一估算,而是一系列可能结果的分布。

由此,核心表述发生了根本性的转变。「项目将在 9 月 30 日完工」变成了「有 80% 的概率在 10 月 15 日前完工」。这个区别是实实在在的。前者是一个您无法兑现的承诺,后者则是一个委托方真正可以据以规划的表述。

9 月 30 日
一个估算。一个日期。虚假的确定性。
10,000 个模拟完工日期
P50
P80
P90
更早完工最可能的日期更晚完工
蒙特卡洛给出的不是单一日期,而是一个分布。P50、P80 和 P90 表示项目分别有 50%、80% 或 90% 的概率在何时之前完工。右侧的长尾就是您的进度风险。

项目管理中的蒙特卡洛模拟:逐步讲解

在项目管理中,模拟遵循一个清晰的流程。我们逐步走一遍,从单个活动到最终的概率曲线。

三个值,一个分布
O
M
P
更短工期更长
模型由 O、M 和 P 形成一个分布。大多数抽样落在 M 附近,少数落在两端。

第 1 步:每项活动都获得一个区间。 您不再估算单一数字,而是估算三个:乐观值(O),即一切顺利时;最可能值(M),即正常情况;悲观值(P),即出现阻碍时。模型由这三个点构建出一个 三点分布。大多数抽样落在 M 附近,少数落在两端。想更深入的人,会有意识地选择形状:PERT-Beta 更看重 M,三角分布更粗略,但更易于解释。

一次运行
运行 14 → 7 → 3 → 627 天
运行 25 → 6 → 4 → 831 天
运行 33 → 9 → 3 → 526 天
· · ·
每次运行为每项活动抽取一个工期,得出一个可能的完工日期。有时 27 天,有时 31 天。

第 2 步:一次运行为每个工期掷骰子。 单次运行为每项活动从其分布中恰好抽取一个随机工期,并据此算出一个可能的项目完工时间。这是一个可能的未来,不是平均值,而是一个具体的情景,就像为整个项目掷一次骰子。有时算出 27 天,有时 31 天。单独来看,一次运行说明不了什么。它只是众多运行中的一个。

路径的汇聚
路径 A
路径 B
里程碑

第 3 步:决定结果的是网络,而不是简单求和。 工期不会沿着一条线简单相加。网络图中的 依赖关系 决定了路径;在多条路径汇向的 里程碑 处,起决定作用的是最晚的那条,也就是最大值,而不是平均值。这就是路径汇聚:即使每一条路径单独来看大多准时,每增加一条路径,至少有一条迟到的概率就会上升。不妨想象一场接力赛,由最慢的跑者决定整体用时。

从运行到 S 曲线
P50 P80 P90
所有运行按升序排列。P80 表示:在 100 个模拟世界中有 80 个能在此之前完工。

第 4 步:10,000 次运行得出概率。 现在您重复掷骰子,例如 10,000 次。每次运行给出一个完工日期,合在一起恰好构成上面那个分布。把这些日期按升序排列,就形成了累积 S 曲线,您可以从中读出各个置信水平。P80 的意思很简单:在 100 个模拟世界中有 80 个,您能在这个日期之前完工。直方图和 S 曲线是同一组数据的两种视角;当您要承诺一个日期时,最终依据的是 S 曲线。

蒙特卡洛为何优于关键路径

正是第 3 步中的路径汇聚,解释了经典的 关键路径 为何会系统性地低估项目工期。它用固定工期计算,只考虑最长的那条路径,却忽略了多个活动同时出问题的概率有多大。这使得日期比确定性计划所暗示的更为脆弱。

龙卷风图:敏感性分析

作为副产品,模拟还提供了一份敏感性分析。龙卷风图显示哪些活动对整体不确定性的贡献最大。这样,您的 风险管理 就知道该从何处入手,而不必同时在所有地方戒备。

材料交付
主体结构
审批
内部装修
验收
更快中位数更慢
龙卷风图:活动按其对完工日期的影响排序。最大的杠杆位于顶部,那里最值得优先开展风险管理。

不确定性的三大构成

在模拟之前,值得先看看心智模型。不确定性有三种,它们并不是蒙特卡洛中相互竞争、供您选择的变体。它们是三个来源,您要把这三者都建模,好的模型会覆盖全部三种。所以问题不是「我选哪种变体」,而是「我的项目中存在哪些不确定性,以及我如何分别刻画每一种」。

相关性把三者耦合在一起
波动性
每项活动上的一个区间
事件风险
少数几处的一个开关
p = 15%
结构风险
检查点处的分支
p = 20%
波动性:每项活动上的一条波动带。事件风险:在少数关键处的一个开/关开关。结构风险:在检查点处插入返工循环的一个分支。好的模型会把这三者结合起来。环绕它们的边框就是相关性:一个共同的驱动因素,会在同一次运行中把多个来源拉向同一个方向。

波动性:日常的波动

每项活动有时长一些,有时短一些。这就是那条正负 X% 的波动带,也就是经典的蒙特卡洛,每项活动都获得一个分布。在这里,您是有意识地同时拧动所有旋钮,而不是某一个。妙处在于,许多细小的波动会通过网络图逻辑累加起来,并在路径汇聚处被放大。

事件风险:离散的风险事件

供应商要么掉链子,要么不会。资源要么生病,要么没有。这不是「工期正负百分之十」,而是「以概率 p 发生事件 X,随后 Y 推迟 Z 天」。在这里,您不是在每个值周围放一条带子,而是在少数几个关键处放一个开/关开关:以概率 p 发生该事件,否则不发生。

结构风险:分支与重复

第三种来源不在于某项活动的工期长短,而在于它是否真的会如计划那样顺利完成。验收可能不通过,审批可能被驳回,检查步骤可能不达标。这时,活动不会在第一次尝试时就完成,而是会引出一条返工循环:一项在顺利的计划中根本不会出现的额外活动。事件风险延长的是一个已有的工期,而结构风险改变的则是网络图本身。

在模拟中,您把它刻画为一个概率性的分支:在每次运行中,一个随机开关以概率 p 决定是否插入带有自身工期分布的重复循环。在 10,000 次运行中,这会表现为分布右侧的第二个峰,正是返工风险的典型特征。而一个只知道顺畅流程的计划,恰恰会忽略这些情形。

最好的模型会把这三者结合起来:在所有活动上有一层基础波动,在真正可能翻盘的关键点上加上几个离散的风险开关,再在某个活动可能失败并触发返工之处加上一个分支。

相关性:把三者括在一起的边框

这三个构成要素很少彼此独立地起作用,上方图中的边框正说明了这一点。恶劣天气不会只延误一项户外活动,而是同时延误所有户外活动;一家不堪重负的供应商会波及每一笔订单,而不只是其中一笔。这就是 相关性:一个共同的驱动因素,会在同一次运行中把多个活动拉向同一个方向。

相关性并不是第四个构成要素,而是把这三者括在一起的边框。它决定了众多细小的波动究竟是相互抵消,还是彼此叠加放大。若把风险错误地建模为彼此独立,就会系统性地低估跨度,因为不相关的偏差在平均意义上会相互抵消,而相关的偏差不会。在实践中,这往往是通向一个现实的 P80 的最大杠杆。

蒙特卡洛模拟的调节旋钮

除了「我建模什么」这个问题之外,还有几条您确实需要做决定的轴。

每项活动的分布形状。 三角分布(O、M、P)简单、直观,非常适合用来讲解。 PERT-Beta 分布 更看重最可能工期,曲线也更平滑;它是项目管理中事实上的标准,也是我们的推荐。当您确实只知道最小值和最大值时,均匀分布更合适。对数正态分布适合那种向上拖着长尾的工期,因为任务很少会快很多,但有时会慢很多。

同一组三元值,O 等于 3、M 等于 5、P 等于 13 天,依分布形状不同,会得出不同的工期期望值。
三角
简单、直观
(3 + 5 + 13) / 3= 7.0 天
PERT-Beta
标准之选
(3 + 4·5 + 13) / 6= 6.0 天
均匀
只知最小最大
(3 + 13) / 2,M 不计= 8.0 天
对数正态
长尾
中位数 5,向上拖尾均值 ≈ 6.5 天
针对同一个三点估算的四种分布形状。三角分布对三个值等权平均,PERT-Beta 最看重 M,均匀分布忽略 M,对数正态则因向上的拖尾把期望值拉高。

模拟的目标量。 最常见的问题是进度(Schedule Risk,进度风险):您何时完工。此外还有成本风险(Cost Risk):项目最终花费多少。两者可以耦合,因为延期会产生额外成本,比如违约金或仓储费。供应商比较这类问题恰恰需要回答它,在那里进度与价格相互权衡。

还剩第三条轴:这些分布的数字究竟从何而来,也就是输入不确定性。这里决定了模拟是建立在可靠的数据之上,还是建立在一种直觉之上。

输入不确定性从何而来。 最可靠的是经验数据,也就是经验频率,比如一段交付历史。其次是专家判断,也就是在没有数据时经典的 O/M/P 估计。还有 Merlin Project 的 计划/实际对比:Merlin 为每项活动同时保存计划值和实际值。在一个进行中的项目里,您可以从过往活动的偏差中测量出典型波动,而不必去估算它。这样,您的模拟便取材于真实的项目数据,并随着每一项活动的完成而变得更可靠。

深入了解

有一个进阶的调节项我们在这里有意略去,因为它会让一篇入门指南不堪重负:

  • 拉丁超立方抽样能更均匀地覆盖取值范围,因而比朴素的随机抽样收敛更快。维基百科文章 对此有很好的讲解。

从理论走向实践

长期以来,蒙特卡洛模拟既费力又只属于专业工具的领域,还要手工维护三点估算。借助 Merlin Project 中的 MCP 服务器,AI 直接读取您的项目计划,并按一句话的要求完成模拟。您只需一句话请 Claude 从您的计划中模拟 10,000 个项目进程,便能得到对带有 P50、P80 和 P90 的 S 曲线的解释。从前那个需要自行维护数据的专门工具,如今变成了对 Claude 说的一句话。

具体是什么样子,从设置、示例提示词到两个完整算过的案例,都在实践篇中展示:如何借助 Merlin Project 和 MCP 服务器进行蒙特卡洛模拟

结构化的风险管理在项目中有多值得,还可参见我们关于 Riskology 的文章,那是 Atlantic Systems Guild 的蒙特卡洛方法。

如果您对这篇博客文章有任何疑问或希望参与讨论,欢迎您在我们的论坛中发帖

常见问题

蒙特卡洛模拟需要多少次运行?

要让 P50、P80 和 P90 的数值稳定,实践中通常 5,000 到 10,000 次运行就足够了。增加运行次数会让曲线更平滑,但几乎不改变核心结论。

该选 PERT-beta 还是三角分布?

三角分布最容易解释;PERT-beta 对最可能值的权重更大,是项目管理中事实上的标准。拿不准时就用 PERT-beta。

我该承诺 P50、P80 还是 P90?

P50 是一个五五开的日期,更适合内部计划。对外做可靠承诺时,请根据风险偏好和违约金沟通 P80 或 P90。

蒙特卡洛与关键路径有什么区别?

关键路径使用固定工期,由于路径汇聚会系统性地低估项目工期。蒙特卡洛把离散度纳入计算,给出的是一个概率,而不是单一日期。

做蒙特卡洛模拟需要历史数据吗?

不需要。您可以从乐观值、最可能值和悲观值这样的专家估计开始。但若使用真实的计划/实际数据,例如来自 Merlin Project 的数据,模拟会可靠得多。

我需要考虑活动之间的相关性吗?

如果某个风险同时影响多项活动,例如恶劣天气波及所有户外作业,那么需要。不相关的偏差在平均意义上会相互抵消,而相关的偏差不会。忽略相关性的人,会低估跨度,从而低估进度风险。

规划项目, 让计划真正奏效。

一款管理项目计划的应用,在所有 Apple 设备上原生运行。