您的位置:首页 > 编程语言 > MATLAB

【数学建模集训系列】公交查询系统的matlab实现-加入地铁线T1

2011-08-19 00:41 661 查看
clear,clc
startP=input('请输入起点:');
endP=input('请输入终点:');
%D_index=searchS(startP,subway_index);
load T1_subway;
load SLdata_sl;
load SSdata_con;
road11=[];road12=[];road13=[];road13_1=[];road13_2=[];
[D_index,row]=find(t1_subway==startP);
if ~isempty(D_index) %S1经过T1
road11=[road11;[D_index 6]];
%D_index
else
disp('起点不能直接换乘T1')
%[L,distance,money,time]=direct_arrive(startP,S_mid)
for i=1:size(t1_subway,1)
for j=2:size(t1_subway,2)
if t1_subway(i,j)~=0
%S-S-D(t1)D...
for k=1:520
for m=1:2
if SLmat1(startP,k,m)>0&&SLmat1(t1_subway(i,j),k,m)>0&&(SLmat1(t1_subway(i,j),k,m)-SLmat1(startP,k,m)>0)
road12=[road12;[k,m,t1_subway(i,j),t1_subway(i,1),(SLmat1(t1_subway(i,j),k,m)-SLmat1(startP,k,m))*3+6]];
% L 上/下 S 地铁
end
end
end
%S-S-S-D(t1)D...
for s1=1:3957
if SS_matrix_con(startP,s1)==1&&SS_matrix_con(s1,t1_subway(i,j))==1
for k=1:520
for m=1:2
if SLmat1(startP,k,m)>0&&SLmat1(s1,k,m)>0&&(SLmat1(s1,k,m)-SLmat1(startP,k,m)>0)
road13_1=[road13_1;[k m s1 (SLmat1(s1,k,m)-SLmat1(startP,k,m))*3]];
end
end
end
for k=1:520
for m=1:2
if SLmat1(t1_subway(i,j),k,m)>0&&SLmat1(s1,k,m)>0&&(SLmat1(t1_subway(i,j),k,m)-SLmat1(s1,k,m)>0)
road13_2=[road13_2;[k m t1_subway(i,j) t1_subway(i,1) (SLmat1(t1_subway(i,j),k,m)-SLmat1(s1,k,m))*3]];
end
end
end
for m=1:size(road13_1,1)
for n=1:size(road13_2,1)
result=[road13_1(m,:) road13_2(n,:)];
road13=[road13;result];
end
end
%road13=[road13;[ ]];
end
road13_1=[];road13_2=[];
end
end
end
end
%road12
%road13;
end
if size(road11,1)~=0 road11_t=[ones(size(road11,1),1),6*ones(size(road11,1),1),road11(:,1)];
else road11_t=[];
end
if size(road12,1)~=0   road12_t=[2*ones(size(road12,1),1),road12(:,5),road12(:,4)];
else road12_t=[];
end
if size(road13,1)~=0
road13_t=[3*ones(size(road13,1),1),road13(:,4)+road13(:,9)+6+5,road13(:,8)];
else road13_t=[];
end
road123_t=sortrows([road11_t;road12_t;road13_t],2);
%road11,road12,road13
%---------------------------------后半段------------------------------------
road21=[];road22=[];road23=[];road23_1=[];road23_2=[];
[D_index,row]=find(t1_subway==endP);
if ~isempty(D_index) %S1经过T1
road21=[road21;[D_index 6]];
%D_index
else
disp('不能直接换乘T1到终点')
%[L,distance,money,time]=direct_arrive(startP,S_mid)
for i=1:size(t1_subway,1)
for j=2:size(t1_subway,2)
if t1_subway(i,j)~=0
%S-S-D(t1)D...
for k=1:520
for m=1:2
if SLmat1(endP,k,m)>0&&SLmat1(t1_subway(i,j),k,m)>0&&(SLmat1(endP,k,m)-SLmat1(t1_subway(i,j),k,m)>0)
road22=[road22;[t1_subway(i,1),t1_subway(i,j),m,k,(SLmat1(endP,k,m)-SLmat1(t1_subway(i,j),k,m))*3+7]];
% L 上/下 S 地铁
end
end
end
%S-S-S-D(t1)D...
for s2=1:3957
if SS_matrix_con(endP,s2)==1&&SS_matrix_con(s2,t1_subway(i,j))==1
for k=1:520
for m=1:2
if SLmat1(endP,k,m)>0&&SLmat1(s2,k,m)>0&&(SLmat1(endP,k,m)-SLmat1(s2,k,m)>0)
road23_1=[road13_1;[s2 m k (SLmat1(endP,k,m)-SLmat1(s2,k,m))*3]];
end
end
end
for k=1:520
for m=1:2
if SLmat1(t1_subway(i,j),k,m)>0&&SLmat1(s2,k,m)>0&&(SLmat1(s2,k,m)-SLmat1(t1_subway(i,j),k,m)>0)
road23_2=[road23_2;[t1_subway(i,1) t1_subway(i,j) k m (SLmat1(s2,k,m)-SLmat1(t1_subway(i,j),k,m))*3]];
end
end
end
for m=1:size(road23_2,1)
for n=1:size(road23_1,1)
result=[road23_2(m,:) road23_1(n,:)];
road23=[road23;result];
end
end
%road13=[road13;[ ]];
end
road23_1=[];road23_2=[];
end
end
end
end
%road12
%road23
end

if size(road21,1)~=0  road21_t=[ones(size(road21,1),1),6*ones(size(road21,1),1),road21(:,1)];
else road21_t=[];
end
if size(road22,1)~=0   road22_t=[2*ones(size(road22,1),1),road22(:,5),road22(:,1)];
else road22_t=[];
end
if size(road23,1)~=0
road23_t=[3*ones(size(road23,1),1),road23(:,5)+road23(:,9)+7+5,road23(:,1)];
else road123_t2=[];
end
road123_t2=sortrows([road21_t;road22_t;road23_t],2);
%--------------------前一段排序---------------------------------------------
road123_t_min=[];
a=road123_t(:,3);
%road123_t
for i=1:23
m=find(a==i);
if ~isempty(m)
road123_t_min=[road123_t_min;road123_t(m(1),:)];
end
end
%road123_t1
%--------------------后一段排序---------------------------------------------
road123_t2_min=[];
a=road123_t2(:,3);
%road123_t
for i=1:23
m=find(a==i);
if ~isempty(m)
road123_t2_min=[road123_t2_min;road123_t2(m(1),:)];
end
end
%road123_t2(1:20,:);
%road123_t2_min;
%--------------------------接前后矩阵---------------------------------------
road123_con=[];
for m=1:size(road123_t_min,1)
for n=1:size(road123_t2_min,1)
result=[road123_t_min(m,:) road123_t2_min(n,:)];
road123_con=[road123_con;result];
end
end
road123_con_dif=[];road123_con_time=[];
for i=1:size(road123_con,1)
if  road123_con(i,3)~=road123_con(i,6)
road123_con_dif=[road123_con_dif;road123_con(i,:)];
end
end
%------按时间排序----------------
road123_con_time=sortrows([road123_con_dif,abs(road123_con_dif(:,3)-road123_con_dif(:,6))*2.5+road123_con_dif(:,2)+road123_con_dif(:,5)],7);
road_t1=road123_con_time(1,:);
%----输出时间最短的路线-------------------------------------------------------------
switch road123_con_time(1,1)
case 1
%road123_con_time(1,3)
disp(['先转到D' num2str(road123_con_time(1,3)) '乘坐T1'])
case 2
for i=1:size(road12,1)
if road12(i,4)==road123_con_time(1,3)&&road12(i,5)==road123_con_time(1,2)
%road12(i,:)%前一段信息
if road12(i,2)==1
w='上行' ;
else w='下行' ;
end
disp(['先通过L' num2str(road12(i,1)) w '到S' num2str(road12(i,3)) '再转到D' num2str(road12(i,4)) '乘坐T1'])
end
end
case 3
for i=1:size(road13,1)
if road13(i,8)==road123_con_time(1,3)&&road13(i,4)+road13(i,9)+13==road123_con_time(1,2)
%road12(i,:)%前一段信息
if road13(i,2)==1
w1='上行' ;
else w1='下行' ;
end
if road13(i,2)==1
w2='上行' ;
else w2='下行' ;
end
disp(['先通过L' num2str(road13(i,1)) w1 '到S' num2str(road13(i,3)) '再由L' num2str(road13(i,5)) w2 '到S' num2str(road13(i,7)) '再转到D' num2str(road13(i,8)) '乘坐T1'])
end
end
end

switch road123_con_time(1,4)
case 1
%road123_con_time(1,3)
disp(['到D' num2str(road123_con_time(1,6)) '乘坐T1'])
case 2
for i=1:size(road22,1)
if road22(i,4)==road123_con_time(1,3)&&road22(i,5)==road123_con_time(1,5)
%road12(i,:)%前一段信息
if road22(i,3)==1
w='上行' ;
else w='下行' ;
end
disp(['到D' num2str(road22(i,1)) '转S' num2str(road22(i,2)) '通过L' num2str(road22(i,4)) w '到终点'])
end
end
case 3
for i=1:size(road23,1)
if road23(i,1)==road123_con_time(1,6)&&road23(i,5)+road23(i,9)+12==road123_con_time(1,5)
%road12(i,:)%前一段信息
if road23(i,4)==1
w1='上行' ;
else w1='下行' ;
end
if road23(i,7)==1
w2='上行' ;
else w2='下行' ;
end
disp(['到D' num2str(road23(i,1)) '转S' num2str(road23(i,2)) '通过L' num2str(road23(i,3)) w1 '到S' num2str(road23(i,6)) '通过L' num2str(road23(i,8)) w2 '到终点---时间:' num2str(road123_con_time(1,7))])
end
end
end


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  matlab matrix distance input
相关文章推荐