資料結構之圖的關鍵路徑
title: 資料結構之圖的關鍵路徑
tags: 資料結構與演算法之美
一、AOE和AOV網
1.AOE網
AOE-網:指用邊表示活動的網,是一個帶權的有向無環圖,其中,頂點表示事件弧表示活動,權表示活動持續的時間,通常一個AOE-網可用來估算工程的完成時間。
2.AOV網
指用頂點表示活動,用弧表示活動間的優先關係的有向圖稱為頂點表示活動的網。
AOV網具有以下幾個性質:
(1) 只有在某頂點所代表的事件發生後,從該頂點出發的各有向邊所代表的活動才能開始;
(2) 只有在進入某一頂點的各有向邊所代表的活動都已經結束,該頂點所代表的事件才能發生;
(3) 表示實際工程計劃的AOE網應該是無環的,並且存在惟一的入度過為0的開始頂點(源點)和惟一的出度為0的完成頂點(匯點)。
對於AOE-網,我們不妨採用與AOV-網一樣的鄰接表的儲存方式,其中鄰接表中邊結點增設一個dut域存放該邊的權值,即該有向邊代表的活動所持續的時間。
下圖給出了上圖所示的AOE-網的鄰接表。
如果用AOE網來表示一項工程,那麼僅僅考慮各個子工程之間的優先關係還不夠,更多的是關心整個工程完成的最短時間是多少,哪些活動的延遲將會影響整個工程的進度,而加速這些活動又能導致提高整個工程的效率。因此,對AOE網有待研究的問題是:
(1) 完成整個工程至少需要多少時間;
(2) 哪些活動是影響工程進度的關鍵。
二、關鍵路徑
由於在AOE-網中某些活動可以並行地進行,因此完成工程的最短時間是從開始頂點(源點)到完成頂點(匯點)的最大路徑長度(這裡所說的路徑的長度等於這條路徑上完成各個活動所需時間之和,不是路徑上弧的數目);
具有最大路徑長度的路徑稱為關鍵路徑
為了尋找關鍵活動,確定關鍵路徑,我們先定義幾個變數:
(1)事件的最早發生時間ve(i):從v1到vi的最長路徑長度。
(2)事件的最遲發生時間vl(i):完成頂點vn的最早發生時間ve(n)減去vi到vn的最長路徑長度。
(3)活動ai的最早開始時間e(i):事件vj的最早發生時間ve(j)也是所有以vj為起點的出邊< vj, vk>所表示的活動ai的最早開始的時間,即e(i)=ve(j)。
(4)活動的最遲開始時間l(i):是ai的最遲完成時間減去ai的持續時間,即l(i)=vl(k)-< vj , vk>的權。
通常把e(i)=l(i)的活動稱為關鍵活動
由上述分析可知,若把所有活動ai的最早開始時間e(i)和最遲開始時間l(i)都計算出來,即可找到所有的關鍵活動。為了求得AOE網的e(i)和l(i),應該先求得網中所有事件vj的最早發生時間ve(j)和最遲發生時間vl(j)。若活動ai由邊<vj, vk>表示,其持續時間記為dut(<j, k>),則有如下關係:
e(i)=ve(j)
l(i)=vl(k)-dut(<j, k>)
求關鍵路徑的演算法描述
1) 根據有向網的弧建立圖的鄰接表作儲存結構;
2) 從源點v0出發,令ve[0]=0,按拓撲序列求各頂點的ve[i];
3) 從匯點vn-1出發,令vl[n-1]=ve[n-1],按逆拓撲序列求其餘各頂點的vl[i];
4) 根據各頂點的ve和vl值,計算每條弧的e[i]和l[i],找出e[i]=l[i]的關鍵活動。
演算法實現
1)輸入頂點和弧資訊,建立其鄰接表;計算每個頂點的入度
2)對其進行拓撲排序,排序過程中求頂點的ve[i],將得到的拓撲序列進棧
3)按逆拓撲序列求頂點的vl[i]。計算每條弧的e[i]和l[i],找出e[i]=l[i]的關鍵活動。
例如:根據給定的右圖求該AOE-網的關鍵活動及關鍵路徑。
關鍵活動是:a1, a4, a7, a8, a10, a11
它們構成了兩條關鍵路徑:(v1,v2,v5,v7,v9)和(v1,v2,v5,v8,v9)
求出來的關鍵路徑的圖如下:
說明:
關鍵活動的速度提高是有限度的。
任何一項活動持續時間的改變都會影響關鍵路徑的改變;只有在不改變網的關鍵路徑的情況下,提高關鍵活動的速度才有效。若網中有幾條關鍵路徑,單提高一條關鍵路徑上的關鍵活動的速度,是不能導致整個工程縮短工期。 必須同時提高在幾條關鍵路徑上的活動的速度。
三、關鍵路徑求解過程演示
ppt上面很詳細: