求带便函数权值的最短路径
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
總結
以上是生活随笔為你收集整理的求带便函数权值的最短路径的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 多领导者改进算法的MATLAB仿真
- 下一篇: Markov的仿真