matlab上实现Dijkstra算法找两点最短路径代码

Dijkstra算法就不多解释了,这个代码我是在论文实验里用到了,主要是用来找两个路由节点之间的最短路径。

代码写的比较随意。。。

function [ans] = djk(adj,start,des)
%% adj 所有节点构成的一个邻接矩阵
%% start 源节点序列号
%% des  目的节点序列号
%% ans  源节点到目的节点的路径长度
U=1:length(adj);        %没有求出的最短路径节点的集合
next=ones(length(adj),1)*-1;
U(find(U==start))=[];
S=start;                %已经求出最短路径的节点集合
dis=adj(start,:);
curdis=0;
lastnodes=ones(1,length(dis));
lastnodes=lastnodes*start;
while length(S)<length(adj)
    mindis=min(dis(U));
    if mindis==inf
        disp('未完成');
        break
    end
    curdis=curdis+mindis;
    [r,index]=find(dis==mindis,1);
    S=[S,index];
    U(find(U==index))=[];
    lastpath=lastnodes(index);
    next(index,1)=lastpath;
    if index==des
        break;
    end
    
    for k=1:length(U)
     if(curdis+adj(index,U(k))<dis(U(k)))
         dis(U(k))=curdis+adj(index,U(k));
         lastnodes(U(k))=index;
     end
    end
end

    ans=0;
   while des~=start
      str=[num2str(next(des)),'->',num2str(des)];
     disp(str);
      if next(des)<0
         disp('找不到合适路径');
         break;
     end
     ans=adj(next(des),des)+ans;
     des=next(des);
   end

简单的测试一下:
邻接矩阵如下:
matlab上实现Dijkstra算法找两点最短路径代码_第1张图片

a=zeros(14);
a(1,2)=50;a(1,3)=60;
a(2,4)=65;a(2,5)=40;
a(3,4)=52;a(3,7)=45;
a(4,5)=50;a(4,6)=30;a(4,7)=42;
a(5,6)=70;a(6,10)=88;a(10,11)=87;a(11,14)=98;
a=a+a';a(find(a==0))=inf
for i=1:length(a)
    a(i,i)=0;
end

djk(a,1,14)

输出结果:
由节点1 出发 到节点 14
matlab上实现Dijkstra算法找两点最短路径代码_第2张图片

由节点5出发到节点14
matlab上实现Dijkstra算法找两点最短路径代码_第3张图片

由节点7 到12
matlab上实现Dijkstra算法找两点最短路径代码_第4张图片

你可能感兴趣的:(论文)