交互式图论学习
交互式图论学习
Guest User
Using app without sign in
图论学习资料
即时下载 · 终身使用
需要一对一帮助?
围绕关键路径法 (CPM)的一对一辅导,适用于课程学习、面试准备或优化项目。
关键路径计算器
识别项目进度表中依赖任务的最长序列,确定完成项目的最短可能时间。
选择算法并生成步骤以开始可视化
关键路径法(CPM)在项目网络中找出最长的一串相互依赖的活动,它决定了项目的最短工期。位于该关键路径上的活动没有浮动时间:它们的任何延误都会拖延整个项目。
项目被建模为带工期的活动有向无环图。按拓扑顺序的前向遍历计算每个活动的最早开始与结束;后向遍历计算不拖延项目的最晚时间。最晚开始与最早开始之差是活动的浮动时间,浮动为零的活动构成关键路径。两次遍历都运行在 O(V + E)。
CPM 为建筑工程、软件发布、制造换型和活动策划排程。Primavera 和 Microsoft Project 等项目管理工具持续计算关键路径。它也是 DAG 中最长路径和拓扑排序的教科书应用。
按拓扑序对活动网络做两趟扫描:正向求每项任务最早可能发生的时刻,反向求在不推迟项目的前提下它最晚可以发生的时刻。
CPM(活动集, 依赖集):
顺序 = 拓扑排序(活动集)
// 正向扫描:最早开始与最早结束
对 顺序 中的每项活动 a:
ES[a] = max(EF[p],p 为 a 的前驱),否则为 0
EF[a] = ES[a] + 工期[a]
T = max(EF[a],遍历所有 a) // 项目总工期
// 反向扫描:最晚开始与最晚结束
对 逆序(顺序) 中的每项活动 a:
LF[a] = min(LS[s],s 为 a 的后继),否则为 T
LS[a] = LF[a] - 工期[a]
时差[a] = LS[a] - ES[a]
关键路径 = 时差为 0 的活动关键路径是网络中最长的那条路径而不是最短的,这使它成为 DAG 上的最大化问题,而不是最短路径问题。由于网络无环,这两趟扫描不过是按拓扑序进行的动态规划,完全不需要优先队列。时差为零意味着该活动没有任何回旋余地:把它推迟一天,整个项目就顺延一天。
为一个四活动项目排期,其中两项任务可以并行,但都必须完成之后第三项才能开始。
示例图: 活动及工期为 A(3 天)、B(2 天)、C(4 天)和 D(2 天)。依赖关系:A 与 B 都必须先于 C,C 又先于 D。
项目历时 9 天,关键路径是 A 到 C 到 D。B 拥有一天的机动,也就是说它可以晚一天开始或者超期一天而不影响完工日期。这正是它的实用价值:它明确告诉管理者应当把注意力放在哪里。压缩 B 毫无意义,而压缩 A、C 或 D 中的任何一项都能缩短整个项目,至少在关键路径转移到经由 B 之前是如此。
时间: O(V + E) · 空间: O(V)
一次拓扑排序的代价是 O(V + E),而两趟扫描各自访问每项活动一次、每条依赖边一次,因此也都是 O(V + E)。空间是每项活动四个数字,即最早与最晚的开始和结束,也就是 O(V)。整个方法是线性的,因此它能扩展到包含数十万项活动的项目网络。依赖网络必须是有向无环图:循环依赖不存在拓扑序,相应地也就没有任何合法排期,因此环检测是一项真正的前置条件而非形式。
CPM 假定工期已知且资源无限。放松其中任何一条假设,问题就变了。
| 替代算法 | 以下情况更合适 | 代价 |
|---|---|---|
| PERT | 工期不确定。用三点估计给出期望工期和一个概率分布。 | O(V + E) |
| RCPSP | 资源有限,活动之间要相互竞争而不能自由并行。NP 困难。 | 指数级 |
| 拓扑排序 | 你只需要一个合法的执行顺序,不需要时刻和时差。 | O(V + E) |
| DAG 上的最长路径 | 用图论语言表述的同一个计算。CPM 正是把活动工期当作权重的这个问题。 | O(V + E) |
| 压缩分析 | 你想缩短项目,需要找出代价最低的一组待加速活动。 | 线性规划 |
相关算法: 计划评审技术 (PERT), 资源受限项目调度 (RCPSP), 拓扑排序