matlab---Dijkstra算法
Dijkstra算法簡介
下面給出一例,如下圖。
按照上方給出的算法步驟可以求得V1-V11的最短距離順序結果如下圖:
不會Dijkstra算法的可以去參考下面的博客,自己試着進行求解:https://blog.csdn.net/heroacool/article/details/51014824
帶權鄰接矩陣
注意:第一幅圖爲無向圖,第二幅圖爲無向有向混合圖。當爲無向圖時,帶權鄰接矩陣爲對稱矩陣。
Dijkstra算法matlab源碼
- 求解一點到另一點的最短距離和路徑,根據Dijkstra算法的求解步驟,可以編寫matlab代碼如下。只需要根據需要求解的圖,得到帶權鄰接矩陣,把鄰接矩陣作爲代碼的輸入,就可以求得一點到另一點的最短距離和路徑:
tulun1.m
weight = [0 2 8 1 Inf Inf Inf Inf Inf Inf Inf;
2 0 6 Inf 1 Inf Inf Inf Inf Inf Inf;
8 6 0 7 5 1 2 Inf Inf Inf Inf;
1 Inf 7 0 Inf Inf 9 Inf Inf Inf Inf;
Inf 1 5 Inf 0 3 Inf 2 9 Inf Inf;
Inf Inf 1 Inf 3 0 4 Inf 6 Inf Inf;
Inf Inf 2 9 Inf 4 0 Inf 3 1 Inf;
Inf Inf Inf Inf 2 Inf Inf 0 7 Inf 9;
Inf Inf Inf Inf 9 6 3 7 0 1 2;
Inf Inf Inf Inf Inf Inf 1 Inf 1 0 4;
Inf Inf Inf Inf Inf Inf Inf 9 2 4 0;]
[dis,path]=dijkstra(weight,1,11)
dijkstra.m
function [min,path]=dijkstra(w,start,terminal)
n=size(w,1);label(start)=0;f(start)=start;
for i=1:n
if i~=start
label(i)=inf;
end,
end
s(1)=start;u=start;
while length(s)<n
for i=1:n
ins=0;
for j=1:length(s)
if i==s(j)
ins=1;
end,
end
if ins==0
v=i;
if label(v)>(label(u)+w(u,v))
label(v)=(label(u)+w(u,v));
f(v)=u;
end,
end,
end
v1=0;
k=inf;
for i=1:n
ins=0;
for j=1:length(s)
if i==s(j)
ins=1;
end,
end
if ins==0
v=i;
if k>label(v)
k=label(v);
v1=v;
end,
end,
end
s(length(s)+1)=v1;
u=v1;
end
min=label(terminal);
path(1)=terminal;
i=1;
while path(i)~=start
path(i+1)=f(path(i));
i=i+1;
end
path(i)=start;
L=length(path);
path=path(L:-1:1);
注意:修改程序,就只要把tulun1.m程序的鄰接矩陣換一下,以及起始點和終止點換一下即可。