Dijkstra算法matlab代码

 

:求解最短路径的Dijkstra算法

 

二:Dijkstra算法伪代码

      Vs(iN,2):  Vs(iN,1)==1表示顶点iN在集合Vs,Vs(iN,2)存储到iN最短距离。

      Ay(NN,NN):  领接矩阵存储边权。  不可行的路记为无穷大。

      By(NN,NN):  记录到顶点iN最短路径的前一个顶点。

Minp=0;  jn=0;

while (Vs(NN,1)==1)  %顶点jN表示末点。

     for (iN=1:NN)

         if (Vs(iN,1)==1)%从在集合Vs顶点中找出到外顶点的最短路。

              子函数:找出顶点iN 到外的最短路长与 顶点号[minp2,jN];

               If  Minp >minp2

                    Minp=minp2;

                    毁掉前记录,从新记录顶点jN与iNN;

               End

               If  Minp==minp2

                    Minp=minp2;

                    记录顶点jN与iNN;

          End

              End

          End

          %上For循环结束,表找最短路 向前推进一次。

          %记录上面寻找的最短路。

          修改By(jN,iNN)=1;  表示iNN为到jN前一个顶点

          修改Vs(jN,:)      ;

      End

子函数:找出顶点iN 到外的最短路长与 顶点号[minp2,jN];

Function  [jN, Minp2 ]=Minp(AyI, Vs )  

    Minp2=Inf ;

    For  tN=1:length(AyI)

            If  Minp2 >AyI( tN )&&Vs(tN,1)==0

                 Minp2=AyI(tN);

                 jN=tN;

            End

       End

三:代码

   function   f=MinPath()   %记所求起点为0,终点NN

    [NN,Ay]=InitGraph();

    By=zeros(NN);

    Vs=zeros(NN,2);

    Vs(1,1)=1; %起点放入集合Vs

    JiLuQian=zeros(1,NN); is=1; %记录前一顶点

    while  Vs(NN,1)~=1  %结束顶点

        Minp=inf; jN0=0;

        for  iN=1:NN

            if  Vs(iN,1)==1

                 [Minp2,jN]=Minpa(Ay(iN,:),Vs);

                 Minp2=Minp2+Vs(iN,2);

                 %寻之后,jN一个;而它前一个顶点可能有多个

                 if  Minp>Minp2

                     Minp=Minp2; jN0=jN;

                     is=1;  JiLuQian(1,is)=iN; continue ;         

                 end

                 if  Minp ==Minp2&jN0==jN;

                  %排除同时多条路径相等,但到达顶点不相同

                    is=is+1;  JiLuQian(1,is)=iN;

                 end               

            end

        end

        if Minp>=inf

            disp(‘不能找到通路到所求顶点!’);

            break;

        end

        Vs(jN0,:)=[1,Minp];

        isl=1;

        while isl<=is

          By(jN0,JiLuQian(1,isl))=1  ;

          isl=isl+1;

        end

    end

    %回搜By找最短路径输出

    Search( By, NN, NN);

    f=Vs(NN,2);

end

 

%  顶点到外的最小路经

function [Minp2,jN]=Minpa(AyI,Vs)

       Minp2=inf;

       jN=[];

       for tN=1:length(AyI)

           if Minp2 >AyI(tN) & Vs(tN,1)==0 %找一顶点到外的最小路经

               Minp2=AyI(tN);

               jN=tN;

           end

       end

end

 

%  回寻输出最短路径

function  tp=Search( By, NN,jv)

      tp=1;

      if jv==1

          return;

      end

      it=1;

      while it<NN

          if By(jv,it)~=0

              Search( By, NN, it);

              fprintf(1,’%d–>’,it);

              if jv==NN

                  fprintf(1,’%d\n’,NN);

              end   

          end

          it=it+1;

      end     

end

 

%  建立图形

function [NN,Ay]=InitGraph()

    %顶点列:1     2     3     4    5    %顶点行

    Ay= [  Inf   1     2     Inf   Inf   %  1

           Inf   Inf   Inf   3     5     %  2

           Inf   4     3     Inf   Inf   %  3

           Inf   Inf   Inf   Inf   2     %  4

           Inf   Inf   Inf   Inf   Inf   %  5

        ]

    NN= 5 ; %表示领接矩阵的行列数,即图的顶点数

   

   %    建立图的领接链表

    %NN= input(‘请输入顶点数:’);

    %Ay=zeros(NN);   Ay(:,:)=inf;

    %disp(‘输入弧的起点,终点,权值(输入都为0结束)!’);

    %v0=input(‘v0= ‘);v1=input(‘v1= ‘);dis=input(‘dis=   ‘);

    %while v0~=0|v1~=0|dis~=0

    %    Ay(v0,v1)=dis;

    %  v0=input(‘v0= ‘);v1=input(‘v1= ‘);dis=input(‘dis=   ‘);

    %end   

   %    建立图的领接链表

end

 

 

 

    原文作者:Dijkstra算法
    原文地址: https://blog.csdn.net/zhongguowo/article/details/6638982
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞