求带便函数权值的最短路径
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