最短路求两点间最短路径的改进的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实现的主要内容,如果未能解决你的问题,请参考以下文章

a*算法求最短路径和floyd还有dijsktra算法求最短路径的区别?

求图中任意两点之间最短路径有啥算法?

最短路求两点间最短路的Floyd算法及其matlab实现

用C或C++实现求最短路径的Dijkstra算法

Dijkstra算法求单源最短路

用Dijkstra算法求最短路径的MATLAB程序