欢迎来到关键路径分析(CPA)!

你好,未来的项目经理们!这一章——关键路径分析(Critical Path Analysis, CPA),是决策数学(Decision Mathematics)中最实用、最吸引人的主题之一。它的核心在于如何高效地规划复杂的项目。

如果一开始觉得网络图很吓人,别担心。我们将把项目规划拆解为简单的步骤:梳理任务、计算最早和最晚时间,以及找出至关重要的瓶颈活动。读完这些笔记,你将掌握完成任何项目的最快方法!

什么是关键路径分析?

  • CPA 是一种强大的数学工具,用于规划、安排和控制大型项目(例如建造摩天大楼、发射卫星,甚至是筹备一场大型演唱会)。
  • 其主要目标是确定完成整个项目所需的最短时间,并识别出那些绝对必须按时完成的关键活动。

第 1 节:基础知识——活动与优先顺序

1.1 活动与优先顺序表

一个项目由若干个独立的活动(Activities)(即任务)组成,每个活动都需要一定的时长(持续时间),并且必须按特定的顺序完成。

这种任务执行顺序被称为优先顺序(Precedence)。例如,在砌好墙(活动 A)之前,你无法粉刷墙壁(活动 B)。

我们使用优先顺序表(Precedence Table)来列出所有活动、它们的持续时间以及它们所依赖的前置活动。

核心术语:
  • 活动 (Activity):需要时间和资源的任务(例如:挖掘地基)。
  • 持续时间 (Duration):完成该活动所需的时间(例如:5 天)。
  • 紧前活动 (Immediate Predecessor):在开始当前活动之前必须完成的活动(或多个活动)。

类比:想一下上学前的准备工作。在穿上鞋子(活动 C)之前,你必须先穿上袜子(活动 B)。活动 B 就是活动 C 的紧前活动。

1.2 活动网络图(AOA 图)

为了进行 CPA 计算,我们将优先顺序表转化为一张图,称为活动网络图(Activity Network)。在 D1 课程中,我们通常使用箭线图法(Activity on Arc, AOA)

在 AOA 图中:

  • 任务(活动)由箭线(arcs)表示,持续时间写在箭线旁边。
  • 箭线的起点和终点被称为节点(nodes)(或事件)。节点代表一个时间点,在该时间点,一个或多个活动已经完成,其他活动可以开始。

规则 1:开始与结束
每个项目都从唯一的源节点(source node)(节点 1)开始,并以唯一的汇点(sink node)结束。

规则 2:节点唯一性
每个活动必须拥有唯一的起点节点和唯一的终点节点。任何两个活动不能拥有完全相同的起点和终点。

第 1 节要点总结

网络图就是你的地图。活动是旅程(箭线),而节点是重要的里程碑(事件)。画图时,我们必须严格遵循优先顺序规则。


第 2 节:令人头疼的虚活动(Dummy Activities)

这是画网络图时最棘手的部分,但只要记住它们存在的两个主要原因,你就能轻松搞定!

2.1 什么是虚活动?

虚活动(Dummy Activity)在网络图中用虚线箭线表示。

  • 它的持续时间为零。它代表逻辑依赖关系,而不是一项耗时的任务。
  • 虚活动的存在是为了确保网络图符合绘图规则。

2.2 何时使用虚活动?

引入虚活动主要有两个原因:

原因 1:保持节点唯一性(规则 2)

如果活动 A 和活动 B 都从节点 1 开始并结束于节点 2,这就违反了规则 2(两个活动共享相同的起点和终点节点)。

解决方法:我们必须引入一个虚活动,在逻辑上将它们分开。

原因 2:表示复杂的依赖关系

这是最常见的使用场景。当一组活动只依赖于先前完成活动中的一部分,而非全部时,就需要使用虚活动。

示例:

活动紧前活动
A-
B-
CA
DA 和 B

看看这个表:

  • 活动 C 仅依赖于 A。
  • 活动 D 依赖于 A B。

如果 A 和 B 都从节点 1 开始并在节点 2 会合,那么 C 和 D 看起来都依赖于 A 和 B 在节点 2 的完成。这对于 C 来说是错误的!

解决方法:我们需要拆分依赖关系。从 A 的终点画一条虚线到 B 的终点(或反之),这样 D 就可以依赖于两个终点节点,而 C 则只依赖于 A 的终点节点。


记忆小贴士:如果你发现画出了两个起点/终点完全一样的活动,或者依赖关系无法通过逻辑流直接画出,就考虑虚活动吧。

避坑指南!

千万不要把虚活动(逻辑连接,虚线,时长为 0)与普通活动(实际任务,实线,时长 > 0)弄混了。


第 3 节:时间计算——正向推导与反向推导

一旦正确画好了网络图,我们就可以通过每个节点上的特殊方框,计算出每个事件的最早时间和最晚时间。

这个方框通常长这样:

\[\n \begin{array}{|c|c|}\n \hline\n \text{EST} & \text{LST} \\\n \hline\n \end{array}\n \]

  • EST (Earliest Start Time):离开该节点的活动的最早开始时间。
  • LST (Latest Start Time):离开该节点活动的最晚开始时间(或者进入该节点活动的最晚完成时间)。

3.1 正向推导(计算最早时间)

我们从节点 1 开始向前遍历网络,计算出每个事件可能发生的最早时间。

计算公式: \[\n \text{EST}_{\text{下一节点}} = \text{EST}_{\text{当前节点}} + \text{活动持续时间}\n \]

正向推导步骤:
  1. 起始节点(节点 1):EST 始终为 0。
  2. 向前移动:对于每个离开节点的活动,将当前节点的 EST 加上活动持续时间,计算出该活动的完成时间。
  3. 取大原则(Maximum Rule):当一个节点有多个进入活动时,该节点的 EST 取所有进入时间中的最大值

    为什么是最大值?因为该事件(节点)只有在进入该节点的所有活动中最后一个完成时才能发生。如果三个任务分别在时间 5、8、10 完成,那么下一阶段最早只能在时间 10 开始。

  4. 最终汇点的 EST 即为整个项目的最短完成时间

3.2 反向推导(计算最晚时间)

我们从最后一个节点(汇点)开始向后遍历网络,计算出每个事件在不推迟整个项目的前提下,最晚可以发生的时间。

计算公式: \[\n \text{LST}_{\text{当前节点}} = \text{LST}_{\text{下一节点}} - \text{活动持续时间}\n \]

反向推导步骤:
  1. 起始节点(最终节点):将 LST 设置为等于 EST(即最短完成时间)。
  2. 向后移动:对于每个进入节点的活动,从下一节点的 LST 减去活动持续时间,计算出该活动的最晚开始时间。
  3. 取小原则(Minimum Rule):当一个节点有多个离开活动时,该节点的 LST 取所有计算出的最晚开始时间中的最小值

    为什么是最小值?该事件(节点)必须在离开该节点的所有活动中最早要求的开始时间之前完成。如果离开该节点的活动分别要求在时间 12、15、18 前开始,你必须在时间 12 前完成,否则就会推迟第一个活动。

速查表:计算规则

正向推导:从 0 开始,向前走,节点处取最大值 (MAX)
反向推导:从项目总时间开始,向后走,节点处取最小值 (MIN)


第 4 节:关键路径与总浮动时间

现在我们有了每个节点的最早和最晚时间,就可以识别项目中最重要的部分了。

4.1 关键路径

关键路径(Critical Path)是从起始节点到终点节点的一系列活动序列,它决定了项目的最短总完成时间。

它是网络中最长的路径

如何确定关键活动:

当且仅当某活动的延迟会导致整个项目延迟时,该活动才是关键活动

在网络图中,关键路径上的活动,其起点和终点节点的 EST 和 LST 分别相等。

$$ \text{关键活动条件:} \quad \text{EST}_{\text{起点节点}} = \text{LST}_{\text{起点节点}} \quad \text{且} \quad \text{EST}_{\text{终点节点}} = \text{LST}_{\text{终点节点}} $$

小贴士:关键路径通常用双线画出或重点高亮,以便在最终答案中清晰呈现。

4.2 总浮动时间(Total Float)

并非所有活动都是关键的。非关键活动拥有一些空余时间,这被称为浮动时间(Float)

总浮动时间(Total Float)是指在不影响项目整体最短完成时间的前提下,一个活动可以被推迟的最长时间。

计算总浮动时间 (\(F\))

浮动时间是针对单个活动(箭线)计算的,而不是针对节点。

设 \(D\) 为活动的持续时间。

方法 1:使用完成时间 (EFT 和 LFT) $$ F = \text{最晚完成时间 (LFT)} - \text{最早完成时间 (EFT)} $$ 其中 \(EFT = EST_{\text{起点节点}} + D\)。
其中 \(LFT = \text{LST}_{\text{终点节点}}\)。

方法 2:使用开始时间 (EST 和 LST) $$ F = \text{最晚开始时间 (LST)} - \text{最早开始时间 (EST)} $$ 其中 \(LST = \text{LST}_{\text{终点节点}} - D\)。
其中 \(EST = \text{EST}_{\text{起点节点}}\)。

方法 3(最常用): $$ F = \text{LST}_{\text{终点节点}} - \text{EST}_{\text{起点节点}} - \text{持续时间} $$

重要提示:如果一个活动的总浮动时间为 0,意味着它是一个关键活动。它没有任何空余时间。

冷知识:

浮动时间对于资源平衡(resource levelling)至关重要。如果你有两个非关键活动竞争同一个有限资源(例如某位专业工程师),你可以利用浮动时间将其中一个活动安排在稍后进行,从而避免冲突。

4.3 解读与总结

  • 最终节点上计算出的数字(EST/LST)即为项目最短工期
  • 关键路径识别出必须严密监控的活动。任何这里的延迟都会导致整个项目延迟。
  • 拥有较大总浮动时间的活动在日程安排和资源配置上具有更大的灵活性。
最后鼓励

CPA 是逻辑与计算的完美结合。清晰地画出你的网络图,耐心地进行正向和反向推导(特别是要盯着 MIN 和 MAX 规则),你一定能掌握这一章!多加练习那些棘手的虚活动情形,直到它们变成你的肌肉记忆。祝你好运!