📄 wen2.m
字号:
clc,clear
%输入起始站点A
A=input('the beginning:\nS','s');
%输入目的站点B
B=input('the end:\nS','s');
%将输入的字符转数据化为数值数据
A=sscanf(A,'%d');
B=sscanf(B,'%d');
%地铁T1线,下行线是上行线原路返回
T1=[01 02 03 04 05 06 07 08 09 10 ...
11 12 13 14 15 16 17 18 19 20 21 22 23];
%地铁T2线,环形
T2=[24 25 26 12 27 28 29 30 31 32 18 33 ...
34 35 36 37 38 39 24];
%将处理后的公汽线路信息读入
s=xlsread('gongjiao.xls','Sheet2');
%将处理后的地铁T1、T2线换乘公汽信息读入
b=xlsread('data.xls','Sheet3');
% A=3359;B=1828;
% A=1557;B=481;
% A=971;B=485;
% A=4;B=73;
% A=148;B=485;
% A=87;B=3676;
nb=size(b,1);mb=size(b,2);
n=size(s,1);
m=size(s,2);
i=1;k=0;a=zeros(n/2,m/2);
%公汽线路处理,生成线路矩阵
while i<=n-3
k=k+1;
a(k,1)=s(i+1,1);
a(k,2:m+1)=s(i+2,:);
k=k+1;
a(k,1)=s(i+1,1);
a(k,2:m+1)=s(i+3,:);
i=i+4;
end
%计算每条公汽线路长度
length_a=zeros(n/2,1);
for i=1:n/2
for j=1:m
if a(i,j)==0
length_a(i)=j;break;
end
end
end
length_a=length_a-2;
%一次转乘
%求得地铁站点对应始发点线路及对应目的地线路
m0=0;n0=0;
sdian=[];zdian=[];
for i=2:nb
for j=1:mb
if b(i,j)~=0
%调用函数luxian_fen(A,a)选取经过地铁站点b(i,j)的路线
[aa,numa]=luxian_fen(b(i,j),a);
p=length(aa);
for k=1:p
for t=2:length_a(aa(k))+1
%判断始发站点是否能够经过地铁站点b(i,j)的线路aa(k)到达地铁站b(i,j)
if a(aa(k),t)==A&((numa(k)>=t&a(aa(k),1)<10)|a(aa(k),1)>10)
m0=m0+1;
%记录地铁站点b(i,j)、公汽线路、始发站点A在线路aa(k)中的位置t及地铁站i
sdian(m0,:)=[b(i,j) ceil(aa(k)/2) t i];
%费用及站点数计算
if abs(numa(k)-t)==0
sf(m0)=0;
end
if mod(a(aa(k),1),10)==1&abs(numa(k)-t)~=0
sf(m0)=1;
snum(m0)=mod(numa(k)-t+length_a(aa(k)),length_a(aa(k)));
elseif a(aa(k),1)==2
snum(m0)=numa(k)-t;
sf(m0)=mod(ceil((numa(k)-t)/20),3);
elseif a(aa(k),1)==12
snum(m0)=min(numa(k)-t,length_a(aa(k))-(numa(k)-t));
sf(m0)=mod(ceil(snum(m0)/20),3);
end
%
end
%判断经过地铁站点b(i,j)的线路aa(k)是否能够到达目的站点B
if a(aa(k),t)==B&((numa(k)<=t&a(aa(k),1)<10)|a(aa(k),1)>10)
n0=n0+1;
%记录地铁站点b(i,j)、公汽线路、始发站点A
%在线路aa(k)中的位置t及地铁站i
zdian(n0,:)=[b(i,j) ceil(aa(k)/2) t i];
%公汽费用及站点数计算
if abs(numa(k)-t)==0
sf(m0)=0;
end
if mod(a(aa(k),1),10)==1&abs(numa(k)-t)~=0
zf(n0)=1;
znum(n0)=mod(t-numa(k)+length_a(aa(k)),length_a(aa(k)));
elseif a(aa(k),1)==2
znum(n0)=t-numa(k);%公汽站点数计算
zf(n0)=mod(ceil((t-numa(k))/20),3);
elseif a(aa(k),1)==12
%公汽站点数计算
znum(n0)=min(t-numa(k),length_a(aa(k))-(t-numa(k)));
zf(n0)=mod(ceil(num(n0)/20),3);
end
end
%
end
end
end
end
end
%乘车路径选择
k0=0;road=[];zhan=[];fei1=[];num0=[];
for i=1:m0
k=0;
if sdian(i,4)<=23
k=1;
else k=2;
end
for j=1:n0
%判断经过地铁线路T2的特殊情况
if sdian(i,4)==12&zdian(j,4)==18|sdian(i,4)==18 ...
&zdian(j,4)==12|sdian(i,4)==12&zdian(j,4)>23|sdian(i,4)==18 ...
&zdian(j,4)>23|zdian(j,4)==12&sdian(i,4)>23|zdian(j,4)==18&sdian(i,4)>23
%数据筛选,避免重复记录
mm=0;
for e=1:k0
if zhan(e,2)==sdian(i,1)&zhan(e,3)==sdian(i,4) ...
&zhan(e,4)==zdian(j,4)&zhan(e,5)==zdian(j,1) ...
&road(e,1)==sdian(i,2)&road(e,2)==zdian(j,2)
mm=1;
end
end
if mm==1
continue;
end
k0=k0+1;
%记录所经地铁站点数
num20(k0,1)=xuanze(sdian(i,4),zdian(j,4));
%记录途经线路
road(k0,:)=[sdian(i,2) k zdian(j,2)];
%记录路线详细信息:始发点、公汽换乘地铁的公汽站点
%及地铁站点、地铁换乘公汽的地铁站点及公汽站点、目的地
zhan(k0,:)=[A sdian(i,1) sdian(i,4) zdian(j,4) zdian(j,1) B];
%费用计算
fei1(k0,1)=sf(i)+zf(j)+3;
%站点数计算
num0(k0,1)=snum(i)+znum(j)+num20(k0);
end
%地铁换乘一次情况
if zdian(j,4)<=23&k==1|zdian(j,4)>23&k==2
%数据筛选,避免重复记录
mm=0;
for e=1:k0
if zhan(e,2)==sdian(i,1)&zhan(e,3)==sdian(i,4) ...
&zhan(e,4)==zdian(j,4)&zhan(e,5)==zdian(j,1) ...
&road(e,1)==sdian(i,2)&road(e,2)==zdian(j,2)
mm=1;
end
end
if mm==1
continue;
end
k0=k0+1;
%记录所经地铁站点数
num20(k0,1)=xuanze(sdian(i,4),zdian(j,4));
%记录途经线路
road(k0,:)=[sdian(i,2) k zdian(j,2)];
%记录路线详细信息:始发点、公汽换乘地铁的公汽站点
%及地铁站点、地铁换乘公汽的地铁站点及公汽站点、目的地
zhan(k0,:)=[A sdian(i,1) sdian(i,4) zdian(j,4) zdian(j,1) B];
%费用及站点数计算
fei1(k0,1)=sf(i)+zf(j)+3;num0(k0,1)=snum(i)+znum(j)+num20(k0);
end
end
end
%输出路线、所经站点、费用及所经站点数
road,zhan,fei1,num0
%转乘两次情况的乘车线路选择与记录
k0=0;road2=[];zhan2=[];fei2=[];num1=[];
for i=1:m0
for j=1:n0
%地铁线路T1换乘地铁线路T2情况
if sdian(i,4)<=23&zdian(j,4)>23
%数据筛选,避免重复记录
mm=0;
for e=1:k0
if zhan2(e,2)==sdian(i,1)&zhan2(e,3)==sdian(i,4) ...
&zhan2(e,4)==zdian(j,4)&zhan2(e,5)==zdian(j,1) ...
&road2(e,1)==sdian(i,2)&road2(e,2)==zdian(j,2)
mm=1;
end
end
if mm==1
continue;
end
k0=k0+1;
%记录所经地铁站点数
num2(k0,1)=xuanze(sdian(i,4),zdian(j,4));
%记录途经线路
road2(k0,:)=[sdian(i,2) 1 2 zdian(j,2)];
%记录路线详细信息:始发点、公汽换乘地铁的公汽站点
%及地铁站点、地铁换乘公汽的地铁站点及公汽站点、目的地
zhan2(k0,:)=[A sdian(i,1) sdian(i,4) zdian(j,4) zdian(j,1) B];
%费用及站点数计算
fei2(k0,1)=sf(i)+zf(j)+3;num1(k0,1)=snum(i)+znum(j)+num2(k0);
%地铁线路T2换乘地铁线路T1情况
elseif sdian(i,4)>23&zdian(j,4)<=23
%数据筛选,避免重复记录
mm=0;
for e=1:k0
if zhan2(e,2)==sdian(i,1)&zhan2(e,3)==sdian(i,4) ...
&zhan2(e,4)==zdian(j,4)&zhan2(e,5)==zdian(j,1) ...
&road2(e,1)==sdian(i,2)&road2(e,2)==zdian(j,2)
mm=1;
end
end
if mm==1
continue;
end
%记录数据,同上
k0=k0+1;num2(k0,1)=xuanze(sdian(i,4),zdian(j,4));
road2(k0,:)=[sdian(i,2) 2 1 zdian(j,2)];
zhan2(k0,:)=[A sdian(i,1) sdian(i,4) zdian(j,4) zdian(j,1) B];
fei2(k0,1)=sf(i)+zf(j)+3;num1(k0,1)=snum(i)+znum(j)+num2(k0);
end
end
end
%输出路线、所经站点、费用及所经站点数
road2,zhan2,fei2,num1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -