附录二
function vvdt(start,aim) [fee d C]=data(); for i=1:39
if find(C{i}==start) start=10000+start; end
if find(C{i}==aim) aim=10000+aim; end end
if numel(find(d==start))==0
fprintf('The path cannot be found!'); else
[row col]=find(d==start); for i=1:numel(row) [rows
cols(i,1:numel(find(d(row(i),:)==start)))]=find(d(row(i),:)==start); end
F=creatF(start,row,cols,d); end
if ismember(aim,F(:,2)) num=find(F(:,2)==aim); line=round(F(num,3)-0.5); long=F(num,1)-1; time=3*F(num,1);
value=val(0,F(num,:),fee); updown=ud(F(num,3));
n={start,updown,line,aim,long,time,value}; print(n); else
size_F=size(F); cha=1; Fc={}; n={};
for i=1:size_F(1)
[row1 col1]=find(d==F(i,2)); [rows cols]=find(d==start); row1=setdiff(row1,rows); if numel(row1)>0 for j=1:numel(row1)
col1(j,1:numel(find(d(row1(j),:)==F(i,2))))=find(d(row1(j),:)==F(i,2));
end
F1=creatF(F(i,2),row1,col1,d); Fc=[Fc F1];
if ismember(aim,F1(:,2)) num1=find(F1(:,2)==aim); line1=round(F(i,3)-0.5); mid1=F(i,2); long1=F(i,1)-1;
line2=round(F1(num1,3)-0.5); long2=F1(num1,1)-1;
time=3*(F(i,1)+F1(num1,1))+5; value=val(0,F(i,:),fee);
value=val(value,F1(num1,:),fee); updown1=ud(F(i,3)); updown2=ud(F1(num1,3));
n(cha,:)={start,updown1,line1,mid1,long1,updown2,line2,aim,long2,time,value};
cha=cha+1; end end end if cha==1
fprintf('The path with once chang cannot be found!\\n'); sizec=size(Fc); kind=1;
for j=1:sizec(2) siz=size(Fc{j}); Fj=Fc{j}; for k=1:siz(1)
[row2 col2]=find(d==Fj(k,2)); [rows cols]=find(d==Fj(1,2)); [row col]=find(d==start); row2=setdiff(row2,rows); row2=setdiff(row2,row); if numel(row2)>0 for l=1:numel(row2)
col2(l,1:2)=find(d(row2(l),:)==Fj(k,2)); end
F2=creatF(Fj(k,2),row2,col2,d); if ismember(aim,F2(:,2)) num2=find(F2(:,2)==aim); num1=find(Fj(:,2)==F2(1,2)); num=find(F(:,2)==Fj(1,2));
line1=round(F(num,3)-0.5); line2=round(Fj(num1,3)-0.5); line3=round(F2(num2,3)-0.5); mid1=F(num,2); mid2=Fj(num1,2); long1=F(num,1)-1; long2=Fj(num1,1)-1; long3=F2(num2,1)-1;
time=3*(long1+long2+long3+3)+10; value=val(0,F(num,:),fee); value=val(value,Fj(num1,:),fee); value=val(value,F2(num2,:),fee); updown1=ud(F(num,3)); updown2=ud(Fj(num1,3)); updown3=ud(F2(num2,3));
n(kind,:)={start,updown1,line1,mid1,long1,updown2,line2,mid2,long2,updown3,line3,aim,long3,time,value};
kind=kind+1; end end end end if kind==1
fprintf('The path with twice change cannot be found!\\n');; else
xlswrite('C:\\Users\\Administrator\\Desktop\\all',n,'Sheet2','A1'); minn=n{1,14}; for i=1:kind-1 if n{i,14} for i=1:kind-1 if n{i,14}==minn print(n(i,:)); end end end else xlswrite('C:\\Users\\Administrator\\Desktop\\all',n,'Sheet1','A1'); minn=n{1,10}; for i=1:cha-1 if n{i,10} for i=1:cha-1 if n{i,10}==minn print(n(i,:)); end end end end return function F=creatF(start,rows,cols,d) F=[0 start 0]; n=numel(rows); for j=1:n maxcol=numel(nonzeros(d(rows(j),:))); cn=numel(cols(j,:)); if cn>1 for k=1:cn-1 for i=cols(j,k)+1:cols(j,k+1)-1 x=[i-cols(j,k) d(rows(j),i) rows(j)/2+0.5]; F=[F;x]; end end for i=cols(j,cn)+1:maxcol x=[i-cols(j,cn) d(rows(j),i) rows(j)/2+0.5]; F=[F;x]; end else for k=cols(j)+1:maxcol x=[k-cols(j) d(rows(j),k) rows(j)/2+0.5]; F=[F;x]; end end end size_F=size(F); f=unique(F(:,2)); size_f=size(f); j=0; re=0; for i=1:size_F(1) if ismember(F(i,2),f) f(find(f==F(i,2)))=[]; else if ~ismember(F(i,2),re) j=j+1; re(j)=F(i,2); end end end others=[]; for k=1:j [row col]=find(F(:,2)==re(k)); [minre,where]=min(F(row,1)); where=row(where); other=setdiff(row',where); others=[others other]; end F(others,:)=[]; return function value=val(vl,F,fee) te=importdata('d:\\?òμ???μμ\\×à??\\fee.mat'); if strcmp(fee{round(F(3)-0.5)},'3?a') value=vl+1; else if strcmp(fee{round(F(3)-0.5)},'μ¥ò??±??1?a?£')|F(1)<=20 value=vl+1; else if F(1)>20&F(1)<=40 value=vl+2; else value=vl+3; end end end return function updown=ud(F) if round(F)==F updown='é?'; else updown='??'; end return function print(n) if numel(n)==7