CPM 计算方法
这是 PMGT1865(Project Time, Cost and Resources)期末前整理的 Week 2 和 Week 3 内容:CPM 和重叠网络。全文一条主线:画图,前推,后推,算 Float。
先记住这四句
- 前推求 ES、EF,后推求 LS、LF,最后用 LS − ES 求 Float。
- 前推遇到 merge(多个前置汇入)取最大,后推遇到 burst(多个后续分出)取最小。
- Float 为 0 的活动连成的链,就是关键路径。
- 重叠网络只是换了每条连接用的端点:关系名的两个字母,就是“用前置的哪个端点,去限制后续的哪个端点”。
1. CPM 的三步
| 步骤 | 规则 |
|---|---|
| 前推 Forward pass | 起点 ES = 0;EF = ES + 工期;后续的 ES 取所有前置 EF 的最大值 |
| 后推 Backward pass | 终点 LF = 项目 EF;LS = LF − 工期;前置的 LF 取所有后续 LS 的最小值 |
| Float | Float = LS − ES(也等于 LF − EF);Float 为 0 的链是关键路径 |
Float 要会用文字解释:
- 非关键活动的延误不超过 Float,项目总工期不变;
- 延误超过 Float 的部分,会推迟整个项目;
- 关键活动(Float = 0)延误 1 天,项目就延误 1 天。
Float 是可以推迟的时间,不是必须用掉的时间。
2. 例题 1:前推、后推、Float
A 3 天;B 4 天、C 6 天都在 A 之后;D 2 天在 B 之后;E 5 天在 C 之后;F 3 天,D 和 E 都做完才能开始。

图中蓝色是 ES / EF,绿色是 LS / LF,琥珀色是 Float,红框是关键活动。
前推:A 是 0–3;B 是 3–7;C 是 3–9;D 是 7–9;E 是 9–14。F 是 merge:D 的 EF 是 9,E 的 EF 是 14,取最大的 14,所以 F 是 14–17,项目工期 17 天。
后推:F 的 LF = 17,LS = 14;D 的 LF = 14,LS = 12;E 的 LF = 14,LS = 9;B 的 LF = 12,LS = 8;C 的 LF = 9,LS = 3。A 是 burst:B 的 LS 是 8,C 的 LS 是 3,取最小的 3,所以 A 的 LF = 3,LS = 0。
| 活动 | 工期 | ES | EF | LS | LF | Float |
|---|---|---|---|---|---|---|
| A | 3 | 0 | 3 | 0 | 3 | 0 |
| B | 4 | 3 | 7 | 8 | 12 | 5 |
| C | 6 | 3 | 9 | 3 | 9 | 0 |
| D | 2 | 7 | 9 | 12 | 14 | 5 |
| E | 5 | 9 | 14 | 9 | 14 | 0 |
| F | 3 | 14 | 17 | 14 | 17 | 0 |
结论:工期 17 天,关键路径是 A → C → E → F(3 + 6 + 5 + 3 = 17)。B 和 D 各有 5 天 Float,但它们在同一条支路上(4 + 2 = 6 天,比 C → E 那条支路的 11 天短 5 天),共用这 5 天,不是各 5 天。
3. 重叠网络:四种关系
前面所有箭头都是 FS(前一个做完,后一个才开始)。重叠网络再加入三种关系,每种都可以带 lag(用 LT 表示)。设 I 是前置活动,J 是后续活动:
| 关系 | 含义 | Forward 约束 | Backward 约束 |
|---|---|---|---|
| FS | I 做完,J 才开始 | ES(J) ≥ EF(I) + LT | LF(I) ≤ LS(J) − LT |
| SS | I 开始后,J 才能开始 | ES(J) ≥ ES(I) + LT | LS(I) ≤ LS(J) − LT |
| FF | I 做完后,J 才能做完 | EF(J) ≥ EF(I) + LT | LF(I) ≤ LF(J) − LT |
| SF | I 开始后,J 才能做完 | EF(J) ≥ ES(I) + LT | LS(I) ≤ LF(J) − LT |
记忆法:关系名的第一个字母是前置活动 I 的端点(Start 或 Finish),第二个字母是后续活动 J 的端点。FS 就是“用 I 的 Finish 去限制 J 的 Start”。
三个注意点:
- FF 和 SF 约束的是 J 的 EF,要再用
ES = EF − 工期换算成 ES。 - Lag 是两者之间至少要隔开的时间,不是“最多可以延迟”。
- 有多个约束时,前推先统一换成 ES 再取最大,后推先统一换成 LS 再取最小。
4. 例题 2:SS 和 FF
A 6 天;B 4 天,A → B 是 SS+2;C 3 天,A → C 是 FF+2;D 2 天,B → D 和 C → D 都是 FS。

前推:A 是 0–6。B:SS+2,ES = 0 + 2 = 2,EF = 6。C:FF+2,EF ≥ 6 + 2 = 8,所以 ES = 8 − 3 = 5。D:B 的 FS 要求 ES ≥ 6,C 的 FS 要求 ES ≥ 8,取 8,EF = 10。
后推:D 的 LF = 10,LS = 8;B 的 LF = 8,LS = 4;C 的 LF = 8,LS = 5。A 同时受两条连接限制:来自 B(SS+2)的 LS(A) ≤ 4 − 2 = 2;来自 C(FF+2)的 LF(A) ≤ 8 − 2 = 6,也就是 LS(A) ≤ 6 − 6 = 0。取最小,LS(A) = 0,LF(A) = 6。
| 活动 | 工期 | ES | EF | LS | LF | Float |
|---|---|---|---|---|---|---|
| A | 6 | 0 | 6 | 0 | 6 | 0 |
| B | 4 | 2 | 6 | 4 | 8 | 2 |
| C | 3 | 5 | 8 | 5 | 8 | 0 |
| D | 2 | 8 | 10 | 8 | 10 | 0 |
结论:工期 10 天,关键路径是 A → C → D,B 有 2 天 Float。检验:A 的 EF 6,加 FF 的 lag 2,再加 D 的 2 天,6 + 2 + 2 = 10。
如果所有箭头都按 FS 算,A → B → D 是 6 + 4 + 2 = 12 天,SS 和 FF 的重叠把工期缩短到 10 天。另外,重叠网络里关键路径不一定是最长的串联路径,要看每条连接是否“绷紧”,这里绷紧的是 A → C 的 FF+2。
5. 易错点
- merge 和 burst 记反:前推 merge 取最大,后推 burst 取最小。
- SS 用前置的 ES,FF 用前置的 EF,不要都当成 FS 来算。
- FF 和 SF 先求出 EF,再减工期得到 ES。
- 后推时同一个活动有多个后续,每条连接各算一个,统一成 LS 后取最小。
- Lag 是“至少隔开”,不是“最多可以延迟”。
- Float 公式是 LS − ES,不是 ES − LF。
- 排日期时第 1 天计入:8 天的活动从周一 17 Aug 开始,在周三 26 Aug 结束,后续活动从下一个工作日开始。
6. 自测
- 某活动 ES = 4,LS = 7,Float 是多少?它延误 2 天会影响项目工期吗?
- FF+3:前置 I 的 EF = 10,后续 J 工期 4 天,J 的 ES 和 EF 各是多少?
- A 有两个后续 B 和 C,都是 FS,B 的 LS = 8,C 的 LS = 5,A 的 LF 是多少?
答案:1. Float = 7 − 4 = 3,延误 2 天不超过 Float,不影响项目工期。2. EF(J) ≥ 10 + 3 = 13,ES(J) = 13 − 4 = 9。3. 取最小的 LS,LF(A) = 5。