关键路径法 Critical Path Method

CPM (Critical Path Method) 关键路径法,是一种构图方法,主要用於确定专案执行任务的关键路径,其中【关键路径】是整个专案从开始到结束必须完成的最长任务路径。

【关键路径】这对专案评估者来说很重要,因为路径上碰到任何问题都会阻挠专案项目前进而导致延迟; 一个项目可以有多个关键路径,而使用 CPM 方法很常与 PERT 一起使用 (PERT 图中都有评估时间)。

CPM 目标

  1. 确定在关键路径上每个任务要花的时间
  2. 防止进度延误

如 PERT 图绘制时相同,每个任务的时间都会被确定下来,如下图 [1]:

https://ithelp.ithome.com.tw/upload/images/20211005/20092753rdj4OiS7If.png

根据 1 所告知的 CPM 关键步骤是 (与 PERT 图几乎相同):

  1. 列出所有任务
  2. 确定任务执行顺序
  3. 绘制有箭头的网路图
  4. 确定每个活动的时间
  5. 确定活动之间的依赖关系
  6. 找到关键路径
  7. 随着专案变化更新网路图

解释

对於 CPM 的术语有以下几个对照解释:

*任务持续时间: 通常一个任务【允许】、【差不多】做多久,可能会与有多少资源、整体还有多少任务,总无法一个任务做了一年都还没有结果。

最早开始时间 (Earliest start time, ES): 该项目可以开始任务的最早时间,需要弄清楚是否有前置任务或其他开始条件,才能确定这点。

最晚开始时间 (Latest start time, LS): 必须开始任务的最後时间 (再不开始就完蛋了)。

最早完成时间 (Earliest finish time, EF): 参考任务持续的时间以及最早开始的时间,评估最快什麽时候完成。

最晚完成时间 (Latest finish time, LF): 参考任务持续时间以及最晚开始的时间,评估最慢什麽时候完成。

浮动时间 (Float or Slack): 浮动时间的意思是一个宽松、允许任务延迟的时间,你可能可以把这个任务推到多久之後才做的时间; 可以根据上述的时间来评估浮动时间。

崩溃任务持续时间 (Crash duration): 执行任务的最短工期,崩溃任务持续时间代表的是每个任务的最短持续时间 (至少要做 x 小时/天),执行资源(包含人力) 越少,崩溃成本就越高 (只有一个人做的工作,跟有 10 个人做的工作,大致上时间不一样)

关键路径拖曳 (Critical Path DRAG (Devaux's Removed Activity Gauge)): 如果把约束(条件) 加入到工作项目导致任务受到约束而要花费的时间

计算关键路径的方法

  1. 建立一个 PERT 图
  2. 把 PERT 图每块都简化成一个节点

https://ithelp.ithome.com.tw/upload/images/20211005/20092753WTGeNZph2D.png

  1. 把 PERT 图任务制作成一张表 (可根据之前文章中使用的 PERT 计算表,把预期时间直接列成一张表)

https://ithelp.ithome.com.tw/upload/images/20211005/20092753YsvgGb621g.png

上面至少都要包含活动对应的简写、详细名称、前置任务、预期时间,像是下图 [4]:

https://ithelp.ithome.com.tw/upload/images/20211005/20092753Eqw1cM81RE.png

假设你已经有上面图中这张表,那就把对应的 TaskID, Task Duration 填上节点位置,画出来,而且把前置任务彼此连接 (Task Predecessors),如下图 [4]。

https://ithelp.ithome.com.tw/upload/images/20211005/20092753pLB4BzEidj.png

并且,每一个物件的左右边都有 ES, EF,这代表你需要填上 ES (最早开始时间), EF (最晚开始时间) ,请参考上述定义。

https://ithelp.ithome.com.tw/upload/images/20211005/200927531NyDla9mOJ.png

填上时间後,会得到下图,如果有两个前置任务,像是 D, E,他们的前置任务是 B, C,会依照前任务最晚的那个 EF (最晚完成时间) 当作 D, E 的 ES (最早完成时间),所以 D, E 的 ES 是根据 B, C 选一个最大 EF 的人当作他们 (D, E) 的 ES 时间。

https://ithelp.ithome.com.tw/upload/images/20211005/20092753DSR9EDZ97m.png

每个任务的 EF 会由他的最早开始时间和持续时间 t 给出,所以 EF = ES + t (如果一个任务 ES 是 20 小时,要做 10 小时才会好的话, EF 就会是 20 + 10 = 30 )。

现在要绘制关键路径,最长的那条路径就是关键路径:

https://ithelp.ithome.com.tw/upload/images/20211005/200927539ZpvtnCiUg.png

这些 ES, EF 都是彼此有关连性的,所以最後一个 EF 就是这个整体专案所需完成的最短时间、最长时间。

这里只有定义 ES, EF,其实也可以换成计算 LS, LF,他们各自是两套相反的系统 [6]:

Forward Pass: 有 ES, EF, EF = ES + t

Backward Pass: 有 LS, LF, LS = LF -t

使用 CPM 规划最重要的部分就是浮动时间,详细的范例是,如果你要煎蛋饼,你必须先准备材料、加热平底锅、煎出蛋饼,额外可以再加上调味料,像是盐巴、糖浆,现在你选出一个关键路径是 【先准备材料、加热平底锅、煎出蛋饼】,则随便拿里面的例子举例浮动时间,像是【加热平底锅】这个任务的浮动时间就是 0,因为他在关键路径上,但是 【加盐巴】、【加糖浆】可以先做後做都行,甚至可以在煎出蛋饼之後才加,因此浮动时间就会很大。

如果一个任务的浮动很大,就可以先推迟它,把其他重要的任务先做完; 反过来说,关键路径上的任务都是 0 浮动时间的。

浮动时间计算: Float = LS - ES (上面只有带入 ES, EF,事实上 LS, LF 也都要做出来)。

关於崩溃,由於文章都称任务资源 Resource (其实我看起来可以用人力来解释),所以参考文献的资源我都会使用人力来解释他。

崩溃是一个活动,如果你某个任务死线快到了,这时候主管要分配一大堆工程师来帮你 carry ,这个资源的调度就会被称为崩溃,为什麽是崩溃?

因为把其他人手边在做的事情都暂停过来帮忙 carry 任务已达成死线前交付,都会影响到关键路径内外,所以通常都会在这几种方式才会崩溃,其余情形可能不推荐:

  1. 做完这件事的时间与原本的时间成正比,而且有好处
  2. 把某些正在做浮动时间很高的任务的人,调度来做这些事,毕竟那些任务都可以推迟

[6] 提到除非紧急状况,否则通常不建议崩溃。

使用 CPM 的好处算是可以量化每个任务,清楚知道该如何进行,也可以掌握时间。

References:
[1] https://acqnotes.com/acqnote/tasks/critical-path-critical-path-method
[2] http://www.pmknowledgecenter.com/dynamic_scheduling/baseline/critical-path-method-cpm-incorporating-activity-timecost-trade-offs-project-schedule#:~:text=The%20crash%20duration%20is%20the,activity%20cost%20(crash%20cost).
[3] http://www.planningplanet.com/wiki/422733/critical-path-drag
[4] https://www.workamajig.com/blog/critical-path-method
[5] https://online.visual-paradigm.com/drive/#diagramlist:proj=0&new, (PERT Chart Arrow Diagram)
[6] https://www.projectmanager.com/critical-path-method


<<:  Day 21:GitLab Container Registry

>>:  Day 20 - 利用路由软件将路由收进 VRF

成员 8 人:先知预言,公司会爆发绝望病毒

「以前我不觉得发薪日很烦,最近觉得超烦,唉......」 今日跟过去有什麽不同吗? 若你现在 4个合...

[ Day 24 ] - 阵列资料处理 - filter

特性与用途 不会影响到原始阵列的资料 可以筛选符合条件的内容,并且回传至新的阵列 直接进入写法及范例...

[day-1] 前言、建置基础开发环境

前言 HI , 大家好 我是Mouchi也可以叫我『麻糬』 写这篇文章主要是督促自己每天要有一定的学...

Day 28: 初始化要测试的component

来,今天我们来聊一下怎麽帮redux在测试时添加初始化的状态资料,借用昨天的程序,并增加store的...

Day14-This

this的指向取决於谁呼叫 物件一定指向本身 其余必须透过call、bind等等强制绑定 我们先把...