公交线路查询系统

公交线路查询系统
公交线路查询系统

2012江西财经大学第四轮数学建模竞赛

B题

公交线路查询系统

参赛队员: 万腾、黄超强、张毅

参赛队编号:2012010

2012年8月22日~8月24日

公交线路查询系统

摘 要

本文将各个公交站点抽象为图论中的有向图,根据不同用户的不同需求建立多目标公交线路查询模型,利用可达矩阵求解得出最佳方案。

本文将乘车人群分为两类,“时间第一”人群以及“换乘第一”人群。“时间第一”人群希望乘车所花费的时间尽量少,而“换乘第一”人群则更倾向于换乘次数尽可能少。在两种乘车方案中,如果换乘次数相差不大(不超过1)而时间相差悬殊(比如相差30分钟)时,“换乘第一”人群则更愿意选择换乘次数少的方案,而“时间第一”人群则会选择乘车时间较少的方案。因此,本文针对上述两类人群,分别给出了最佳乘车方案。

在考虑公汽线路的情况下,本文构造了公汽线路查询模型。依据各个站点的连通情况建立可达矩阵K ,判断出问题一所要求的六对站点都不可直达,至少需要换乘一次。对K 分别进行平方处理和立方处理K K K ?=2,K K K ?=23,根据32K K 和判断出第1、3、4、6四对站点至少需要换乘1次才能到达,第2、5两对站点则至少需要换乘2次才能到达。因此,针对“换乘第一”人群,考虑在换乘次数最少方案下,分别求出各线路的最短到达时间以及换乘次数为104(1)、109(2)、131(1)、86(1)、109(2)、68(1),其中,数字为到达时间,括号内的为换乘次数。针对“时间第一”人群,考虑在乘车时间最少、换乘次数相对较小的情况下,分别求出各线路的最短到达时间为)2(49)2(109)2(70)2(109)2(109)2(67、、、、、,通过两种人群乘车方案的对比,对公汽线路查询模型给出了客观评价。 在综合考虑公汽与地铁线路的情况下,由于同一地铁站对应的任意两个公汽站之间可以通过地铁站换乘且无需支付地铁费,因此,在这种情况下,这两个公汽站虽是通过地铁站换乘,但并没有真正发生换乘。乘客在这种情况下经过两站点时,可以理解为只是步行通过地铁站台这个桥梁互通两公汽站点。

问题二则在考虑了上述乘车方案的情况下,构造了混合公交线路查询模型。用与问题一类似的方法构造公汽与地铁之间的可达矩阵并对可达矩阵作类似处理。针对“换乘第一”人群,分别求出各线路的最短到达时间以及换乘次数为)1(68)2(109)1(86)1(131)2(109104(1)、、、、、,针对“时间第一”人群,考虑在乘车时间最少、换乘次数相对较小的情况下,分别求出各线路的最短到达时间为)233()2(109)2(70)2(109)2(109)2(67、、、、、。 若知道所有站点之间的步行时间,由于乘客自身因素,乘车方案中步行次数不得多于2次且每次步行时间不能超过20分钟。因此,可以将乘客的每一次步行都当做一次换乘。为体现“换乘”,则在构造可达矩阵时,可以为每一对站点之间的步行时间不超过20分钟且少于行驶时间的站点虚构一个中转站,某几对特殊站点也可共用一个中转站。通过上述的转化,问题三则可利用混合公交线路查询模型求解。

最后,本文对文中所用到的多个模型进行了评价及推广。

关键词:公交线路;自主查询系统;最佳线路;换乘次数;北京奥运会

一问题重述

第29届奥运会明年8月将在北京举行,届时有大量观众到现场观看奥运比赛,公交、地铁向来以其密集的运行时间、便宜的价格被许多人认为是出行首选的交通工具。但是随着城市规模的不断扩大,公交规模随之增加,很多站点难以直达,乘客必须换乘才能到达目的地。且在奥运期间,很多都是外地的游客,他们对北京的公交出行路线并不了解,这就需要研发一种较为完善的公交换乘系统,使人们能在较短时间内得出最优的换乘方案。

需设计这样一个系统,核心是线路选择的模型与算法,从实际情况出发,满足查询者的各种不同需求。需解决如下问题:

1、仅考虑公汽线路,给出任意两公汽站点之间线路选择问题的一般数学模型与算法。并根据附录数据,利用所建模型与算法,求出以下6对起始站→终到站之间的最佳路线。

(1)、S3359→S1828 (2)、S1557→S0481 (3)、S0971→S0485

(4)、S0008→S0073 (5)、S0148→S0485 (6)、S0087→S3676

2、同时考虑公汽与地铁线路,解决以上问题。

3、若知道所有站点之间的步行时间,给出任意两站点之间线路选择问题的数学模型。

二问题分析

经典的最短路径问题只涉及单目标优化,考虑最短旅行时间或距离,已经得到了深入研究,但是,单一目标函数往往很难准确描述现实生活中的问题。比如在此问题中,为使所做的公交线路查询系统更能够满足现实需求,就需要综合考虑最小换乘次数以及最短线路,甚至最小出行成本。

但是,在求解过程中有多个目标函数需要优化,这就拓展出最短路径问题,各个目标之间通常存在冲突,针对某个目标具有优势的解对于另一个目标来说可能并不是最优的,导致多目标最短路径问题一般不存在单一的最优解,而只有满意解。一般的处理方法是对不同的目标进行线性加权或是将某些目标转化为约束条件。然而,对于线性加权法而言,确定权重很困难。

考虑到公交乘客的出行心理,本文将乘车人群分为两类,“时间第一”人群以及“换乘第一”人群。“时间第一”人群最重视乘车所花费的时间,而“换乘第一”人群则更重视换乘次数。在两种乘车方案中,如果换乘次数相差不大(不超过1)而时间相差悬殊(比如相差30分钟)时,“换乘第一”人群则更愿意选择换乘次数少的方案,而“时间第一”人群则会选择乘车时间较小的方案。而两类人群共同考虑的还有出行距离长短。因此,本文在问题求解时分别考虑这两类人群的需求而得出最后结果。

三 模型假设

[1] 假设乘客都难以忍受2次以上的换乘次数; [2] 假设乘客难以忍受20分钟以上的步行; [3] 不考虑发生交通堵塞; [4] 发生线路间切换时,乘客能够在题目设定的时间内到达下一个乘车站点; [5] 公汽或地铁能够在题目设定的时间内到达规定站点。

四 符号说明

L 各个站点邻接矩阵;

j i l , 第i 个站点与第j 个站点的最小通达时间; K 各个站点可达矩阵;

j i k , 第i 个站点与第j 个站点的可达性值;

H 换乘次数;

1h 乘坐非分段票制的公汽的线路数; 2h 乘坐分段票制的公汽的线路数; 3h 乘坐地铁的公汽的线路数;

i d 乘客所坐第i 次单一票制的公汽的站数; i f 乘客所坐第i 次分段票制的公汽的站数; i t 乘客所坐第i 次地铁的站数; T 乘车时间; P 总出行费用;

f P 分段票制的乘车费用;

k W 乘客所走的第k 条线路是否由要求方向可通;

gg 公汽换公汽的次数; gd 公汽换地铁的次数; dd 地铁换地铁的次数; dg 地铁换公汽的次数; b 步行次数; B 步行总时间。

五 公汽线路查询模型

一)数据处理

1、以3957个站点为顶点的邻接矩阵的建立:

Step1 将处理过的“1.1公汽线路信息.txt ”读入到矩阵A 中,A 中每一行代表一

条线路,列数为线路的数目(将双行、环行线路作为一条);每一列为一个站点,列数为站点最多的线路的站点数,其它位置的值为0; Step2 建立一个39573957?的全0矩阵L ,数据类型选择‘int16’,并将非对角

位置的元素置为无穷大,即32767;

Step3 从A 的第一行开始读数据,将第i 个站点到第j 个站点的所需要的时间填

在j i l ,。如果在其它线路上找到的第i 个站点到第j 个站点的所需要的时间比原来的要短,就替换,否则继续;

Step4 将双行和环行的线路拿出来,继续填充矩阵L 。

得出的矩阵L 为:

?

?

???

??

?????=n n n n n n l l l l l l l l l L ,2

,1,,22,11,2,12,11,1 2、以3957个站点为顶点的可达矩阵:

Step1 建立一个39573957?的全0矩阵K ,数据类型选择‘int16’,并将L 中数

据全部复制到K 中;

Step2 将矩阵K 中各个位置上数值为32767的数据换为0; Step3 将矩阵K 中各个位置上数值部位0的数据置为1。

得出的矩阵K 为:

?

?

???

????

???=n n n n n n k k k k k k k k k K ,2

,1

,,22,11

,2,12,11,1 二)模型建立

结合实际,主要考虑的构造模型的目标有:

1、换乘次数最少;

2、乘车时间最短;

3、出行成本最小。

可建立以下多目标优化模型:

???<=++++∑∑==3

13

5)(311

1

2

1

H W s.t.P h Min

H f d Min H

Min k

f

h j j h i i

模型说明:

f P ——乘坐分段票制线路的消费,∑==2

1h m m f F P ,其中??

?

??∞+∈∈∈=]41[3]4021[2

]201[1,f ,f ,f F m m m m k W ——表示第k 条线路是否可按照要求通行,因为部分线路是单向的

???=行

条线路可以按照要求通第通行条线路不可以按照要求第k k W k 10

H ——可以接受的换乘次数要小于3

三)模型算法实现

上述模型的算法实现如下:

Step1在可达矩阵K 中,如果i 站点到j 站点对应位置上的值为1,表明两点可以

直达,转Step5;如果为0,说明站点i 和站点j 不可以直达,转Step2; Step2 将可达矩阵K 进行平方处理,得到任意两个站点换乘一次是否可以到达的

可达矩阵2K ;(由于本文是建立在不超过两次换乘的基础上的,所以以下算法将只讨论1次换乘和2次换乘)

Step3 如果i 站点到j 站点对应位置上0,1,2,=≥j i j i k k 且,说明从i 站点到j 站点需

要经过换乘公交车方可到达,且换乘方式有2,j i k 种,求出每一种换乘方式的换乘站点,转Step5;否则,转Step4; Step4 如果i 站点到j 站点对应位置上的值为0,表明两点不能通过1次换乘到达,

需对可达矩阵K 进行立方处理得到3K ,若0,0,1,2,3,==≥j i j i j i k k k 且,说明从i

站点到j 站点需要经过换乘2次公交车方可到达,且换乘方式有3,j i k 种,求出每一种换乘方式的第一个换乘站点,将此换乘站点另一端的一个中转站和终点站算作直达,然后转Step5;

Step5 计算起点站到换乘站点到终点站需要经过的站点,需要花费的时间以及乘

车成本。

四)模型求解

利用上述算法分别求解出六对线路的可选部分路线如下:表1 S3359-S1828 部分出行方案

表2 S1557-S0481 部分出行方案

表3 S0971-S0485 部分出行方案

表4 S0008-S0073 部分出行方案

表5 S0148-S0485 部分出行方案

表6 S0087-S3676 部分出行方案

上面六个表格已经给出各对线路的换乘次数最少的线路和时间最短的线路

选择方案,对于“换乘第一”和“时间第一”的人群,则可根据自己的需求选择自己满意的路线出行。 五)模型评价

1、公汽线路查询模型建立在图论的基础上,为满足大众需求、贴近实际,以换乘不超过两次、乘车时间最短为首要目标,以乘车成本为次要目标,给出了不同线路下的公汽线路选择方案,从此角度考虑,模型实用性较强。

2、由于本模型的首要出发点是换乘次数不超过两次,故若换乘超过两次,运用本模型将受到限制。

六 考虑地铁的公交线路查询模型

一)数据处理

以3996个站点为顶点的可达矩阵:

Step1 建立一个39963996?的全0矩阵1K ,数据类型选择‘int16’,并将这些站

点对应的邻接矩阵中数据全部复制到1K 中;

Step2 将矩阵1K 中各个位置上数值为32767的数据换为0; Step3 将矩阵1K 中各个位置上数值部位0的数据置为1。

得出的矩阵1K 为:

??????

???????

?=11211121221121

11211111n,n n,n,,n ,,,n ,,k k k k k k k k k K 二)模型建立

结合实际,主要考虑的构造模型的目标有:

1、换乘次数最少;

2、乘车时间最短;

3、出行成本最小。

可建立以下多目标优化模型:

???<=+++++++++∑∑∑===3

133

67455.2)(33

11

1

1

2

2

1

H W s.t.h P h Min

gd dg dd gg t f d Min H

Min k

f h m m h j j h i i

模型说明:

f P ——乘坐分段票制线路的消费,∑==2

1h m m f F P ,其中??

?

??∞+∈∈∈=]41[3]4021[2

]201[1,f ,f ,f F m m m m k W ——表示第k 条线路是否可按照要求通行,因为部分线路是单向的

???=行

条线路可以按照要求通第通行条线路不可以按照要求第k k W k 10

H ——可以接受的换乘次数要小于3,dg dd gd gg H +++=

三)模型算法实现

上述模型的算法实现如下:

Step1在可达矩阵1K 中,如果i 站点到j 站点对应位置上的值为1,表明两点可以

直达,转Step5;如果为0,说明站点i 和站点j 不可以直达,转Step2; Step2 将可达矩阵1K 进行平方处理,得到任意两个站点换乘一次是否可以到达的可达矩阵21K ;(由于本文是建立在不超过两次换乘的基础上的,所以以下算

法将只讨论1次换乘和2次换乘)

Step3 如果i 站点到j 站点对应位置上0,1,2,=≥j i j i k k 且,说明从i 站点到j 站点需

要经过换乘公交车方可到达,且换乘方式有2,j i k 种,求出每一种换乘方式的换乘站点,转Step5;否则,转Step4; Step4 如果i 站点到j 站点对应位置上的值为0,表明两点不能通过1次换乘到达,需对可达矩阵1K 进行立方处理得到31K ,0,0,1,2,3,==≥j i j i j i k k k 且,说明从i 站点到j 站点需要经过换乘2次公交车方可到达,需且换乘方式有3,j i k 种,求出每一种换乘方式的第一个换乘站点,将此换乘站点另一端的一个中转站和终点站算作直达,然后转Step5;

Step5 计算起点站到换乘站点到终点站需要经过的站点,需要花费的时间以及乘

车成本。

四)模型求解

利用上述算法求解出六对线路的可选部分路线如下:

表7 六对线路的部分出行方案

表7已经给出六对线路的换乘次数最少的线路和时间最短的线路选择方案,对于“换乘第一”和“时间第一”的人群,可根据自己的需求选择自己满意的路线出行。

五)模型评价

1、考虑地铁线路的公交线路查询模型同样建立在图论的基础上,从实际出发,以换乘不超过两次、乘车时间最短为首要目标,以乘车成本为次要目标,给出了不同线路下的公交线路选择方案,模型具备较强的公交线路查询能力。

2、由于本模型的首要出发点是换乘次数不超过两次,故若换乘超过两次,运用本模型将受到限制。

七考虑步行的公交线路查询模型

一)问题分析

若知道所有站点之间的步行时间,由于乘客自身因素,乘车方案中步行次数不得多于2次且每次步行时间不能超过20分钟。在此情况下,可以将乘客的每一次步行都当做一次换乘,为体现“换乘”,则在构造可达矩阵时,可以为每一对站点之间的步行时间不超过20分钟且少于行驶时间的一对站点虚构一个中转站,某几对特殊站点也可共用一个中转站。通过上述的转化,问题三则可利用混合公交线路查询模型求解。

二)模型建立

结合实际,主要考虑的构造模型的目标有:

1、“换乘”次数最少(包括步行次数);

2、乘车时间最短(包括步行时间);

3、出行成本最小。

可建立以下多目标优化模型:

???<=++++++++++∑∑∑===3

133

67455.2)(33

11

1

1

2

2

1

H W s.t.h P h Min

B gd dg dd gg t f d Min H

Min k

f h m m h j j h i i

模型说明:

f P ——乘坐分段票制线路的消费,∑==2

1h m m f F P ,其中??

?

??∞+∈∈∈=]41[3]4021[2

]201[1,f ,f ,f F m m m m k W ——表示第k 条线路是否可按照要求通行,因为部分线路是单向的

??

?=行

条线路可以按照要求通第通行条线路不可以按照要求第k k W k 1

H ——可以接受的换乘次数要小于3,b dg dd gd gg H ++++=

三)模型算法实现

上述模型的算法实现如下:

Step1 将处理过的“1.1公汽线路信息.txt ” 和“1.2 地铁线路信息.txt ”读入到矩

阵A 和B 中,B A 、中每一行代表一条线路,列数为线路的数目(将双行、环行线路作为一条);每一列为一个站点,列数为站点最多的线路的站点数,其它位置的值为0;

Step2 建立一个96399639?的全0矩阵L ,数据类型选择‘int16’,并将非对角

位置的元素置为无穷大,即32767;

Step3 从A 的第一行开始读数据,将第i 个站点到第j 个站点的所需要的时间填

在j i l ,。如果在其它线路上找到的第i 个站点到第j 个站点的所需要的时间比原来的要短,就替换,否则继续;B 类似;

Step4 将双行和环行的线路提取出来,继续填充矩阵L ;

Step5 根据已有所有站点之间的步行时间信息,提取出步行时间低于20分钟的

站点;然后再将提取出每个站点的步行时间和已有的行驶时间相比,并剔除步行时间更长的。

Step6 根据最后提取出的站点对邻接矩阵进行扩充。每加一对站点的步行时间相

应的就必须加一个中转站,并依次编号为3997、3998、3999……(3996为公汽站点和地铁站点的总和);

Step7~ Step11 算法步骤同公汽线路查询模型算法Step1~ Step5。

八模型改进方向

由于题中信息不足加上作者水平有限,本文仍然存在很大的改进空间。为使模型具有更强的实用性,可从以下两个方面进行改进:

1、考虑将站点之间的距离实际化,然后完善本查询系统。

题中所给的各个站点之间的公车行驶时间都是同样的,而在现实中这是不存在的。并且需要考虑人是否能够在设定的时间内到达转乘站点。

2、考虑乘车高峰站点的查询系统。

知道在实际情况中,有些站点会有很多乘客上车或者车已经塞满,所以对于乘车人来说在此站上车显然不明智的。所以系统可以考虑这一点,让乘客不至于在一个站点等很久而浪费了大量时间。

参考文献

[1] 杨新苗,王炜,马文腾,基于GIS的公交乘客出行路径选择模型[J],南京:东南大学学报,2000,30(6),88~91

[2] 苏爱华,施法中,公交网络换乘问题的一种实现,北京:工程图学学报,2005,55~59

[3] 王振军,王宁宁,李鸿,牛洪亮,基于邻接矩阵的公交换乘算法的研究,徐州:徐州工程学院学报,2006,V ol.21 No.,74~77

[4] 刘云生,陈晶,一种基于Web G Is的加权最佳换乘算法与实现,湖北:计算机仿真,2006,10

[5] 朱江云,王玉坤,基于最小换乘次数的最优路径算法,福建:福建电脑,2007,3

[6] 何胜学,范炳全,严凌,公交网络最优路径的一种改进求解算法,上海:上海理工大学,2006,V ol.28,No.1

[7] 胡云峰,公交换乘系统的数据库结构及算法优化,云南:文山学院学报,2010,V ol.23,No.2

[8] 扈震,张发勇,刘书良,城市公交换乘数据模型研究及算法实现,武汉:电信网技术,2007,4(4)

[9] 吴永军,蔡永香,郭庆胜,城市公交查询系统的设计与实现,武汉:测绘信息与工程,2006,31(5)

附录

附录一:源程序

function [G M W] = GongJiao_1_readtxt()

a = dlmread('C:\Documents and Settings\Administrator\桌面\建模培训四\公汽线路信息.txt');

Max = max(max(a));

G = zeros(Max, Max, 'int16');

W = zeros(Max, Max, 'int16');

for i = 1:Max

for j = 1:Max

if i == j

continue;

end

G(i, j) = 32767;

end

end

[row, cow] = size(a);

for i = 1:row

for j = 2:(cow - 1)

for k = (j+1):cow

if a(i, k) == 0

break;

end

% 如果原来有值,则比较找出更短的路径

if G(a(i, j), a(i, k)) ~=0 && G(a(i, j), a(i, k)) ~= 32767

G(a(i, j), a(i, k)) = min(k - j, G(a(i, j), a(i, k))); % 权值 if (k - j) == G(a(i, j), a(i, k))

W(a(i, j), a(i, k)) = i;

end

else

G(a(i, j), a(i, k)) = k - j;

W(a(i, j), a(i, k)) = i;

end

end

end

end

sx = dlmread('C:\Documents and Settings\Administrator\桌面\建模培训四\双行.txt'); hx = dlmread('C:\Documents and Settings\Administrator\桌面\建模培训四\环行.txt'); L1 = size(sx, 2);

L2 = size(hx, 2);

for j = 2:(cow - 1) % 双行第一行

if a(1, j) == 0

break;

end

for k = (j+1):cow

if a(1, k) == 0

break;

end

% 如果原来有值,则比较找出更短的路径

if G(a(1, k), a(1, j)) ~=0 && G(a(1, k), a(1, j)) ~= 32767

G(a(1, k), a(1, j)) = min(k - j, G(a(1, k), a(1, j))); % 权值

if (k - j) == G(a(1, k), a(1, j)) % 如果发生替换

W(a(1, k), a(1, j)) = i;

end

else

G(a(1, k), a(1, j)) = k - j;

W(a(1, k), a(1, j)) = i;

end

end

end

n1 = 1;

n2 = 1;

for i = 1:row

if n1 <= L1 && a(i, 1) == sx(n1) % 双行

n1 = n1 + 1;

for j = 2:(cow - 1)

if a(i, j) == 0

break;

end

for k = (j+1):cow

if a(i, k) == 0

break;

end

% 如果原来有值,则比较找出更短的路径

if G(a(i, k), a(i, j)) ~=0 && G(a(i, k), a(i, j)) ~= 32767

G(a(i, k), a(i, j)) = min(k - j, G(a(i, k), a(i, j))); % 权值

if (k - j) == G(a(i, k), a(i, j))

W(a(i, k), a(i, j)) = i;

end

else

G(a(i, k), a(i, j)) = k - j;

W(a(i, k), a(i, j)) = i;

end

end

end

elseif n2 <= L2 && a(i, 1) == hx(n2) % 环行

n2 = n2 + 1;

j = 1;

while a(i, j+1) ~= 0

j = j + 1;

end

G(a(i, j), a(i, 2)) = 1;

W(a(i, j), a(i, 2)) = i;

elseif n2 > L2 && n1 > L1

break;

else

end

end

% 可达矩阵

M = G;

M(M == 32767) = 0;

M(M ~= 0) = 1;

function [G M] = GongJiao_2_huanc()

load GongJiao_ZhiDa.mat; % M

load GongJiao_LinJie.mat; % G

t1 = dlmread('C:\Documents and Settings\Administrator\桌面\建模培训四\2.1 地铁T1线换乘公汽信息.txt');

t2 = dlmread('C:\Documents and Settings\Administrator\桌面\建模培训四\2.2 地铁T2线换乘公汽信息.txt');

for j = 1:22 % 第一条地铁线

for k = (j+1):23

G(3957+j, 3957+k) = (k - j)*2.5/3;

G(3957+k, 3957+j) = (k - j)*2.5/3;

M(3957+j, 3957+k) = 1;

M(3957+k, 3957+j) = 1;

end

end

T2 = [24 25 26 12 27 28 29 30 31 32 18 33 34 35 36 37 38 39];

for k = 1:18 % 第二条地铁线

for m = 1:18

if k == m

continue;

end

if (k == 4 && m == 11) || (k == 11 && m == 4)

continue;

end

if k < m

G(3957+T2(k), 3957+T2(m)) = (m - k)*2.5/3;

else

G(3957+T2(k), 3957+T2(m)) = (m - k + 18)*2.5/3;

end

M(3957+T2(k), 3957+T2(m)) = 1;

end

end

r1 = size(t1, 1);

r2 = size(t2, 1);

for i = 1:r1

j = 2;

while j < 7 && t1(i, j) ~= 0

G(3957+t1(i, 1), t1(i, j)) = 0;

G(t1(i, j), 3957+t1(i, 1)) = 0;

M(3957+t1(i, 1), t1(i, j)) = 1;

M(t1(i, j), 3957+t1(i, 1)) = 1;

j = j + 1;

end

end

for i = 1:r2

j = 2;

while j < 5 && t2(i, j) ~= 0

G(3957+t2(i, 1), t2(i, j)) = 0;

G(t2(i, j), 3957+t2(i, 1)) = 0;

M(3957+t2(i, 1), t2(i, j)) = 1;

M(t2(i, j), 3957+t2(i, 1)) = 1;

j = j + 1;

end

end

function [cow s w] = GongJiao_2_HC2()

load GongJiao_HuanChen.mat;% A

load GongJiao_ZhiDa.mat; % M

load GongJiao_LinJie.mat; % G

load GongJiao_XianLu.mat; % W

% 存储起始和目的站

start = [3359 1557 971 8 148 87];

End = [1828 481 485 73 485 3676];

Start = A(start, :);

Start = double(Start);

END = M(:, End)';

END = double(END);

JD = Start.*END;

cow = zeros(6, 14463);

for i = 1:6

[~, c] = find(JD(i, :) > 0); % 找到第二个中转站

a(i) = size(c, 2); % 第二个中转站的数量

cow(i, 1:a(i)) = c'; % 记录中转站

end

n = a;

s = zeros(6, 14463); % 存储距离

w = zeros(6, 14463*3); % 存储线路

for r = 1:6

Stat = M(start(r), :);

END = M(:, cow(r, 1:a(r)))';

Stat = double(Stat);

END = double(END);

Start = [];

for i = 1:a(r)

Start = [Start; Stat];

end

JD = Start + END;

co = [];

k = 1;

sz = [];

for i = 1:a(r)

[~, c] = find(JD(i, :) == 2);

ss = size(c, 2);

sz(k:(k+ss-1)) = cow(r, i); % 记录第一次中转的目的站 k = k + ss;

co = [co, c]; % 第一次中转站

end

x = size(co, 2);

cow(r, 1:x) = sz;

cow(r+6, 1:x) = co';

for j = 1:x

s(r, j) = G(sz(j), End(r)); %第二次转车的路径长度 s(r, j) = s(r, j) + G(start(r), co(j));

s(r, j) = s(r, j) + G(co(j), sz(j));

if sz(j) > 3957 && co(j) > 3957

w(r, 3*j) = 1000;%第二次转车的线路

w(r, 3*j-2) = 1000;

w(r, 3*j-1) = 1000;

elseif sz(j) > 3957 && co(j) < 3957

w(r, 3*j) = 1000;%第二次转车的线路

w(r, 3*j-2) = W(start(r), co(j));

w(r, 3*j-1) = 1000;

elseif sz(j) < 3957 && co(j) > 3957

w(r, 3*j) = W(sz(j), End(r));%第二次转车的线路 w(r, 3*j-2) = 1000;

w(r, 3*j-1) = 1000;

else

w(r, 3*j) = W(sz(j), End(r));%第二次转车的线路 w(r, 3*j-2) = W(start(r), co(j));

w(r, 3*j-1) = W(co(j), sz(j));

end

end

end

相关主题
相关文档
最新文档