1. 程式人生 > >[圖] 8 AOE網-關鍵路徑|關鍵活動-原理

[圖] 8 AOE網-關鍵路徑|關鍵活動-原理

文章目錄

關鍵路徑

情景

【情景】:你、張三、王五、李四下午約在【叫一隻雞】炸雞店打牌,相約下午14點開始出發
【情況】是這樣子的:

  1. 【你】有摩托車,去車站需要15分鐘,從車站到店裡需要10分鐘
  2. 【張三】在鄉下,來縣城到車站需要30分鐘
  3. 【王五】步行,去店裡需要10分鐘
  4. 【李四】騎單車,去店裡需要15分鐘
    【約定】你們做了一個安排:【張三】上來後,【你】去接【張三】來店裡

我們用【有向圖】表示這次【活動】:
這裡寫圖片描述

活動發起時間14:00

張三到縣城 你到車站等張三 張三、你到店裡 王五到店裡 李四到店裡 開始打牌
ve最早發生時間 張三乘車到縣城需要
30min
你去車站需要
15min
你在車站等到張三後,立刻去店裡
從活動發起時間14:00需要
40min(30+10)
王五步行到店裡需要
10min
李四騎單車去店裡需要
15min
活動發起14:00到最早開始打牌需要
40min,即14:40
等人到齊,就張三最慢,所以等張三來了,其他人準時到,就可以開始
vl最遲發生時間 張三從家裡去縣城最遲的出發時間
30-30=0,即14:00
你最遲出發去車站的時間
30-15=15min,即14:15
張三和你最遲從車站過來的時間為
40-10=30min,即14:30
王五最晚出發的時間是
40-10=30min,即14:30
李四最晚出發時間是
40-15=25min,即14:25
從ve的分析,我們可以知道,打牌的最早時間是14:40
即40min

【補充】 vl表示,為了保證14:40能夠開始打牌,各個人最遲的出發時間。求vl時,應該從右邊往左邊求
【關鍵活動】“張三到縣城”,如果張三到縣城的時間耽擱了,那開始打牌的時間就得推遲了
【關鍵路徑】“張三到縣城”->“你到車站等到張三”->“張三、你到達店裡”->“開始打牌”

問題

用【有向網】表示一個【施工流圖】

  1. 【弧上的權值】:表示完成該專案【子工程】所需時間
  2. 整個工程【完成的時間】:從【有向圖】的【源點】到【匯點】的最長路徑

【問】 哪些子工程項是“關鍵工程”
【解釋】 關鍵工程:這個工作如果推遲完成,它會導致整個工程完成推遲
【定性來談】該弧上的權值增加,將使有向圖上的【最長路徑的長度】增加,這個【弧】稱之為【關鍵活動】或【關鍵工程】

AOE網

在這裡插入圖片描述
【AOE網】上面的圖有向圖即為AOE網
Activity On Edge Network,活動在邊上。用邊表示活動、活動的持續時間,用頂點表示活動發生或結束的事件。
【相關概念】

  1. 頂點:活動的開始或結束的事件
    頂點1表示:活動a2、a3的開始
    頂點6表示:活動a6、a7的結束
  2. 邊:活動的執行時間
  3. 源點:沒有入度,結點1
  4. 匯點:沒有出度,結點6

【關鍵路徑】從源點開始,到匯點結束的最大長度的路徑

  1. 圖中1->3->6,由a2、a6組成的路徑,長度為8
  2. 圖中1->4->6,由a3、a7組成的路徑,長度為9
    【關鍵路徑】後者才是關鍵路徑,a3、a7叫關鍵活動
    【關鍵】代表工程完成的最短時間 --> 關鍵路徑上的關鍵活動完成,所有工程才可能完成 --> 關鍵活動會影響整個工期,非常關鍵了

如何求關鍵活動

ve(j)

【含義】 事件(頂點)最早發生的時間
【解釋】這個事件(這個工作,這個工程)最早什麼時候能開始
【定性來談】ve(j)=從源點到頂點j的最長路徑長度

匯點(終點)的【最早發生時間】:即為整個工程能夠【最早完成的時間】
【解釋】中途不拖拉,一個工作完成,下一個工作立刻動手。整個工程保質保量的幹下來(效率最高),最早能夠完成的時間。我們記為plan_time,後面要用到

vl(k)

【含義】事件(頂點)的最遲發生時間vl(k)
【解釋】上面談到plan_time,與這個有關。假設,我們要在plan_time的時間內把整個工作做完,每個小工作最遲開始的時間稱之為【最遲發生時間】。也就是說,【小工程】最遲什麼時候開始,它不會影響總工程的按時的完成
【定性來談】vl(k)=從頂點k到匯點(終點)的最短路徑長度

演算法

假設第i條弧為<i,k>
則 第i項活動

  • “活動(弧)”的最早開始時間ee(i):ee(i)=ve(j)
  • “活動(弧)”的最遲開始時間el(i):el(i)=vl(k)-dut(<j,k>)

事件發生時間的計算公式:

ve(源點) = 0;
ve(k) = Max{ ve(j) + dut(<j,k>) }

vl(匯點) = ve(匯點)
vl(j) = Min{ vl(k)-dut(<j,k>) }

演算法實現要點

顯然,求ve的順序應該是按【拓撲有序的次序】
   而,求vl的順序應該是按【拓撲逆序】的次序
因為,拓撲逆序序列即為【拓撲有序序列的逆序列】
因此,應該在拓撲排序的過程中,另設一個“棧”記下拓撲有序序列

例子

這裡寫圖片描述

1 2 3 4 5 6 7 8 9
事件最早發生時間 ve 0 6 4 5 7 7 15 14 18
事件最遲發生時間 vl 0 6 6 8 7 10 16 14 18

【說明】vl為最遲發生時間,保證18天完成,每項工作最遲第幾天開始。求得時要從後面往前求

1-2 1-3 1-4 2-5 3-5 4-6 5-7 5-8 6-8 7-9 8-9
最早開始加工時間 ee 0 0 0 6 4 5 7 7 7 15 14
保證14天內完成
最遲開始加工時間
el 0 2 3 6 6 8 8 7 10 16 14

【說明】el這道工序最遲開始的時間

【關鍵活動】1->2、2->5、5->8、8->9
【說明】最早開始時間 與 最遲開始時間 相同的弧
【解釋】活動不能夠推遲的,兩個時間相同

【關鍵路徑】1->2->5->8->9
【解釋】該路徑就是圖中的最長路徑,如果最長路徑上因為一些事情耽擱了,權重邊長了,那麼工期就會被延長