1. 程式人生 > >軟體專案活動圖關鍵路徑演算法演示(轉載)

軟體專案活動圖關鍵路徑演算法演示(轉載)

如上圖,是一個AOE網,點表示狀態,邊表示活動及其所需要的時間。為了求出關鍵路徑,我們使用一下演算法:

1.求出到達各個狀態的最早時間(按最大計)


這個過程是要從源點開始向匯點順推:
  1. V1是源點,其最早開始時間是0。
  2. V2、V3、V4最早時間分別是是6、4、5。
  3. 對於V5而言,V2到V5所花費時間是6+1=7,而V3到V5所花費時間是4+1=5。我們要按最大計,也就是V5最早時間是max{7,5}=7,按最大計是因為只有活動a4和a5同時完成了,才能到達V5狀態。V3到V5需要5分鐘,但是此時a4活動尚未完成(7分鐘),所以都不能算到達V5,故而要按最大計。
  4. V6只有從V4到達,所以V6的最早完成時間是(5+2=)7。
  5. 同理,V7最早完成時間是16。
  6. 對於V8而言,和V5處理方法一致。V8=max{V5+7,V6+4}={7+7,7+4}=14。
  7. V9可算出是18。

這樣,我們可以得到各個狀態的最早時間的表:

最早時間表

2.求出到達各個狀態的最晚時間(按最小計)


這個過程是要從匯點開始向源點逆推:
  1. V9完成時間為18,最V7最遲開始時間是(18-2=)16
    逆推
    因為活動a10所需時間2。如果V7開始時間比16晚,則V9完成時間就會比18晚,這顯然不對。
  2. 同理,V8最遲開始時間為14。
  3. 對於V5而言,可以從V7、V8兩個點開始向前推算,此時要按最小計,即V5(最晚)=min{V7-9,V8-7}=min{16-9,14-7}=7。
    請注意!!,min{V7-9,V8-7}中,V7、V8取的都是前面算出的最遲開始時間(而不是最早開始時間)。
    按最小計
    最小計
    ,是因為如果按最大計去計算V5的最晚開始時間,那麼加上a7和a8的活動時間後,V7、V8至少有一個會比之前逆推算得出的最晚時間還要晚,這就發生了錯誤。
  4. 同理,可計算出剩下的點

這樣,我們可以得到各個狀態的最晚時間的表:

最晚時間表

事實上,源點和匯點的最晚時間和最早時間必定是相同的。

3.求出關鍵路徑


求出關鍵活動,則關鍵活動所在路徑即為關鍵路徑

對於a1:


這表明,a1最早只能從0時刻開始,最晚也只能從(6-6=)0時刻開始,因此,a1是關鍵活動。

對於a2:


a2最早要從0時刻開始,但是它最晚開始時間卻是(6-4=)2。也就是說,從0開始做,4時刻即完成;從2開始做,6時刻恰好完成。從而在[0,2]區間內任意時間開始做a2都能保證按時完成。( 請區別頂點的最早最晚和活動的最早最晚時間。圖示中的最早最晚是頂點狀態的時間,活動的最早最晚開始時間卻是基於此來計算的)。
由於a2的開始時間是不定的,所以它不能主導工程的進度,從而它不是關鍵活動。

一般的,


活動用時X時間,它最早要從E1時刻開始(一開始就開始),最晚要從L2-X時刻開始(即恰好完成)。所以,如果它是關鍵活動,則必然有 E1=L2-X,否則它就不是關鍵活動。

值得注意的是,頂點的最早開始時間等於最晚開始時間 是 該頂點處於關鍵路徑 的 不充分不必要條件。


上表中藍色底紋表示的點即為處於關鍵路徑的點。儘管它們的最早時間與最晚時間都相同,但是這與它們是否為關鍵路徑的點 無關。因為這還取決於起始點的最早時間以及活動時間。

作者:KyrinWoo
連結:https://www.jianshu.com/p/1857ed4d8128