530 likes | 878 Vues
第 6 章 圖形與網路. 圖形簡介 拓樸排序 圖形表示法 網路的進階應用 圖形追蹤 花費最小擴張樹 圖形最短路徑. 無向圖形 (1). 6-1 圖形簡介. 是一種具備同邊的兩個頂點沒有次序關係,例如 (V 1 ,V 2 ) 與 (V 2 ,V 1 ) 是代表相同的邊。請看下圖 G :. V(G)={V 1 ,V 2 ,V 3 ,V 4 } E(G)={(V 1 ,V 2 ),(V 1 ,V 3 ), (V 1 ,V 4 ), (V 2 ,V 3 ),(V 2 ,V 4 ),(V 3 ,V 4 )}. 無向圖形 (2).
E N D
第6章 圖形與網路 圖形簡介 拓樸排序 圖形表示法 網路的進階應用 圖形追蹤 花費最小擴張樹 圖形最短路徑
無向圖形(1) 6-1 圖形簡介 • 是一種具備同邊的兩個頂點沒有次序關係,例如(V1,V2)與(V2,V1)是代表相同的邊。請看下圖G: V(G)={V1,V2,V3,V4} E(G)={(V1,V2),(V1,V3), (V1,V4), (V2,V3),(V2,V4),(V3,V4)}
無向圖形(2) 6-1 圖形簡介 • 無向圖形的相關定義介紹: • 簡單路徑(Simple Path):除了起點和終點可能相同外,其他經過的頂點都不同。 • 循環(Cycle):是種簡單路徑,且終點與起點同一頂點。 • 路徑(Path):對於從頂點Vi到頂點Vj的一條路徑,是指由所經過頂點所成的連續數列。 • 路徑長度(Path Length):是指路徑上所包含邊的數目。 • 完整圖形(Complete Graph):具有n個頂點,且恰好擁有n*(n-1)/2個邊的無向圖形,稱為完整圖形。
6-1 圖形簡介 • 相連單元(Connected Component):在無向圖形中,相連在一起的最大子圖(Subgraph)。 • 子圖(Subgraph):我們稱G’為G的子圖時,必定存在V(G’) V(G)與E(G’) E(G)。 • 相鄰(Adjacent):如果(Vi,Vj)是E(G)中的一邊,則稱Vi與Vj相鄰。 • 依附(Incident):如果Vi與Vj相鄰,我們則稱(Vi,Vj)這個邊依附於頂點Vi及頂點Vj。
有向圖形(1) 6-1 圖形簡介 • 是一種每一個邊都可使用有序對<V1,V2>來表示,並且<V1,V2>與<V2,V1>是表示兩個方向不同的邊。如下圖所示: V(G)={V1,V2,V3} E(G3)={<V1,V2>,<V2,V1>,<V3,V2>}
有向圖形(2) 6-1 圖形簡介 • 向圖形的相關定義介紹: • 完整圖形(Complete Graph):具有n個頂點且恰好有n*(n-1)個邊的有向圖形。 • 路徑(Path):有向圖形中從頂點Vp到頂點Vq的路徑是指一串由頂點所組成的連續有向序列,Vp,Vi1,Vi2…Vin,Vq,其中有<Vp,Vi1>,<Vi1,Vi2>…<Vin,Vq>等邊。 • 強連接(Strongly Connected):有向圖形中,如果每個相異的成對頂點Vi,Vj有直接路徑,同時,有另一條路徑從Vj到Vi,則稱此圖為強連接。 • 強連接單元(Strongly Connected Component):有向圖形中構成強連接的最大子圖。 • 入分支度(In-degree):以頂點V為箭頭的邊數目。 • 出分支度(Out-degree):以頂點V為箭尾的邊數目。
相鄰矩陣法 6-2 圖形表示法 • 試請寫出下列三圖的相鄰矩陣: • 一個圖形之相鄰矩陣表示法,其結果為:
相鄰矩陣表示法的優點在演算法的製作與執行上較為方便,在頂點分支度的計算與增刪邊(Edge)時都十分簡單。相鄰矩陣表示法的優點在演算法的製作與執行上較為方便,在頂點分支度的計算與增刪邊(Edge)時都十分簡單。 6-2 圖形表示法 • 第二個圖形的相鄰矩陣表示法,可以用下面的矩陣代表: • 第三個圖形的相鄰矩陣表示法如下:
相鄰串列法(1) 6-2 圖形表示法 • 這種表示法就是將一個n列的相鄰矩陣,表示成n個鏈結串列。每個節點資料結構如下: • 請寫出下列三圖的相鄰串列法:
6-2 圖形表示法 • 第一個圖形,其串列表示法如下: • 第二個圖形,其結果則為:
相鄰複合串列法(1) 6-2 圖形表示法 • 如果能作成讓數個串列共用的複合串列形式,那麼則可對每個邊而言均以一個節點表示,但是這個節點可同時存於兩個串列,節點的結構如下: • M是一個位元的記號欄,用來表示該邊是否已被找過。V1及V2是該邊的兩個頂點。 • LINK1欄:是一個指標,若尚有其他頂點與頂點V1相連,則LINK1指向「該頂點與頂點V1所形成的邊節點」,否則指向NULL。 • LINK2欄:亦是一個指標,若尚有其他頂點與頂點V2相連,則LINK2指向「該頂點與頂點V2所形成的邊節點」,否則指向NULL。
相鄰複合串列法(2) 6-2 圖形表示法 • 圖形的每一個頂點則依序產生一個串列首,這些串列首分別指向第一個包含該頂點的邊所形成的節點。 • 至於m則是一個屬於布林值(boolean)的標註欄,除了此欄之外,這種複合串列和一般的相鄰串列所需記憶空間相同。 • 範例 6.1.1 • 試求出下圖的相鄰複合串列表示法。
索引表格法 6-2 圖形表示法 • 它的作法是以一個一維陣列來循序儲存相鄰頂點。 • 建立一個索引表格,n個頂點須建立n個位置於索引表格中,分別對應於陣列中與第一個與該頂點相鄰的位置。以索引表格法表示下列圖形: • 其索引表格法之表示方式為:
先深後廣搜尋法(1) 6-3 圖形追蹤 • 在所有與Vx相連且未被拜訪過的頂點中任選一個頂點,令Vy,做一個已拜訪過的記號,並以Vy為新的起點進行先深後廣搜尋。 • 使用堆疊技巧遞迴的進行,由於每次均是任意選取一個和Vx相連的頂點當做新的起始,因此搜尋的結果並不唯一。 • 先深後廣搜尋之後若有剩餘頂點,則表示此圖形並不相連:反之則相連。
先深後廣搜尋法(2) 6-3 圖形追蹤 • 範例程式:ch06_01.cpp
6-3 圖形追蹤 • 執行結果
先廣後深搜尋法(1) 6-3 圖形追蹤 • 使用下圖來實際模擬先廣後深搜尋法的追蹤過程。 • 首先拜訪V1,並將相鄰的V2、V3也放入佇列。 • 拜訪V2,將V4、V5放入(V1已在佇列中)
6-3 圖形追蹤 • 再拜訪V3,將V6、V7放入(V1已在佇列中) • 拜訪V4,並將V8放入佇列(V2已在佇列中) • 最後得到的順序為V1、V2、V3、V4、V5、V6、V7、V8
擴張樹 6-3 圖形追蹤 • 又稱「花費樹」或「展開樹」,其定義如下: • 當一個圖形連通時,則使用DFS或BFS必能拜訪圖形中所有的頂點,且G=(V,E)的所有邊可分成兩個集合:T和B(T為搜尋時所經過的所有邊,而B為其餘未被經過的邊),if S=(V,T)為G中的擴張樹(Spanning Tree),具有以下三項性質: 一個無向圖形的擴張樹是以最少的邊來聯結圖形中所有的頂點,且不造成循環(Cycle)的樹狀結構。 1.E=T+B 2.加入B中的任一邊到S中,則會產生循環(Cycle)。 3.V中的任何2頂點Vi、Vj在S中存在唯一的一條簡單路徑。
網路表示法(1) 6-3 圖形追蹤 • 陣列表示法 • 第一種表示法是陣列法,其結果如下:
網路表示法(2) 6-3 圖形追蹤 • 串列表示法 • 第二種表示法─串列表示法,其資料結構為: • 所以,根據上圖我們可以得到以下結果:
Prim演算法 6-4 花費最小擴張樹 • Prim演算法是利用一次加入一邊的方式來產生最小花費擴張樹。作法如下: 有一網路G=(V,E),含有n個頂點,而且V={1,2,3…n},且設定U={1},而U、V是兩個頂點的集合,並且每次產生一個邊。也就是說,從V-U集合中找一頂點X,能與U集合中的某點形成最小成本的邊,把這一頂點X加入U集合,重複其步驟,直到U=V為止。
Kruskal’s演算法(1) 6-4 花費最小擴張樹 • Kruskal’s演算法也是以一次加入一個邊的步驟來建立一個最小花費擴張樹,並將各邊成本利用遞增方式加入此最小花費擴張樹。作法如下: • 範例 6.4.1 • 試說明假設無向圖形G=(V,E),e'E,如果e'的加權值為最大,那麼任一G的MST也有可能包含e'。 有一網路G=(V,E),V={1,2,3,…n},有n個頂點。 E中每一邊皆有成本,T=(V,∮)表示開始時T沒有邊。 首先從E中找有最小成本的邊;若此邊加入T中不會形成循環,則將此邊從E刪除並加入T中,直到T含有n-1邊為止。
Kruskal’s演算法(2) 6-4 花費最小擴張樹 • 範例程式:ch06_02.cpp
6-4 花費最小擴張樹 • 執行結果
單點對全部頂點(1) 6-5 圖形最短路徑 • 單點對全部頂點時所使用的是「Dijkstra演算法」,Dijkstra演算法如下: • 假設S={Vi | ViV},而且頂點Vi在已發現的最短路徑上,其中V0S是起點,假設w S,則定義DIST(w)是從V0到w最短路徑,對於這條路徑上每一個節點除了w外,必屬於S之中。且有下列情況: • 若u是目前所找到最短路徑之下一個節點,則u必屬V-S集合中具有最小花費成本的邊。
6-5 圖形最短路徑 • 若u已被挑選,則u加入於S中,且產生目前的由V0到u的最短路徑,對於wS,DIST(w)被改變成: • 這時利用Dijkstra演算法求得: DIST(w)←Min{DIST(w),DIST(u)+COST(u,w)} 步驟1:D[L]=A[F,I][I=1,N] S={F} V=[1,2,3…N] D為N個位置的陣列,用來儲存某一頂點到其他頂點的最短距離,F:表示由某一起點開始,A[F,I]是表示F點到I點的距離,V是網路中所有頂點的集合,S也是頂點的集合。 步驟2:從V-S集合找一頂點t,使得D(t)是最小值,並將t放入S集合,一直到V-S是空集合為止。 步驟3:根據下面的公式調整D陣列中的值。 D[I]=min(D[I],D[t]+A[t,I])[(I,t)E]
單點對全部頂點(2) 6-5 圖形最短路徑 • 範例程式:ch06_03.cpp
6-5 圖形最短路徑 • 執行結果
所有頂點對兩兩之間的最短距離 6-5 圖形最短路徑 • 作法如下: • 如果圖形有n個頂點,則An(i,j)是從頂點i到頂點j的最短路徑成本,這時將圖形G以相鄰矩陣表示,COST(i,i)=0,且當i≠j,如果<i,j>G,則COST(i,j)=∞。 • 另外A0 (i,j)就是cost(i,j)為Vi到Vj的直通距離,且定義Ak(i,j)為從i到j最短路徑的花費,但這條路徑的中間頂點的註標不能超過k。 • 而演算法依序是A0→A1→A2…An就完成,因此從頂點i到頂點j的最短路徑為: Ak(i,j)=min{Ak-1(i,j),Ak-1(i,k)+Ak-1(k,j)} ,k≧1
6-5 圖形最短路徑 • 範例 6.5.1 • 請寫出以Floyd演算法求得下圖各頂點間的距離(請依序寫出A0、A1、A2、A3)。
遞移封閉性(1) 6-5 圖形最短路徑 • 是在決定對於圖形G中的每一組頂點(i,j)是否存在從i到j的路徑。 • 其中定義了兩種矩陣與G相關: • 遞移封閉矩陣(Transitive Closure Matrix)A+,其中當i到j的某條路徑大於0時,A+ [i][j]=1,否則為0。 • 反身遞移封閉矩陣(Reflexive Closure Matrix)A*,其中當i到j的某條路徑大於或者等於0時,A* [i][j]=1,否則為0。
遞移封閉性(2) 6-5 圖形最短路徑 • 現在如果有一圖形結構G=(V,E),共有n個節點,則我們可以建立一個路徑矩陣(Path Matrix)A,其中: • An(aij)表示從節點i到節點j長度為n的路徑數目。先求得: • 其中Σaikakj=aij為A2中的一個元素之求法。 A1+A2+A3+…An n k=1
遞移封閉性(3) 6-5 圖形最短路徑 • 範例 6.5.2 • 求下圖的A+。
拓撲排序(1) 6-6 拓樸排序 • 如果一個AOV網路中具有部份次序的關係,我們可將其化為線性排列,且若Vi是Vj的前行者,則在線性排列,Vi一定在Vj前面。 • 此種特性稱為拓撲排序(Topological Sort)。(注意:其結果並非唯一),排序的步驟如下: 1.在AOV網路中挑選沒有前行者的頂點。 2.輸出此頂點,並將此頂點所接的邊刪除。重覆、步驟,一直到全部頂點輸出為止。
拓撲排序(2) 6-6 拓樸排序 • 以下來看一個例子。我們試著求出下圖的拓撲排序。 • 1.首先輸出V1,因為V1沒有先行者,且刪除<V1,V2>,<V1,V3>,<V1,V4>。
6-6 拓樸排序 • 2.可輸出V2、V3或V4,這裡我們選擇輸出V4。 • 3.輸出V3。 • 4.輸出V6。 • 5.輸出V2、V5。 =>拓撲排序則為V1→V4→V3→V6→V2→V5
AOE網路 6-7 網路的進階應用 • 此網路之中包括了14個action(a1、a2、a3…a14)及12個event(V 1、V 2 …V12)。 • 我們知道此專案計劃起始點為V 1,V12為終止點,完成此專案計劃首先必須從事件V 1開始做起,待事件V12完成才告結束。
績效評核術 6-7 網路的進階應用 • 主要步驟有下列五個步驟: • 劃分工作項目及執行順序 • 評估每個事件所需的時間 • 繪製計劃評核圖 • 計算最早開始時間及最晚開始時間 • 找出臨界路徑
6-7 網路的進階應用 • 下例我們試圖以PERT來分析專案系統的執行過程,共有四個主要步驟: • 劃分工作項目及執行順序
6-7 網路的進階應用 • 評估每個事件所需的時間 • 1、最短完成時間 • 2、最長完成時間 • 3、正常時間 • 4、預期時間= • 繪製計劃評核圖 最短時間+最長時間+4*(正常時間) 6 註解 1、圓圈符號代表工作編號 2、箭頭代表執行順序 3、箭頭上數字代表預期時間
6-7 網路的進階應用 • 計算最早時間及最晚時間 • 最早時間: • 從專案開始起,至某事件最早可開始進行所需之時間,我們用TE表示。 • 最晚時間: • 從專案開始起,至某事件最晚開始進行所需之時間,我們用TL表示。