⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wen2.m

📁 07年数学建模竞赛B题
💻 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 + -