计算带权图中的最短路径通常使用图论中的最短路径算法,最著名的算法之一是Dijkstra算法和Bellman-Ford算法。这些算法用于找到从一个起始节点到所有其他节点的最短路径。下面我将简要介绍一下Dijkstra算法,它适用于没有负权边的情况。如果你的图中包含负权边,请使用Bellman-Ford算法。
Dijkstra算法:
Dijkstra算法用于求解带权有向图或无向图中的最短路径。以下是Dijkstra算法的基本步骤:
-
初始化:将起始节点的距离设置为0,将所有其他节点的距离设置为无穷大。将起始节点添加到一个待处理的节点集合中。
-
选择距离最短的节点:从待处理的节点集合中选择距离最短的节点,将其标记为已处理,并从待处理集合中移除。
-
更新邻接节点的距离:对于已处理节点的邻接节点,计算通过当前节点到达邻接节点的距离。如果这个距离小于邻接节点当前的距离,则更新邻接节点的距离。
-
重复步骤2和步骤3,直到所有节点都被标记为已处理,或者无法再找到距离更短的节点为止。
-
最终,你将获得从起始节点到所有其他节点的最短路径和距离。
function [distance,path]=zuiduanlujing(D,start1,terminal);
%求带便函数权值的最短路径
%嵌套调用函数
[B,F]=datainfun; %获得路段距离和公路铁路性质数据数据
for k=1:7
39+k
for t=1:15
start1=39+k;
terminal=t;
D=B; % 赋值
%function [d,EE]=dijkstra(D,start1,end)
[m,n]=size(D);
path=[];
d=inf.*ones(1,m);
d(1,start1)=0; %用以标记此刻各顶点离集合距离,初始为inf
dd=zeros(1,m); %标记顶点集合,初始为零
dd(1,start1)=1;
ind=zeros(1,m); %给逆向路径数组
y=start1;
length1=zeros(1,m); %定义初始的各位置的路径长度(包含运输费用的计算)
%DD=zeros(m,m);
%DD(y,y)=1;
time=0;
while length(find(dd==1))<m %当集合未包含所有的顶点时
for i=1:m %以y为起始点时更新d(i)
if dd(i)==0
temp=length1(i); %记录此长度值
if(F(y,i)==1)
length1(i)=length1(y)+B(y,i); %计算长度
else
length1(i)=0; %铁路运输结束
end
t=d(i); %标记记录
% volum=(d(y)-fun(length(y))); %就算公路段前的运输费
d(i)=min(d(i),fun(length1(i)).*F(y,i)+(d(y)-fun(length1(y))*F(y,i))+D(y,i)*~F(y,i)); %更新tag,包含多方面
if(t>d(i)) %若变化后d(i)值小于原来值
ind(i)=y; %最短路径的前一节点
else
length1(i)=temp; %恢复长度
end
end
end
ddd=inf;
for i=1:m
if dd(i)==0&&d(i)<ddd %需要记录所有值
ddd=d(i); %有多个点时,取最后一个
yy=i;
end
end
%yy=find(d==ddd); %找到这样点的坐标
% counter=counter+1;
%DD(y,yy(1,1))=counter;
%DD(yy(1,1),y)=counter;
y=yy;
dd(1,y)=1;
end
here1=terminal;
while 1 %用于输出路径
path(end+1)=terminal;
if ind(terminal)~=0
terminal=ind(terminal);
else
break;
end
end
path=fliplr(path); %正序输出最短路径
distance=d(here1)
end
end
end