1. 程式人生 > 其它 >圖的應用—拓撲排序

圖的應用—拓撲排序

一、有向無環圖

針對:有向無環圖:沒有形成迴路的有向圖。類似於樹

有向無環圖通常用來描述一個工程或系統的進行過程(通常把計劃、施工、生產、程式流程圖當成一個工程),且一個工程可以分為若干個子工程,只要完成這些子工程,就可以導致整個工程的完成。

AOV網:

用一個有向圖表示一個工程的各子工程及其相互制約的關係,其中頂點表示活動、弧表示活動之間的優先制約關係,稱這種有向圖為頂點表示活動的網

特點:

若從i到j有一條有向路徑,則i是j的前驅;j是i的後繼。

從i到j其中可以有其他的結點,比如從c1到c5是一條有向路徑。其中c1是c5的前驅,c5是c1的後繼

 

若<i,j>是網中的有向邊,則i是j的直接前驅,j是i的直接後繼。

從i到j中間不能有其他結點,比如c1到c3,c1是c3的直接前驅,c3是c1的直接後繼

拓撲排序(將一個網變成一個線性序列)

 在AOV網沒有迴路的前提下,我們將全部活動排列成一個線性序列,使得若AOV網中有弧<i,j>存在,則在整個序列內,i一定排在j的前面,具有這種性質的線性序列稱為拓撲有序序列,相應的拓撲有序排列演算法稱為拓撲排序。

思路:
在有向圖中選一個沒有前驅的頂點且輸出之:  選擇c1


從圖中刪除該頂點和所有以它為尾的弧。  從圖中刪除c1及其有向邊

重複上面兩部,直到全部頂點均已輸出,或者當圖中不存在無前驅頂點位置。

輸出的序列就是一個拓撲序列(因此拓撲序列不是唯一的,但是在整個序列表內,前驅一定在後繼的前面)

利用拓撲排序就可以檢測AOV網中是否存在環:如果所有頂點都在它的拓撲有序序列中,則該AOV網必定不存在環。

 

AOE網:

用一個有向圖表示一個工程的各子工程及其相互制約的關係,以弧表示活動,以頂點表示活動的開始或結束時間(活動的開始點或者結束點),稱這種有向圖為邊表示活動的網

把工程計劃表示為邊表示活動的網路,用頂點表示事件、弧表示活動,弧的權表示活動持續時間
事件表示:在它之前的活動已經完成,在它之後的活動可以開始

 關鍵路徑:

設一個工程由11項活動,9個事件。

其中事件v1表示工程的開始(源點:入度為0的頂點),事件v9表示整個工程的結束(匯點:出度為0的頂點)。

對於AOE網,我們一般關係兩個問題:1.完成整個事件需要的事件,2.那些活動是影響工程進度的關鍵。

關鍵路徑——路徑長度最長的路徑。(是影響工程進度的關鍵)
路徑長度——路徑上各活動持續時間之和。()

對於確定關鍵路徑需要定義四個描述量:

1.ve(vj)—表示事件vj的最早發生時間
源點 的ve(v1)= 0, ve(v2) = 6

2.vl(vj)—表示事件vj的最遲發生時間
從匯點往回推,推點此點最遲發生時間才能保證工程能正確完成
vl(v7)= 整個工程總時間 - a10(v7時間開始後所需要的時間)

3.e(i)表示活動ai的最早開始時間(邊)
e(a4) = 6

4.l(i)表示活動ai最遲開始時間
e(a8) =  整個工程總時間 - a11 - a8(最短需要時間才能完成的專案)

l(i) -  e(i)—表示完成活動ai的時間餘量 ,表示可以在這某段時間的任意時間開始執行,都不會影響進度。

關鍵活動—關鍵路徑上的活動即l(i)== e(i),沒有活動餘量。關鍵路徑由多個關鍵活動構
e(i) = ve(j)
l(i) = vl(k) - wj,k(wj,k為持續時間)

ve(j) = 前驅結點的時間  加上  當前活動的持續時間
從源點向匯點推算,如果由多個值,取最大值

vl(k) = 後繼結點的時間  減去  當前活動持續時間
從匯點向源點推算,如果有多個值,取最小值

求最早發生時間

  

等所有執行完才能執行下一個Vj。
也就是說最長時間是等Vx執行完,才能開始執行到Vj,也就是82+6 = 88.所以ve(vj) = 88

求最晚發生時間

 

等所有執行完才能執行下一個Vn
也就是說最長時間是等Vu執行完,才能執行到Vn

匯點要求10(天/小數)完成,由總時間 - 每條的持續時間求出
最遲發生時間 vl(Vj) = 10 - 持續時間 求出最小值 ,即vl(Vj) = 0

例子:

 

1.求ve(i), vl(i)
2.求 e(i), l(i)
3.計算 l(i) - e(i)

1.源點最早發生時間 ve(v1) = 0

2.v2、v3、v4最找發生事件要等事件a1、a2、a3 結束才可以執行,也就是ve(v2) = 6、 ve(v3) =4 、ve(v4) = 5

3. v5頂點有兩個前置事件,必須都執行完才可以執行v5。有兩個時間段,一個經過v2的7,一個經過v3的5,選擇多個時間的最大值7,因此ve(v5) = 7 

4. 其餘節點類似

 

1.匯點最晚發生事件 vl(v9) = el(v9) =18

2.v7、v8的最晚發生事件 = 後繼結點的最晚時間 - 事件的持續時間。也就是 vl(v8) =18 -4 =14   vl(v7) = 18 -2 =16。

3.v5的頂點有兩個後繼時間,意味著 v5的最晚發生時間要能使後面事件有最小的足夠時間完成
vl(v7) - a7、vl(v8) - a8 都等於 7,vl(v5) = 7

4.其餘結點類似

求活動的餘量,要求出活動的最早和最晚開始時間,在相減。

弧e(i) = 弧尾的最早發生時間
弧l(i) = 弧頭的最早發生時間 - 時間的持續時間

求出活動餘量,活動餘量為零 = 關鍵活動
關鍵路徑有關鍵活動組成

 

如果網中有幾條關鍵路徑,則需加快同時在幾條關鍵路徑上的關鍵活動。
a、a8、a10 和a11要同時加快

如果一個活動處於所有的唯一的一條關鍵路徑上,提高整個活動就能加快。
a1、a4加快都能縮短時間且互不影響。

但是不能縮短過多,否則可能會使原來的關鍵路徑變成不是關鍵路徑,這些必須重新尋找關鍵路徑。