摘要:为研究两地点之间距离(或耗时)最短路线规划,采用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.