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

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


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值