【算法】基於AOE網的關鍵路徑算法

  這是圖算法的最後一個比較重要的部分,就是關鍵路徑。這裏主要介紹手工求解的方法和思路,至於代碼嘛,我自己在寫我們學校OJ的時候雖然是可以AC的,但是經測試是有BUG的,so,就不拿出來獻醜了~

  什麼是關鍵路徑,關鍵路徑有什麼用呢?我又去抱了抱度孃的大腿,發現這個是杜邦公司發明的算法,是用來算工期的。在工程上,我們都很討厭工程的延期,同時一個工程由分爲很多的節點,我們不知道哪些節點決定着這個工程是否會延期,每一個部分有沒有可以伸縮的時間,於是,這個用來計劃工程的關鍵路徑算法就誕生了。看來,數據結構的應用真的不僅僅侷限於處理計算機本身的問題上,也應用到了工程中。

  下面要解釋一下AOE網,AOE是Activity On Edge的縮寫,即活動在邊上的網。是一個有向帶權圖。圖中的邊表示活動,頂點表示事件。 要注意與AOV網的區別,AOV是有向不帶權圖,圖中的頂點表示活動,邊表示活動間的先後關係

在AOE網中還有幾個需要解釋的名詞:

1、源點:在AOE網中,只存在一個入度爲0的點,這個點叫源點。

2、匯點:在AOE網中,只存在一個出度爲0的點,這個點叫匯點。

  現在就可以說說什麼叫關鍵路徑了:從源點到匯點的所有路徑中,具有最大路徑長度的路徑稱爲關鍵路徑。關鍵路徑上的活動叫做關鍵活動。

  關鍵路徑是圖中的最長路徑,同時也是這個工程完成的最短時間。關於這句話,我是這樣理解的:畫在工程圖上的事件都不是可有可無的事件,活動也是如此,都是要執行的。但是,活動的時間有長有短,那麼,把每個部分活動的最長者取出來,不就是整個工程的最短完成時間嗎?這個就有點像水桶效應,判斷一個水桶能裝多少水,不是看組成這個水桶最長的木板,相反,是看最短的木板。同樣,要判斷一個工程完成的最短時間,不是看在這個工程中每一部分中的最小者,應該看其最大者,因爲它們都是要執行的嘛~短的執行完,而長的沒有,這個工程依然沒有完成啊!所以應該關注圖中的最長的路徑。

對於關鍵路徑,依然有幾個名詞,下面先做個列舉,後面遇到了再說明:

1、事件的最早發生時間

2、事件的最遲發生時間

3、活動的最早發生時間

4、活動的最遲發生時間


下面就進入算法的正題了,我們直接看例題,根據這個例子,來走一遍關鍵路徑算法。

比如我們要求下圖的關鍵路徑


S1:先對這幅圖的頂點(即事件)進行拓撲排序

        排序序列爲:V1 V2 V3 V4 V5 V6

S2:根據這個拓撲排序序列,求出事件的最早發生時間

        事件的最早發生時間是指,觸發這個事件開始的所有活動中最長的那個活動。(注意標藍的那兩個)

        我們定事件V1(源點)的最早發生時間爲0

         V1    0

         V2    V1+3 = 0 + 3 = 3

         V3    V1 + 2 = 0 + 2 = 2

         V4    max{V2 + 2 , V3 + 4} = max{5 , 6} = 6

         V5    V2 + 3 = 6

         V6    max{V5 + 1 , V4 + 2 , V3 + 3} = max{7 , 8 , 5} = 8

S3:推算出這幅圖頂點(即事件)的拓撲排序序列

        逆拓撲排序序列爲:V6 V5 V4 V3 V2 V1

        雖然逆拓撲的定義是從圖中找到一個出度爲0的頂點,但是我感覺某種程度上可以直接把拓撲序列逆過來。(有錯的話歡迎指出~)

S4:根據逆拓撲排序序列,求出事件的最遲發生時間

        事件的最遲發生事件是指,在不推遲整個工程完成的前提下,該事件最遲必須發生的時間。

        匯點(V6)的最遲發生時間與最早發生時間相同,也就是8

        V6     8

        V5     V6 - 1 = 8 - 1 = 7

        V4     V6 - 2 = 8 - 2 = 6

        V3     min{V4 - 4 , V6 - 3} = min{2 , 5} = 2

        V2     min{V5 - 3 , V4 - 2} = min{4 , 4} = 4

        V1     min{V2 - 3 , V3 - 2} = min{1 , 0} = 0

       可以發現,求事件的最遲發生時間時,是看某個頂點的出度,出度引申的,是這個事件的後繼事件。我們是知道這些後繼事件的最遲發生時間的,現在我們只需要將每一個後繼的最遲發生時間減去其對應的,到達現在這個事件的代價,就可以得到一個序列,這個序列的元素可能是一個或多個(上面藍色標註的是多個的情況,也就是說當前這個事件有多個後繼)。

       根據事件最遲發生時間的定義,爲了不拖延工期,又要使得事件遲發生,是不是應該選擇差比較小的呢?粗粗的想過去,如果選擇差比較大的,事件是不是就會比較”早“發生呢?想象一下我們切木頭,從後面往前切,是不是切的長度短,保留的就會比較多呢?這裏也差不多意思。(這個真的是純粹個人理解哈,爲了是應對考試,可能不是十分合理)

S5:求每一個活動的最早發生時間

        活動的最早發生時間就是引出這個活動的事件的最早發生時間。

        Vx(早)表示某一個事件的最早發生時間

        A = V1(早) = 0

        B = V1(早) = 0

        C = V2(早) = 3

        D = V2(早) = 3

        E = V3(早) = 2

        F = V3(早) = 2

        G = V4(早) = 6

        H = V5(早) = 6

S6:求每一個活動的最遲發生時間

         活動的最遲發生時間是用事件的最遲發生時間減去以它爲結束點的活動的持續時間。

        Vx(遲)表示某一個事件的最遲發生時間

        A = V2(遲) - 3 = 4 - 3 = 1

        B = V3(遲) - 2 = 2 - 2 = 0

        C = V4(遲) - 2 = 6 - 2 = 4

        D = V5(遲) - 3 = 7 - 3 = 4

        E = V4(遲) - 4 = 6 - 4 = 2

        F = V6(遲) - 3 = 8 - 3 = 5

        G = V6(遲) - 2 = 8 - 2 = 6

        H = V6(遲) - 1 = 8 - 1 = 7

       可以發現,是每一個活動箭頭所指的那個事件的最遲發生時間減去活動的持續時間

S7:從S5和S6中找出值一樣的項(綠色標出),這些項所組成的路徑,就是關鍵路徑

        即 B E G,這三個活動也叫做關鍵活動

附:

   以上是標註的常規步驟,但是觀察S2和S4中事件的最早/最遲發生時間,如果選出值一樣的呢?

   這裏是V1 V3 V4 V6

   而這些頂點組成的路徑剛好和我們從S7中求出的相重合。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章