基于MATLAB的Dijkstra算法实现及案例分析
摘要:為研究兩地點之間距離(或耗時)最短路線規劃,采用MATLAB編程的方法來實現,并利用Floyd算法記錄距離(或耗時)最短路線。在不考慮各種影響因素的情況下,以隨機小樣本數據為例進行演示,求得由起點到目的地的最短耗時路徑和耗時時長。
#1. 經典Dijkstra算法的基本思想及數學模型
##1.1 基本思想
Dijkstra算法的基本思想是從某一點(Vs)開始,依次向外探尋最短路徑。過程中,對于每一個點,都要記下一個相應的數(即該點的標號),若此數表示從起點Vs到該點的最短路徑的權值,則用P標號,反之表示從起點Vs到該點的最短路徑的權值上界,即用T標號,算法的每一步就是修改T標號的點為P標號的點,使賦權有向圖D中的點全部轉化為P標號的點,至多經過p-1步,方可求出從起點Vs到終點的最短路徑。
##1.2 代碼
function mydijkstra(A,sb,db) %A(輸入量)表示鄰接矩陣,sb—起點的標號,db—終點的標號 %B(輸出量)表示所求最短耗時時長矩陣,dist—最短路的耗時時長, mypath—最短路的路徑 m=length(A; for i=2:mfor j=1:(i-1)A(i,j)=A(j,i);end end a=A; for k=1:(m-1)b=[1:(k-1),(k+1):m];kk=length(b);a_id=k;b1=[(k+1):m];kk1=length(b1);while kk>0for j=1:kk1te=A(k,a_id)+A(a_id,b1(j));if te<A(k,b1(j))A(k,b1(j))=te;endendmiid=1;for j=2:kkif A(k,b(j))<A(k,b(miid))miid=j;endenda_id=b(miid);b=[b(1:(miid-1)),b((miid+1:kk))];kk=length(b);if a_id>kmiid1=find(b1==a_id);b1=[b1(1:(miid1-1)),b1((miid1+1):kk1)];kk1=length(b1);endendfor j=(k+1):mA(j,k)=A(k,j);endendm=size(a,1); path=zeros(m);for k=1:mfor i=1:mfor j=1:mif a(i,j)>a(i,k)+a(k,j)a(i,j)=a(i,k)+a(k,j);path(i,j)=k;endendendenddist=a(sb,db);parent=path(sb,:);%從起點sb到終點db的最短路上各頂點的前驅頂點parent(parent==0)=sb;%path中的分量為0,表示該頂點的前驅是起點mypath=db; t=db;while t~=sbp=parent(t); mypath=[p,mypath];t=p;endfprintf('最短路距離矩陣:B\n');B=A,dist,mypath#2.案例——兩地點之間自主駕駛最省時路線選擇
##2. 1繪制公路網絡拓撲結構
為了研究兩地點之間自主駕駛最省時路線,隨機編寫時間長度,如表1所示,并繪制出由點和邊組成的公路網絡靜態拓撲結構,如圖1所示。圖中節點V1為出發點所在地,設定節數量為6,并計算由V1到V6的最短耗時和最短耗時路徑。
##2.2 Dijkstra算法的MATLAB實現結果
Dijkstra 算法的MATLAB實現根據上文繪制的公路網絡靜態拓撲結構關系以及圖中所標的道路實際耗時長度,運用MATLAB 編程軟件來實現Dijkstra最短路徑算法,并利用Floyd算法記錄最短耗時線路。由軟件可求得,由V1到任意一點的最短耗時路徑和耗時時長,如表2所示。
在天氣、路況等各種因素的影響下,從V1到V6點的最省時路線為:V1,V3,V6,時間為16分鐘,具體如圖2所示。
參考文獻
[1] 曾慶福,王孟平.基于MATLAB編程Dijkstra算法的消防救援最佳路線研究[J].武警學院學報,2018,34(06):9-13.
[2] 曹旭. 旅游線路優化設計研究[D]. 西北民族大學, 2012.
總結
以上是生活随笔為你收集整理的基于MATLAB的Dijkstra算法实现及案例分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IAR软件调试延时时间
- 下一篇: springboot定时任务