圖的應用—拓撲排序
一、有向無環圖
針對:有向無環圖:沒有形成迴路的有向圖。類似於樹
有向無環圖通常用來描述一個工程或系統的進行過程(通常把計劃、施工、生產、程式流程圖當成一個工程),且一個工程可以分為若干個子工程,只要完成這些子工程,就可以導致整個工程的完成。
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) = 62.vl(vj)—表示事件vj的最遲發生時間
從匯點往回推,推點此點最遲發生時間才能保證工程能正確完成
vl(v7)= 整個工程總時間 - a10(v7時間開始後所需要的時間)3.e(i)表示活動ai的最早開始時間(邊)
e(a4) = 64.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) = 74.其餘結點類似
求活動的餘量,要求出活動的最早和最晚開始時間,在相減。
弧e(i) = 弧尾的最早發生時間
弧l(i) = 弧頭的最早發生時間 - 時間的持續時間求出活動餘量,活動餘量為零 = 關鍵活動
關鍵路徑有關鍵活動組成
如果網中有幾條關鍵路徑,則需加快同時在幾條關鍵路徑上的關鍵活動。
a、a8、a10 和a11要同時加快如果一個活動處於所有的唯一的一條關鍵路徑上,提高整個活動就能加快。
a1、a4加快都能縮短時間且互不影響。但是不能縮短過多,否則可能會使原來的關鍵路徑變成不是關鍵路徑,這些必須重新尋找關鍵路徑。