關鍵路徑VS最短路徑
關鍵路徑算法一般會在最短路徑算法的后面進行講解。
這就需要我們首先區分出關鍵路徑算法和最短路徑算法在前提上的不同:
-
最短路徑算法是找盡可能短的路來保證路徑長度最小,你只需要找出一條最短的路就行。
-
但是在關鍵路徑里,
一個頂點是有多個前提的,只有前提的路徑都走完,才能發生該頂點的事件,那么只有最長的路徑走完,保證其余短的路都早已經走完,該事件才發生。
事件和活動
在關鍵路徑算法中,我們將事件定義為AOE圖中的“頂點”,將活動定義為AOE圖中的“弧”。
事件的發生和開始
這里要首先弄明白的是兩個詞,也就是后面要學到的概念中的 "發生" 和 "開始"。
-
“發生”是針對於事件的,也就是圖中的頂點。什么叫事件發生了呢?只有在指向該頂點的所有有向邊對應的活動結束,該頂點所代表的事件才發生。舉個例子,一個事件C,它僅被兩條邊a, b指向,僅當a,b兩活動都完成時,事件C發生。
-
“開始”是針對於活動的,也就是圖中的弧。只有在一個頂點所代表的事件發生后,從該頂點出發的所有邊對應的活動才能開始。什么時候開始?即可以在事件一完成就立馬開始接下來的活動,也可以推遲活動開始的時間。
事件的最早發生時間(etv)
我們前面說過,發生是針對於事件的,一個事件要發生,首先要指向它的活動都完成。
一個事件C,被兩個活動a,b指向,a活動的耗費時間是3, b活動的耗費時間是5。
那么看下圖,從開始到C事件的發生要多久呢?
是最大路徑長度5,因為C事件發生的前提必須是a,b兩活動完成(活動可同時進行)。
C事件只有等到b完成才發生,最早完成時間由耗時最久的路決定,所以這就是為什么要取最長路徑長度。
因此:事件的最早發生時間推導公式:
事件的最晚發生時間(ltv)
最晚發生時間的意義是:在不推遲整個工程完成的前提下,該事件最晚的發生時間。
因此我們可以想象:
-
在一個AOE圖中的匯點,其最晚發生時間和最早發生時間一定是相同的,因為匯點事件的發生事件一定會直接決定整個工程的完成時間。
-
而一個非匯點代表的事件,其實就是我們可以將其理解為一個和其他事件並聯的事件,那么如果這個事件所在的路徑所需的事件比與其並聯的其他路徑短,則負責這個事件的人就可以偷懶了,比如這條路徑需要花費的時間比別的路徑少1小時,那么負責這條路徑的人就可以晚開工1小時,並且和其他路徑同時完成(到達匯點)。這就是最晚發生時間。
-
因此對於一個非匯點,其最晚發生時間是由其后面的后繼頂點反推得到的。
仍然使用上面的例子:
在這個例子中,C為匯點,其最晚發生時間等於最早發生時間,都是5。
而與其相關聯的兩個頂點A、B中,A節點的路徑權值較小,因此我們可以知道,A路徑可以偷懶。
很容易可以計算出,A事件的最晚發生事件為2,B事件的最晚發生事件為0(不能偷懶)。
后面我們還需要舉一個復雜一些的例子,來解釋這個事件最晚發生事件的推導公式是怎么產生的:
(紅色筆標注了事件的最早發生時間,綠色筆標注了事件的最晚發生時間)
這里我們可以看到,和上圖不同,C頂點有2個出度,也就意味着它影響着兩個后繼頂點。
如果我們仍用上次的方法,用110-10得100,可以認為C事件最晚在第100天發生嗎?
仔細看看是不對的,B頂點的發生前提是C頂點要發生,如果C在第100天才發生,那么B事件等不了啊,B最遲在第10天就要發生。
正確的做法應該是B事件的最遲發生時間減4天得第6天。
由此可見,一個頂點的最晚發生時間其實是由它的后繼節點所決定的,這也就解答了為什么我們要從匯點開始倒着往起點推。
因此我們也可以理解為什么公式中使用的是 Min{} 取最小。
就比如剛剛的例子,C有兩個選擇——第6天或者第100天,必須得選最小的以保證你不會耽誤任何后繼節點的最晚發生。
因此:事件的最早發生時間推導公式:
活動最早開始時間(ete)
前面提到過,“開始”是針對活動,也就是圖中的弧的概念。
活動的最早開始時間,理解起來非常容易,弧的起點所依附的事件一旦發生就立刻開始,就是最早開始時間了。
公式:若邊<k, j> 表示活動i,則有ete(i) = etv(k)
活動最晚開始時間(lte)
最晚開始時間要和該邊指向事件的最遲發生時間掛鈎。
也就是邊所指向的事件最晚發生時間 - 邊對應的活動所需時間。
公式: 若邊<k, j> 表示活動i,則有lte(i) = ltv(j) - Weight(k,j)
時間余量(d)
d(i) = lte(i) - ete(i)
即活動最遲開始時間與最早開始時間的差額,這代表着活動可以拖延的時間。
如果一個活動的時間余量為0,就意味着該活動不能拖延時間,稱為關鍵活動,必須立即完成。
而時間余量為0的所有邊連起來,就是關鍵路徑了。
求解順序:
-
要求時間余量d,就要先求活動的最早開始時間ete和最遲開始時間lte,
-
要求ete和lte就要先求事件最早發生時間etv和最晚發生時間ltv
注意事項
-
關鍵路徑上的所有活動都是關鍵活動, 它是決定整個工程的關鍵因素,因此可以通過加快關鍵活動來縮短整個工期。但是也不能任意縮短,因為一旦縮短到一定的程度,該關鍵活動就可能變成非關鍵活動了
-
網中的關鍵路徑不唯一,對於有好幾條關鍵路徑的網,只加快其中某一條關鍵路徑上的活動並不能縮短工期。只有加快存在於所有關鍵路徑上的關鍵活動才能達到縮短工期的目的。
