1. 程式人生 > >最短路徑演算法—Dijkstra(迪傑斯特拉)演算法分析與實現(Python)

最短路徑演算法—Dijkstra(迪傑斯特拉)演算法分析與實現(Python)

December 18, 2015 12:56 PM
Dijkstra(迪傑斯特拉)演算法是典型的最短路徑演算法,用於計算一個節點到其他所有節點的最短路徑。主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。Dijkstra演算法能得出最短路徑的最優解,但由於它遍歷計算的節點很多,所以效率低。

Dijkstra演算法是很有代表性的最短路演算法,在很多專業課程中都作為基本內容有詳細的介紹,如資料結構,圖論,運籌學等等。

其基本思想是,設定頂點集合S並不斷地作貪心選擇來擴充這個集合。一個頂點屬於集合S當且僅當從源到該頂點的最短路徑長度已知。

初始時,S中僅含有源。設u是G的某一個頂點,把從源到u且中間只經過S中頂點的路稱為從源到u的特殊路徑,並用陣列dist記錄當前每個頂點所對應的最短特殊路徑長度。Dijkstra演算法每次從V-S中取出具有最短特殊路長度的頂點u,將u新增到S中,同時對陣列dist作必要的修改。一旦S包含了所有V中頂點,dist就記錄了從源到所有其它頂點之間的最短路徑長度。

#Dijkstra.py
#王淵
#2015.12.17
#Email:[email protected]

from pylab import *


INFINITY = 65535                        #代表無窮大
vexs = array([[0,10,INFINITY,INFINITY,INFINITY,11,INFINITY,INFINITY,INFINITY],#鄰接矩陣
        [10,0,18,INFINITY,INFINITY,INFINITY,16,INFINITY,12],
        [INFINITY,18,0,22,INFINITY,INFINITY,INFINITY,INFINITY,8
], [INFINITY,INFINITY,22,0,20,INFINITY,INFINITY,16,21], [INFINITY,INFINITY,INFINITY,20,0,26,INFINITY,7,INFINITY], [11,INFINITY,INFINITY,INFINITY,26,0,17,INFINITY,INFINITY], [INFINITY,16,INFINITY,24,INFINITY,17,0,19,INFINITY], [INFINITY,INFINITY,INFINITY,16,7,INFINITY,19
,0,INFINITY], [INFINITY,12,8,21,INFINITY,INFINITY,INFINITY,INFINITY,0]]) lengthVex = len(vexs) #鄰接矩陣大小 adjvex = zeros(lengthVex) #連通分量,初始只有第一個頂點,當全部元素為1後,說明連通分量已經包含所有頂點 adjvex[0] = 1; lowCost = vexs[0,:] #記錄與連通分量連線的頂點的最小權值,初始化為與第一個頂點連線的頂點權值 lowCost[0] = 0 lastLowCost = ones(lengthVex)*INFINITY lastLowCost[0] = 0 count = 0 path = [INFINITY]*lengthVex I = 0 while (count<lengthVex): lastI = I I = (argsort(lowCost))[count] print("Vertex [",count,"]:",I) adjvex[I] = lowCost[I] print("Edge [",count,"]:",adjvex[I]) lowCost = array(list(map(lambda x,y:x if x<y else y,lowCost,vexs[I,:]))) flag = list(map(lambda x,y: x==y, lowCost,lastLowCost)) flag[I] = True print(flag) path = list(map(lambda x,y,z:y if x else z,flag,path,list([I])*lengthVex)) print(path) lastLowCost = lowCost count = count+1 minPath = [] temp = 4 while path[temp]<INFINITY: minPath.append([temp,path[temp]]) temp = path[temp] print(minPath)

相關推薦

路徑Dijkstra()演算法(無向圖)

簡介 Dijkstra(迪傑斯特拉)演算法是典型的單源最短路徑演算法,用於計算一個節點到其他所有節點的最短路徑。主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。由for迴圈可知,其

路徑演算法Dijkstra()演算法分析實現(Python)

December 18, 2015 12:56 PM Dijkstra(迪傑斯特拉)演算法是典型的最短路徑演算法,用於計算一個節點到其他所有節點的最短路徑。主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。Dijkstra演算法能得出最短路徑的

路徑演算法Dijkstra()演算法分析實現(C/C++)

Dijkstra(迪傑斯特拉)演算法是典型的最短路徑路由演算法,用於計算一個節點到其他所有節點的最短路徑。主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。Dijkstra演算法能得出最短路徑的最優解,但由於它遍歷計算的節點很多,所以效率低。   Dijks

路徑演算法Dijkstra()演算法分析實現(C/C++)及其他 + leetcode習題實踐

   最短路徑求解  最短路徑的常用解法有迪傑克斯特拉演算法Dijkstra Algorithm, 弗洛伊德演算法Floyd-Warshall Algorithm, 和貝爾曼福特演算法Bellman-Ford Algorithm,其中,Floyd演算法是多源最短路徑,即求

路徑算法——Dijkstra

graph 就是 print 偽代碼 c語言程序 距離 oid 很大的 全部 算法思想 設G=(V,E)是一個帶權有向圖 把圖中頂點集合V分成兩組 第一組為已求出最短路徑的頂點集合(用S表示,初始時S中只有一個源點,以後每求得一條最短路徑 , 就將加入到集合S中,直到全部

路徑-Dijkstra()演算法

最短路徑-Dijkstra(迪傑斯特拉)演算法 網圖的最短路: 最短路徑,是指兩頂點之間經過的邊上權值之和最小的路徑,並且我們稱路徑的第一個頂點是源點,最後一個頂點是終點 Dijkstra(迪傑斯特拉)演算法: 概況: 按路徑長度

資料結構之(圖路徑之)Dijkstra()演算法

1)常用的圖最短路徑的演算法有兩個:Dijkstra演算法和Floyd演算法; 2)Dijkstra演算法適用於求圖中兩節點之間最短路徑,Floyd演算法適於求圖中任意兩節點間; 3)兩種演算法的主要思想是動態規劃,而Dijkstra演算法設計比較巧妙的是:在求源節點到終結

路徑演算法(1)—Dijkstra()演算法

Dijkstra(迪傑斯特拉)演算法是典型的最短路徑路由演算法,用於計算一個節點到其他所有節點的最短路徑。主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。Dijkstra演算法能得出最短路徑的最優解,但由於它遍歷計算的節點很多,所以效率

Dijkstra []演算法思路(求單點到其他每個點的各個路徑)Floyd演算法:任意兩點間短距離

先給出一個無向圖 用Dijkstra演算法(迪傑斯特拉演算法)找出以A為起點的單源最短路徑步驟如下 應用Dijkstra演算法計算從源頂點1到其它頂點間最短路徑的過程列在下表中。 Dijkstra演算法的迭代過程: Floyd演算法思想: 1、從任意一條單邊路徑開

資料結構--C語言--圖的深度優先遍歷,廣度優先遍歷,拓撲排序,用prime演算法實現小生成樹,用演算法實現關鍵路徑和關鍵活動的求解,路徑

實驗七  圖的深度優先遍歷(選做,驗證性實驗,4學時) 實驗目的 熟悉圖的陣列表示法和鄰接表儲存結構,掌握構造有向圖、無向圖的演算法 ,在掌握以上知識的基礎上,熟悉圖的深度優先遍歷演算法,並實現。 實驗內容 (1)圖的陣列表示法定義及

路徑演算法:克魯卡爾演算法演算法(天勤資料結構高分筆記)

迪傑斯特拉演算法演算法思想:     設有兩個頂點集合S和T,集合S存放途中已經找到最短路徑的頂點,集合T存放的是途中剩餘頂點。初始狀態是,集合S只包含源點V0,然後不斷從集合T中     選取到頂點V0的路徑長度最短的頂點Vu併入到初始集合中。集合S每併入一個新的頂點Vu,

JAVA實現短距離演算法演算法

個人部落格站已經上線了,網址 www.llwjy.com ~歡迎各位吐槽~-------------------------------------------------------------------------------------------------   

Dijkstra 演算法詳細步驟及實現

1,迪傑斯特拉演算法介紹 迪傑斯特拉演算法是典型最短路徑演算法,用於計算圖或網中某個特定頂點到其他所有頂點的最短路徑。主要特點是以起始點為中心向外,層層擴充套件,直到擴充套件覆蓋所有頂點。 2,迪傑斯特拉演算法思想 設G=(V,E)為一個帶全有向圖,把圖中頂點集合

dijkstra演算法

在圖的應用中,有一個很重要的需求:我們需要知道從某一個點開始,到其他所有點的最短路徑。    這其中,Dijkstra演算法是典型的最短路徑演算法。它的關鍵思想是以起始點為中心,向外一層層擴散,直到擴充套件到終點為止。Dijkstra演算法能夠得出最短路徑的最優解,不過

路徑問題(dijkstra演算法

題目描述 給你n個點,m條無向邊,每條邊都有長度d和花費p,給你起點s終點t,要求輸出起點到終點的最短距離及其花費,如果最短距離有多條路線,則輸出花費最少的。 輸入描述: 輸入n,m,點的編號是1~n,然後是m行,每行4個數 a,b,d,p,表示a和b之間有一條邊,且其

圖解-演算法(找路徑Dijkstra's Algorithm (finding shortestpaths)

轉自:http://www.mathcs.emory.edu/~cheung/Courses/171/Syllabus/11-Graph/dijkstra2.html   一. 圖解迪傑斯特拉   Before showing you the&nb

無向圖的Dijkstra演算法(求任意一對頂點間的路徑演算法

public class Main{ public static int dijkstra(int[][] w1,int start,int end) { boolean[] isLable = new boolean[w1[0].length];//是否標上所有的號 i

路徑演算法(Dijkstra),用c語言實現

首先,迪傑斯特拉演算法是用來解決單源最短路經問題的,主要是通過邊的鬆弛來實現。 我們來看這個問題: 這個問題求得是從1號頂點到達所有其他頂點的最短距離,我們用鄰接矩陣來儲存這個圖,如下: 我們用一個dis陣列來儲存從一號頂點到其他各個頂點的初始路徑,如圖

圖->路徑->單源路徑(演算法Dijkstra)

 文字描述   引言:如下圖一個交通系統,從A城到B城,有些旅客可能關心途中中轉次數最少的路線,有些旅客更關心的是節省交通費用,而對於司機,里程和速度則是更感興趣的資訊。上面這些問題,都可以轉化為求圖中,兩頂點最短帶權路徑的問題。     單源點的最短路徑問題: 給定帶權有向圖G

總結一下路徑演算法(Dijkstra)的基本內容以及用鄰接表優化

前面轉了兩篇部落格說了一下這個迪傑斯特拉演算法,現在自己嘗試總結一下。 先上一個百度百科的定義:迪傑斯特拉演算法 --------------------------------------------------------------------------------