「项目将在 9 月 30 日完工。」这样的说法听起来很确定,但实际上从来都不是。蒙特卡洛模拟用一个诚实的表述取代了这种虚假的精确:「有 80% 的概率在 10 月 15 日前完工。」本指南讲解模拟如何运作,以及它为何优于关键路径。
估算是对未来的一种断言。「五天」听起来很精确,却隐瞒了一个事实:同样一项任务,在糟糕的日子里要花八天,在顺利的日子里只需三天。用一个固定值来规划,就是在用一种幻觉来规划。蒙特卡洛模拟认真对待这种幻觉,把波动一并算进来,而不是把它平均掉。
什么是蒙特卡洛模拟?
蒙特卡洛模拟 通过反复的随机抽样来刻画不确定性。它不是用一个固定值来计算,比如「这项任务需要五天」,而是用概率分布,并让模型运行上千次。每一次运行都从这些分布中抽取随机值。最终得到的不是单一估算,而是一系列可能结果的分布。
由此,核心表述发生了根本性的转变。「项目将在 9 月 30 日完工」变成了「有 80% 的概率在 10 月 15 日前完工」。这个区别是实实在在的。前者是一个您无法兑现的承诺,后者则是一个委托方真正可以据以规划的表述。
项目管理中的蒙特卡洛模拟:逐步讲解
在项目管理中,模拟遵循一个清晰的流程。我们逐步走一遍,从单个活动到最终的概率曲线。
第 1 步:每项活动都获得一个区间。 您不再估算单一数字,而是估算三个:乐观值(O),即一切顺利时;最可能值(M),即正常情况;悲观值(P),即出现阻碍时。模型由这三个点构建出一个 三点分布。大多数抽样落在 M 附近,少数落在两端。想更深入的人,会有意识地选择形状:PERT-Beta 更看重 M,三角分布更粗略,但更易于解释。
第 2 步:一次运行为每个工期掷骰子。 单次运行为每项活动从其分布中恰好抽取一个随机工期,并据此算出一个可能的项目完工时间。这是一个可能的未来,不是平均值,而是一个具体的情景,就像为整个项目掷一次骰子。有时算出 27 天,有时 31 天。单独来看,一次运行说明不了什么。它只是众多运行中的一个。
第 3 步:决定结果的是网络,而不是简单求和。 工期不会沿着一条线简单相加。网络图中的 依赖关系 决定了路径;在多条路径汇向的 里程碑 处,起决定作用的是最晚的那条,也就是最大值,而不是平均值。这就是路径汇聚:即使每一条路径单独来看大多准时,每增加一条路径,至少有一条迟到的概率就会上升。不妨想象一场接力赛,由最慢的跑者决定整体用时。
第 4 步:10,000 次运行得出概率。 现在您重复掷骰子,例如 10,000 次。每次运行给出一个完工日期,合在一起恰好构成上面那个分布。把这些日期按升序排列,就形成了累积 S 曲线,您可以从中读出各个置信水平。P80 的意思很简单:在 100 个模拟世界中有 80 个,您能在这个日期之前完工。直方图和 S 曲线是同一组数据的两种视角;当您要承诺一个日期时,最终依据的是 S 曲线。
蒙特卡洛为何优于关键路径
正是第 3 步中的路径汇聚,解释了经典的 关键路径 为何会系统性地低估项目工期。它用固定工期计算,只考虑最长的那条路径,却忽略了多个活动同时出问题的概率有多大。这使得日期比确定性计划所暗示的更为脆弱。
龙卷风图:敏感性分析
作为副产品,模拟还提供了一份敏感性分析。龙卷风图显示哪些活动对整体不确定性的贡献最大。这样,您的 风险管理 就知道该从何处入手,而不必同时在所有地方戒备。
不确定性的三大构成
在模拟之前,值得先看看心智模型。不确定性有三种,它们并不是蒙特卡洛中相互竞争、供您选择的变体。它们是三个来源,您要把这三者都建模,好的模型会覆盖全部三种。所以问题不是「我选哪种变体」,而是「我的项目中存在哪些不确定性,以及我如何分别刻画每一种」。
波动性:日常的波动
每项活动有时长一些,有时短一些。这就是那条正负 X% 的波动带,也就是经典的蒙特卡洛,每项活动都获得一个分布。在这里,您是有意识地同时拧动所有旋钮,而不是某一个。妙处在于,许多细小的波动会通过网络图逻辑累加起来,并在路径汇聚处被放大。
事件风险:离散的风险事件
供应商要么掉链子,要么不会。资源要么生病,要么没有。这不是「工期正负百分之十」,而是「以概率 p 发生事件 X,随后 Y 推迟 Z 天」。在这里,您不是在每个值周围放一条带子,而是在少数几个关键处放一个开/关开关:以概率 p 发生该事件,否则不发生。
结构风险:分支与重复
第三种来源不在于某项活动的工期长短,而在于它是否真的会如计划那样顺利完成。验收可能不通过,审批可能被驳回,检查步骤可能不达标。这时,活动不会在第一次尝试时就完成,而是会引出一条返工循环:一项在顺利的计划中根本不会出现的额外活动。事件风险延长的是一个已有的工期,而结构风险改变的则是网络图本身。
在模拟中,您把它刻画为一个概率性的分支:在每次运行中,一个随机开关以概率 p 决定是否插入带有自身工期分布的重复循环。在 10,000 次运行中,这会表现为分布右侧的第二个峰,正是返工风险的典型特征。而一个只知道顺畅流程的计划,恰恰会忽略这些情形。
最好的模型会把这三者结合起来:在所有活动上有一层基础波动,在真正可能翻盘的关键点上加上几个离散的风险开关,再在某个活动可能失败并触发返工之处加上一个分支。
相关性:把三者括在一起的边框
这三个构成要素很少彼此独立地起作用,上方图中的边框正说明了这一点。恶劣天气不会只延误一项户外活动,而是同时延误所有户外活动;一家不堪重负的供应商会波及每一笔订单,而不只是其中一笔。这就是 相关性:一个共同的驱动因素,会在同一次运行中把多个活动拉向同一个方向。
相关性并不是第四个构成要素,而是把这三者括在一起的边框。它决定了众多细小的波动究竟是相互抵消,还是彼此叠加放大。若把风险错误地建模为彼此独立,就会系统性地低估跨度,因为不相关的偏差在平均意义上会相互抵消,而相关的偏差不会。在实践中,这往往是通向一个现实的 P80 的最大杠杆。
蒙特卡洛模拟的调节旋钮
除了「我建模什么」这个问题之外,还有几条您确实需要做决定的轴。
每项活动的分布形状。 三角分布(O、M、P)简单、直观,非常适合用来讲解。 PERT-Beta 分布 更看重最可能工期,曲线也更平滑;它是项目管理中事实上的标准,也是我们的推荐。当您确实只知道最小值和最大值时,均匀分布更合适。对数正态分布适合那种向上拖着长尾的工期,因为任务很少会快很多,但有时会慢很多。
模拟的目标量。 最常见的问题是进度(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 的数据,模拟会可靠得多。
我需要考虑活动之间的相关性吗?
如果某个风险同时影响多项活动,例如恶劣天气波及所有户外作业,那么需要。不相关的偏差在平均意义上会相互抵消,而相关的偏差不会。忽略相关性的人,会低估跨度,从而低估进度风险。