最优化问题一直是人们最想解决的问题,怎样解决旅行商问题、邮递员问题?欧拉为了解决七桥问题,创建了图论。后人在它的基础上解决最短路径问题,也就是我们的邮递员问题,为了解决此问题,创建Dijkstra算法解决了从定点x0到目标点的最短路径问题。
在学习matlab的过程中,还得学学python,对于提高自己的编程能力有很好的锻炼。
点击下方链接获取python编程资料!
给出定点x0到u的最短距离在网络图之中,程序如下:
clc
clear
%问题:对于无向图实现最短距离
%初始值
%Dijkstra算法应用到网络中的最短距离
%求解出父亲点、最短路径
%创建时间:2020.10.18
w=[0 1 1 1 inf inf inf inf; %创建邻接矩阵
1 0 inf 1 1 inf inf inf;
1 inf 0 1 inf inf 1 inf;
1 1 1 0 1 1 1 inf;
inf 1 inf 1 0 1 inf 1;
inf inf inf 1 1 0 1 1;
inf inf 1 1 inf 1 0 1;
inf inf inf inf 1 1 1 0];
n=size(w,1);
w1=w(1,:);
for i =1:n
l(i)=w1(i); %赋初值l(v),l(u0)=0,l(u1)=2,l(u2)=1,l(u3)=8,l(u4)=inf,...
z(i)=1; %这里所求的z(i)-1就是父亲点的意思
end
s=[];
s(1)=1; %1代表u0
u=s(1); %这里对于我们的u的初始值选取
k=1;
%进行循环更新l(v)、z(v)
while k
%更新l(v)、z(v)
for i=1:n
for j=1:k
if i~=s(j)
if l(i)>l(u)+w(u,i)
l(i)=l(u)+w(u,i);
z(i)=u;
end
end
end
end
%第n次更新
ll=l; %将更新后的l赋值给ll
for i=1:n
for j=1:k
if i~=s(j) %点集出列,不能选择
ll(i)=ll(i); %边权不改变
else
ll(i)=inf; %无关联的情况下当前点与其余点的边权为无穷
end
end
end
lv=inf; %边权赋予给无穷
for i=1:n %循环v0到v7寻找v0到v7的最短路
if ll(i)
lv=ll(i);
v=i; %顶点集更新,并且赋予给i
end
end
lv; %输出边权
v; %输出顶点集
s(k+1)=v; %出列点
k=k+1;
u=s(k);
end
l
z
输出结果:
l =
0 1 1 1 2 2 2 3
z =
1 1 1 1 2 4 3 5
其中l代表的是最短路径距离,z表示的是最短路径走向。从上述结果可知,路径为,
v1--v2-v5-v8;其最短距离为1+2+3=6;所以得知该网络图的最短路距离径为6。
对于Dijkstra算法得理解父亲点与距离权重,这是理解算法原理的基础!此代码的好处在于,你根据自己的问题,相应的把邻接矩阵改了就可以用!
欢迎关注知乎,留言交流!