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

來源:酷知科普網 1.19W

最短路徑演算法dijkstra的matlab程式。

操作方法

(01)你需要先理解dijkstra的演算法原理。虛擬碼描述可參考維基baike:function Dijkstra(Graph, source):23      create vertex set Q45      for each vertex v in Graph:             // Initialization6          dist[v] ← INFINITY                  // Unknown distance from source to v7          prev[v] ← UNDEFINED                 // Previous node in optimal path from source8          add v to Q                          // All nodes initially in Q (unvisited nodes)910      dist[source] ← 0                        // Distance from source to source1112      while Q is not empty:13          u ← vertex in Q with min dist[u]    // Source node will be selected first14          remove u from Q1516          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 found19                  dist[v] ← alt20                  prev[v] ← u2122      return dist[], prev[]

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

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

(03)這裡是我寫的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;%將過渡節點加入SU(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));endendite=ite+1;end%儲存到每個節點的最短路徑,每行對應每個節點的路徑和最短距離,其實就是將S逆序輸出path(1,1)=1;for node=2:MAXNUMlocation=find(S==node);path(node,1)=node;i=2;for s=location:-1:2if(dij(S(s-1),S(s))~=MAXINT)path(node,i)=S(s-1);i=i+1;endendpath(node,i)=dist(node);end%TODO:程式中用到了find()方法,這是一個bug,find可能會返回不止一個值,取其中任意一個就行。

特別提示

演算法時間複雜度未必最小

程式不保證不含任何bug,此乃作者本人的程式碼共享,使用請新增引用。

熱門標籤