全域性路徑規劃之 Dijkstra演算法

2021-09-24 21:55:53 字數 2465 閱讀 3435

通過dijkstra計算圖g中的最短路徑時,需要指定起點s(即從頂點s開始計算)。此外,引進兩個集合s和u。s的作用是記錄已求出最短路徑的頂點(以及相應的最短路徑長度),而u則是記錄還未求出最短路徑的頂點(以及該頂點到起點s的距離)。

初始時,s中只有起點s;u中是除s之外的頂點,並且u中頂點的路徑是」起點s到該頂點的路徑」。然後,從u中找出路徑最短的頂點,並將其加入到s中;接著,更新u中的頂點和頂點對應的路徑。 然後,再從u中找出路徑最短的頂點,並將其加入到s中;接著,更新u中的頂點和頂點對應的路徑。 … 重複該操作,直到遍歷完所有頂點。

初始時,s只包含起點s;u包含除s外的其他頂點,且u中頂點的距離為」起點s到該頂點的距離」[例如,u中頂點v的距離為(s,v)的長度,然後s和v不相鄰,則v的距離為∞]

從u中選出」距離最短的頂點k」,並將頂點k加入到s中;同時,從u中移除頂點k。

更新u中各個頂點到起點s的距離。之所以更新u中頂點的距離,是由於上一步中確定了k是求出最短路徑的頂點,從而可以利用k來更新其它頂點的距離;例如,(s,v)的距離可能大於(s,k)+(k,v)的距離。

重複步驟(2)和(3),直到遍歷完所有頂點。

單純的看上面的理論可能比較難以理解,下面通過例項來對該演算法進行說明。

以上圖g4為例,來對迪傑斯特拉進行演算法演示(以第4個頂點d為起點)。以下b節點中23應為13。

初始狀態:s是已計算出最短路徑的頂點集合,u是未計算除最短路徑的頂點的集合!

第1步:將頂點d加入到s中。 

此時,s=, u=。 注:c(3)表示c到起點d的距離是3。

第2步:將頂點c加入到s中。 

上一步操作之後,u中頂點c到起點d的距離最短;因此,將c加入到s中,同時更新u中頂點的距離。以頂點f為例,之前f到d的距離為∞;但是將c加入到s之後,f到d的距離為9=(f,c)+(c,d)。 

此時,s=, u=。

第3步:將頂點e加入到s中。 

上一步操作之後,u中頂點e到起點d的距離最短;因此,將e加入到s中,同時更新u中頂點的距離。還是以頂點f為例,之前f到d的距離為9;但是將e加入到s之後,f到d的距離為6=(f,e)+(e,d)。 

此時,s=, u=。

第4步:將頂點f加入到s中。 

此時,s=, u=。

第5步:將頂點g加入到s中。 

此時,s=, u=。

第6步:將頂點b加入到s中。 

此時,s=, u=。

第7步:將頂點a加入到s中。 

此時,s=。

此時,起點d到各個頂點的最短距離就計算出來了:a(22) b(13) c(3) d(0) e(4) f(6) g(12)。

**鄰接矩陣為例,

// 鄰接矩陣

typedef struct _graph

graph, *pgraph;

// 邊的結構體

typedef struct _edgedata

edata;

graph是鄰接矩陣對應的結構體。 

vexs用於儲存頂點,vexnum是頂點數,edgnum是邊數;matrix則是用於儲存矩陣資訊的二維陣列。 

例如,matrix[i][j]=1,則表示」頂點i(即vexs[i])」和」頂點j(即vexs[j])」是鄰接點;matrix[i][j]=0,則表示它們不是鄰接點。 

edata是鄰接矩陣邊對應的結構體。

dijkstra演算法

/* * dijkstra最短路徑。

* 即,統計圖(g)中"頂點vs"到其它各個頂點的最短路徑。

* * 引數說明:

*        g -- 圖

*       vs -- 起始頂點(start vertex)。即計算"頂點vs"到其它頂點的最短路徑。

*     prev -- 前驅頂點陣列。即,prev[i]的值是"頂點vs"到"頂點i"的最短路徑所經歷的全部頂點中,位於"頂點i"之前的那個頂點。

*     dist -- 長度陣列。即,dist[i]是"頂點vs"到"頂點i"的最短路徑的長度。

*/void dijkstra(graph g, int vs, int prev, int dist)

// 對"頂點vs"自身進行初始化

flag[vs] = 1;

dist[vs] = 0;

// 遍歷g.vexnum-1次;每次找出乙個頂點的最短路徑。

for (i = 1; i < g.vexnum; i++)

{// 尋找當前最小的路徑;

// 即,在未獲取最短路徑的頂點中,找到離vs最近的頂點(k)。

min = inf;

for (j = 0; j < g.vexnum; j++)

{if (flag[j]==0 && dist[j]

參考資料

全域性路徑規劃 01 Dijkstra演算法

應用場景 城市路網的路徑規劃 演算法流程 初始時,s集只包含起點s,u集包含除s外的其他節點,u集中的節點v與起點s相鄰,則該節點儲存值為距起點s的距離,若與起點s不相鄰,則距離為無限大 從u集中選出距離起點最短的節點k,並將節點k加入到s集中,同時從u集中移除節點k 更新u集中各個節點到起點s的距...

Dijkstra 路徑規劃 C

示例無向圖如下 起始點為v0 鄰接矩陣為 注意 其中沒有連線的邊和自己到自己的點權值用10000表示。static void main string args int n 6 int s new int n 最短路徑的頂點集合 string mid new string n 點的路線 for int...

最優路徑之 Dijkstra

求在乙個加權有向無環圖中,從起點到終點的最短路徑 圖中有四個節點,分別為 start,a,b,end 各個節點間的路徑長度如下 start a 6 start b 2 a end 1 b a 3 b end 5 終點 無 答案 最短路徑為 start b a end 6 usr bin env py...