The Shortest Path(最短路徑The最短路径最短路徑.pptVIP

  • 3
  • 0
  • 约3千字
  • 约 19页
  • 2017-03-09 发布于上海
  • 举报

The Shortest Path(最短路徑The最短路径最短路徑.ppt

The Shortest Path(最短路徑The最短路径最短路徑

最短路徑 The Shortest Path The Shortest Path(最短路徑) 由某節點到其他各個節點之最短路徑。 各個節點之間最短路徑。 最短路徑的定義 : 一條從節點S到節點D最短路徑P,它的總權重最少: 單一起點到其他節點最短路徑 採用貧婪(Greedy)策略 如圖是沒有負權重的網路 設起點為0,求節點0到節點1 最短路徑 節點0到 1,路徑長原為50, 經由節點2,路徑 0 - 2 - 1 ,路徑為45 ,然不滿足, 繼續尋找得到路徑0 - 2 - 3 - 1 ,路徑長40為最短。 Dijkstra’s演算法則 要找出某一頂點到其他節點的最短路徑,可利用Dijkstra’s演算法求得。 其過程如下: D = A [F, I] ( I =1, N ) S = {F} V = {1, 2, … , N} D為N個位置的陣列,用來儲存某一頂點到其他頂點的最短距離,F表示由某一起始點開始,A [F, I]是表示F點到I點的距離,V是網路中所有頂點的集合,S也是頂點的集合。 從V-S集合中找一頂點t,使得D [t]是最小值,並將t放入S集合,一直到V-S是空集合為止。 根據下面的公式調整D陣列中的值: D [I] = min ( D [I], D [t] +A [t, I; ] ((I , t )?E) 其中I是指t的相鄰各頂點。 繼續回到(2)執行。 演算法 =>圖解演算法 =>演算虛擬碼 若Procedure SHORTEST_PATH (v, COST, DIST, n) Declare S (1 : n ) for j ← 1 to n S( j )← 0 ; DIST( j )←COST( v , j ) End S( v )←1 ; DIST( v )←0 ; num←2 While num n do Choose u : DIST(u) = min{DIST(w)} S(u)←1 ; num←num+1 For all w with S(w) = 0 do DIST(w) ←min {DIST(w), DIST(u) + COST(u , w ) } end end end SHORTEST_PATH =>演算程式碼 同樣的,我們可以將Dijkstra演算法,以C語言表達如下: #define N 6 #define MAX_I 10000 int adj_matrix [N][N] int path [N], dist [N], s[N]; dijkstra ( int v) { int i , j , m , min , s[N] ; for ( i = 0 ; i N ; i ++) { dist [i] = adj_matrix [v][i] ; s [i] = 0 ; path [i] = v ; } s [v] = 1 ; for ( i = 0 ; i N – 2 ; i ++ ) min = MAX_I ; for ( j = 0 ; j N ; j ++) if ( dist [j] min s [j] = = 0) { min = dist [j] ; m = j ; } s [m] = 1 ; for ( j = 0 ; j N ; j ++) { if ( dist [j] dist [m] + adj_matrix [m][j]) { dist [j] = dist [m] + adj_matrix [m][j] ; path [j] = m ; } } } } 範例 各節點之最短路徑 前面所探討的是固定一點為起點,而其他節點為終點節點。 任何兩點之間的最短距離(All-pairs shortest paths),其公式如下: Ak [i][j] = min { Ak-1 [i][j],Ak-1 [i][k]+Ak-1 [k][j] } , k≧1 A0 [i][j] = length [i][j] 其中k表示經過節點的名稱, Ak [i][j]表示由i到j經由k節點的最短距離。 演算法則 Dijkstra演算法: 依序分別以每一個頂點為起始節點,利用Dijkstra演算法即可獲得任一節點的最短路徑和距離。 Floyd演算法:假設節點編號為0、1、2、...、N-1, 並且令Ai-1(i , j )=Length(i , j), 並求出Ai(i , j ),Ai(i , j )=min{ Ai-1(i , k)+Ai-1(k , j )},0≦k≦N-1。 因為 Ai(i , j )是節點i至節點j之直通距離。 A0(i , j )走節點i至節點j之最短距離,但這條最路徑通過節點的編號不超過0。 Ai(i

文档评论(0)

1亿VIP精品文档

相关文档