1. 程式人生 > >最短路徑演算法dijkstra的matlab實現

最短路徑演算法dijkstra的matlab實現

  1. function Dijkstra(Graph, source):

     2

     3      create vertex set Q

     4

     5      for each vertex v in Graph:             // Initialization

     6          dist[v] ← INFINITY                  // Unknown distance from source to v

     7          prev[v] ← UNDEFINED                 // Previous node in optimal path from source

     8          add v to Q                          // All nodes initially in Q (unvisited nodes)

     9

    10      dist[source] ← 0                        // Distance from source to source

    11      

    12      while Q is not empty:

    13          u ← vertex in Q with min dist[u]    // Source node will be selected first

    14          remove u from Q 

    15          

    16          for each neighbor v of u:           // where v is still in Q.

    17              alt ← dist[u] + length(u, v)

    18              if alt < dist[v]:               // A shorter path to v has been found

    19                  dist[v] ← alt 

    20                  prev[v] ← u 

    21

    22      return dist[], prev[]

  2.  

    程式執行在matlab 7.0正常,1為出發節點,有向圖的結構如下:

    最短路徑演算法dijkstra的matlab實現
  3.  

    這裡是我寫的matlab程式。

    %初始化

    MAXNUM=5;

    MAXINT=32767;

    dij=MAXINT*ones(MAXNUM,MAXNUM);

    dij(1,2)=10;

    dij(1,4)=30;

    dij(1,5)=100;

    dij(2,3)=50;

    dij(3,5)=10;

    dij(4,3)=20;

    dij(4,5)=60;

    dij(1,1)=0;

    dij(2,2)=0;

    dij(3,3)=0;

    dij(4,4)=0;

    dij(5,5)=0;

     

    V=1:MAXNUM;%全部節點

    S=[1];%已分配節點

    m=1;%過渡節點

    ite=2;

    U=2:MAXNUM;%未分配的節點

    %重複,直到U為空

    %將U中的節點不斷新增到S中,同時記錄過渡節點和最短路徑

    dist=dij(1,:);%節點1到其它節點的初始距離值,每次迭代更新一次

    dist1=dist;

    while(length(U)>0)

    dist1(dist1==min(dist1))=[]; %已分配的節點對應的距離從dist1中刪除

    m=find(dist==min(dist1));%記錄dist1當前的最小值在dist中的下標

    S(ite)=m;%將過渡節點加入S

    U(find(U==m))=[];%將過渡節點從U中刪除

    %比較1經過m與不經過m到未分配節點的距離,dist中的距離更新為較小者

    for u=1:length(U)

        if(dist(m)+dij(m,U(u))<dist(U(u)))

            dist1(find(dist1==dist(U(u))))=dist(m)+dij(m,U(u));%dist1中的值同步更新

            dist(U(u))=dist(m)+dij(m,U(u));

        end

    end

    ite=ite+1;

    end

    %儲存到每個節點的最短路徑,每行對應每個節點的路徑和最短距離,其實就是將S逆序輸出

     path(1,1)=1;

    for node=2:MAXNUM

        location=find(S==node);

        path(node,1)=node;

        i=2;

        for s=location:-1:2

            if(dij(S(s-1),S(s))~=MAXINT)

             path(node,i)=S(s-1);

             i=i+1;

            end

        end

        path(node,i)=dist(node);

    end

    %TODO:程式中用到了find()方法,這是一個bug,find可能會返回不止一個值,取其中任意一個就行。      

     

    參考----http://www.wutianqi.com/?p=1890

    或者

    https://blog.csdn.net/cxllyg/article/details/7604812