最短路徑演算法dijkstra的matlab實現
-
function Dijkstra(Graph, source):
2
3 create vertex set Q
4
5 for each vertex v in Graph: // Initialization
6 dist[v] ← INFINITY // Unknown distance from source to v
7 prev[v] ← UNDEFINED // Previous node in optimal path from source
8 add v to Q // All nodes initially in Q (unvisited nodes)
9
10 dist[source] ← 0 // Distance from source to source
11
12 while Q is not empty:
13 u ← vertex in Q with min dist[u] // Source node will be selected first
14 remove u from Q
15
16 for each neighbor v of u: // where v is still in Q.
17 alt ← dist[u] + length(u, v)
18 if alt < dist[v]: // A shorter path to v has been found
19 dist[v] ← alt
20 prev[v] ← u
21
22 return dist[], prev[]
-
程式執行在matlab 7.0正常,1為出發節點,有向圖的結構如下:
-
這裡是我寫的matlab程式。
%初始化
MAXNUM=5;
MAXINT=32767;
dij=MAXINT*ones(MAXNUM,MAXNUM);
dij(1,2)=10;
dij(1,4)=30;
dij(1,5)=100;
dij(2,3)=50;
dij(3,5)=10;
dij(4,3)=20;
dij(4,5)=60;
dij(1,1)=0;
dij(2,2)=0;
dij(3,3)=0;
dij(4,4)=0;
dij(5,5)=0;
V=1:MAXNUM;%全部節點
S=[1];%已分配節點
m=1;%過渡節點
ite=2;
U=2:MAXNUM;%未分配的節點
%重複,直到U為空
%將U中的節點不斷新增到S中,同時記錄過渡節點和最短路徑
dist=dij(1,:);%節點1到其它節點的初始距離值,每次迭代更新一次
dist1=dist;
while(length(U)>0)
dist1(dist1==min(dist1))=[]; %已分配的節點對應的距離從dist1中刪除
m=find(dist==min(dist1));%記錄dist1當前的最小值在dist中的下標
S(ite)=m;%將過渡節點加入S
U(find(U==m))=[];%將過渡節點從U中刪除
%比較1經過m與不經過m到未分配節點的距離,dist中的距離更新為較小者
for u=1:length(U)
if(dist(m)+dij(m,U(u))<dist(U(u)))
dist1(find(dist1==dist(U(u))))=dist(m)+dij(m,U(u));%dist1中的值同步更新
dist(U(u))=dist(m)+dij(m,U(u));
end
end
ite=ite+1;
end
%儲存到每個節點的最短路徑,每行對應每個節點的路徑和最短距離,其實就是將S逆序輸出
path(1,1)=1;
for node=2:MAXNUM
location=find(S==node);
path(node,1)=node;
i=2;
for s=location:-1:2
if(dij(S(s-1),S(s))~=MAXINT)
path(node,i)=S(s-1);
i=i+1;
end
end
path(node,i)=dist(node);
end
%TODO:程式中用到了find()方法,這是一個bug,find可能會返回不止一個值,取其中任意一個就行。
參考----http://www.wutianqi.com/?p=1890
或者
https://blog.csdn.net/cxllyg/article/details/7604812