最短路求两点间最短路径的改进的Dijkstra算法及其matlab实现
Posted 这是小魔仙的账户
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最短路求两点间最短路径的改进的Dijkstra算法及其matlab实现相关的知识,希望对你有一定的参考价值。
代码来源:《图论算法及其matlab实现》(北京航空航天出版社)
P18
书中提出了基于经典Dijkstra算法改进的两种算法。
其中算法Ⅱ的效率较高。
代码如下:
1 function a=Dijk(a) 2 %a(输入量)表示图的邻接矩阵 3 %a(输出量)表示所求最短路径的距离矩阵 4 5 %建立邻接矩阵,若不还是对称矩阵,则变为对称矩阵 6 n=length(a); 7 for i=2:n 8 for j=1:(i-1) 9 a(i,j)=a(j,i); 10 end 11 end 12 13 %The main program 14 15 %步骤2.1 16 for k=1:(n-1) 17 b=[1:(k-1),(k+1):n]; 18 kk=length(b); 19 a_id=k; 20 b1=(k+1):n; 21 kk1=length(b1); 22 %步骤2.2.1 23 while kk>0 24 for j=1:kk1 25 te=a(k,a_id)+a(a_id,b1(j)); 26 if te<a(k,b1(j)) 27 a(k,b1(j))=te; 28 end 29 end 30 31 miid=1; 32 33 34 for j=2:kk 35 if a(k,b(j))<a(k,b(miid)) 36 miid=j; 37 end 38 end 39 40 a_id=b(miid); 41 b=[b(1:(miid-1)),b((miid+1):kk)]; 42 kk=length(b); 43 if a_id>k 44 miid1=find(b1==a_id); 45 b1=[b1(1:(miid1-1)),b1((miid1+1):kk1)]; 46 kk1=length(b1); 47 end 48 end 49 50 51 for j=(k+1):n 52 a(j,k)=a(k,j); 53 end 54 end
验证:
n=12; a=ones(n)+inf; for i=1:n a(i,i)=0; end a(1,2)=5; a(2,3)=8; a(2,6)=5; a(3,4)=3; a(3,9)=10; a(4,5)=5; a(4,7)=3; a(5,6)=2; a(7,8)=2; a(8,9)=4; a(8,11)=6; a(9,10)=3; a(10,11)=5; a(10,12)=3; Dijk(a)
运行结果如下:
ans = 0 5 13 16 12 10 19 21 23 26 27 29 5 0 8 11 7 5 14 16 18 21 22 24 13 8 0 3 8 10 6 8 10 13 14 16 16 11 3 0 5 7 3 5 9 12 11 15 12 7 8 5 0 2 8 10 14 17 16 20 10 5 10 7 2 0 10 12 16 19 18 22 19 14 6 3 8 10 0 2 6 9 8 12 21 16 8 5 10 12 2 0 4 7 6 10 23 18 10 9 14 16 6 4 0 3 8 6 26 21 13 12 17 19 9 7 3 0 5 3 27 22 14 11 16 18 8 6 8 5 0 8 29 24 16 15 20 22 12 10 6 3 8 0
以上是关于最短路求两点间最短路径的改进的Dijkstra算法及其matlab实现的主要内容,如果未能解决你的问题,请参考以下文章