1. 程式人生 > >資料結構之圖的關鍵路徑

資料結構之圖的關鍵路徑


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上面很詳細:

https://download.csdn.net/download/u014206695/10767188