10195-数学建模-B-20004031中南大学李楠-张占锋-刘娜

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

B题:乘公交,看奥运
摘要
本文对城市公共交通问题进行了详细的讨论。

针对问题一,我们建立了时间-费用的多目标规划模型。

首先对原始数据进行了处理,将公汽线路信息导入到execel表格中,将不足86列的线路补零,构建出一个城市公交线路的矩阵。

该矩阵具有以下特点:①矩阵的行向量为对应线路所在向量;②矩阵中除0外的点均为公汽站点。

通过进一步分析,我们在转车次数最少的基础上,综合考虑时间和费用建立模型,并利用双向广度搜索算法得到任意两点间的最小转车次数,分别对问题中的6对数组进行最优路径的筛选,得到结果 (1)、(3)、(4)、(6)转一次车,(2)、(5)转两次车(详细见表1、表2)。

在第二问中,由于地铁站对应的公汽站之间可以通过地铁实现换乘(不收取地铁非用),我们进行了特殊处理,把任一地铁站所对应的公汽站都化为一个站点,并用统一的符号表示。

在考虑通过地铁实现转车的情况时,只需给这一点处的时间加上一个转车时间(6分钟+7分钟),在这点处产生的费用不予考虑,从而对问题进行了简化,可以得到替换后的公交线路矩阵以及两条地铁线路矩阵。

考虑到不同的乘客对不同的交通工具的依赖程度不同,将线路选择分为三类:(1)只乘公汽;(2)只乘地铁(可以直达的前提下);(3)既乘公汽又乘地铁。

再对三类路线分别以时间最少和费用最少为目标,建立了转车次数-费用-时间最小模型,运用Matlab软件编程实现对线路的筛选,得到可以满足不同人群需求的路线。

针对问题中的6组数据,分别进行三种算法的实现,得到结果(详见表3、表4、表5、表6、表7、表8)。

对于问题三,我们考虑网络规划模型。

假设已经知道任意两点之间的步行时间,从而为我们出行路线带来了新的选择,使得整个城市的交通线路任意两点之间都联通(不通的地方都可用步行来代替),形成完整的城市交通网。

我们将相邻两点之间的最快到达时间赋予联结这两点的边的权值,公交车不能联结的两点用步行时间赋予权值,定义为用时的长短等价于两点之间距离,则时间越长代表距离越大,将此时间费用最小问题转化为最短路问题,建立网络规划模型,用Dijkstra算法就可以得到任意两点间的最短时间路径。

最后得出:随着交通的发展,城市轨道作为城市客运交通骨干,其单独存在发展都是不经济和不有效的,它应该尝试与其他的交通方式密切结合,这才是今后交通发展的主流,只有城市公交与小汽车、地铁、步行等多种交通方式相密切结合,形成城市交通客运一体化,才能更加便利城市居民的生活,彻底解决交通堵塞问题。

关键字:双向广度搜索算法,Dijkstra算法,时间-费用的多目标规划模型网络规划
一、问题重述
1.背景
第29届奥运会明年8月将在北京举行,届时有大量观众到现场观看奥运比赛,其中大部分人将会乘坐公共交通工具(简称公交,包括公汽、地铁等)出行。

这些年来,城市的公交系统有了很大发展,北京市的公交线路已达800条以上,使得公众的出行更加通畅、便利,但同时也面临多条线路的选择问题。

根据需求,设计一个解决公交线路选择问题的自主查询计算机系统。

2.问题
(一)、根据城市公汽线路网,建立合理的数学模型与算法,该模型与算法具有能够在给出任意两站点的情况下,得到两站点之间的最佳路线,并通过这种模型与算法解决以下6对起始站到终点站之间的最佳线路。

(1)、S3359→S1828 (2)、S1557→S0481 (3)、S0971→S0485
(4)、S0008→S0073 (5)、S0148→S0485 (6)、S0087→S3676
(二)、在问题一的基础上综合考虑该城市中的地铁线路,利用地铁T1、T2的线路与原有的公汽线路组成新的交通网,改进模型与算法使得人们可以在公汽与地铁之间自由选择路线,即要求该模型与算法能够实现人们地铁与公汽、公汽与地铁、地铁与地铁、公汽与公汽之间换车,并且能够解决任意两站点(包括:地铁站点和公汽站点)之间的最佳路线问题,利重组后的模型与算法解决问题一中的最佳路线问题。

(三)、从时间的角度出发,以时间最短为主要原则,考虑较短的两站点之间可以步行,结合问题二中已有的模型,对最佳路线问题进行再次优化,给出任意两点之间的最优路线。

二、模型的条件和假设
(一)、假设基本参数的设定合理,符合实际,各个线路不会出现堵车等意外情况,乘客都能够在设定时间内顺利完成换乘。

(二)、各相邻公汽站或各相邻地铁站平均行驶时间(包括停站时间)为一定常数。

(三)、各公交间换乘平均耗时为定值。

(四)、同一地铁站对应的公共汽车站相互之间距离很小,可以忽略地铁在它们之间行驶的时间。

(五)、假设乘客匀速步行,即相等时间走过的距离恒定,且两相邻地铁或公汽车站之间距离相等。

三、变量及符号说明
(一)、Y :以站点为基本元素,以线路为横向向量的矩阵;
(二)、L +三位数字:公共汽车的线路编号;
(三)、D +两位数字:地铁的站点编号;
(四)、12T T 、:地铁的两条线路编号;
(五)、S +四位数字:公共汽车的站点编号;
(六)、[A ]B C →→:表示从起始站A 到目的站C 的路线,B 为中转站;
四、问题分析
(一)、问题一要求给出求解两公汽站点的一般模型与算法,结合题目已给数据(公汽线路信息),我们可以以各个线路中的站点为基本元素,以路线为行向量构成矩阵,利用最优线路的广度优先算法,运用matlab 软件编程,建立一次转车流程模型、二次转车流程模型,确定最小转车次数的基础上得到能够到达目的地的几条路线,把时间与费用综合考虑,用一个量“经过公汽点的多少“来代替,再从经过公汽站数最少的角度出发,得到最佳路线。

将这个算法与模型分别在六个线路中实现,即可得到六对起始站→终到站之间的最佳路线。

(二)、地铁线路的引入,使得该城市的交通网更加发达,同时带来数据处理上的一些问题,我们首先对模型简化,考虑到题中所注释的假设(地铁换乘公汽信息数据文件格式说明):同一地铁站对应的任意两个公共汽车之间可以通过地铁站换乘且无需支付地铁费,结合实际情况,地铁站对应的公共汽车站之间的距离很近,相对于从起始站到目的站所用时间,地铁在地铁站所对应任意两站公共汽车站之间的行驶时间可以忽略不计,这样我们将地铁站点与地铁站点所对应的公共汽车站点化为一个点,并将这些点在问题一的矩阵中用地铁站所对应的第一个汽车站点替代,例如:D24:S0537,S3580三个点用S0537取代,并且将地铁所经过的两条线路化为286⨯的矩阵与所的到的新的矩阵组合成93186⨯的矩阵。

再利用matlab 软件,从时间和费用的角度出发分别实现时间最少和费用最少两种算法供乘客选择。

(三)、问题三中,考虑到任意两相邻站点之间可以步行,这样就使得原本不能通通过交通工具联通的站点可以用步行来实现没两点之间的联通,这样整个城市的交通站点和交通线路就构成了一个完整的网格图形,因此我们可以用图论的方法来解决这个问题,如果仅仅考虑任意两点间的时间,我们就可以以最快方式到达两点之间的时间为每个边的权值,如过两点之间没有公汽或地铁相通,那我们就以两点间步行所需时间为这个边的权值,这样每个边都得到以个权值,以时间长短取代两点间距离的大小,然后可以利用Dijkstra 算法实现任意两点间的最短距离,即:两点间的时间最短路径。

五、模型的建立与求解
问题一:模型的建立和求解
最优路线的双向广度优先算法
在问题一中,我们通过分析提出主要因素—时间、费用,而忽略次要因素的影响,按照不同的优先级选择最优路线。

我们知道在一个城市中,所有的公交站点是通过公交线路连接起来的,我们可以把公交线路看作一个从始发点到终点站的向量,所有的向量就组成了整个城市的交通网。

线路所经过的站点是向量中的基本元素,如果两条交通路线12,L L 中有公共站点,那么
12L L ≠Φ,如果交通路线12,L L 没有公共站点,那么12L L =Φ,所有交通站点就构成了城市的交通要点。

建立城市交通线路模型:123n L L Y L L ⎧⎫⎪⎪⎪⎪⎪⎪=⎨⎬⎪⎪⎪⎪⎪⎪⎭⎩;1234[,,,]n m L S S S S S =
首先利用题目中所给数据,以站点为基本元素,以行表示各条路线建立92986⨯交通路线总矩阵Y ,这个矩阵具有以下特点:(1)行向量均为各个线路;(2)矩阵中行向量不足86阶的均以0补充,使其成为一个92986⨯阶。

(1)根据路线有上行,下行,环形之分,我们建立时间-费用的多目标优化模型,考虑时间因素、费用因素,综合两因素的影响。

在此,时间和费用因素用经过站点数的多少表示,以经过站点数最少为择优原则[6]运用双向广度优先算法筛选出最优线路。

设经过A 站的路线集合为PASS_A,经过B 站的路线集合为PASS_B ,如果PASS_A PASS_B ≠Φ则找出此交集,经一次转车即可到达目的站。

如果PASS_A PASS_B=Φ则需要转车两次以上(包含两次)。

(2) 找出PASS_A 中所有能转乘的车次'PASS_A ,如果'PASS_A PASS_B ≠Φ,则A 到B 经转一次即可到达,找出交集,并按顺序找出这个交集中的车由哪些车转来,即知道由A 经转一次车到B 具体路线。

如果'
PASS_A PASS_B =Φ,则需要按此方法考
虑两次转车情况,依次类推。

(3)以下为简略流程图:
图1:流程图
对于有一部分路线需要多次转车才能到达目的地时,我们根据图论知识得到一个很有用的结论:对于一个N*N维的网络图,当N很大时,最多转三次便可到达此网络图中的任意一点。

最终查询者只需要输入起始站和目的站,即可以得到最优路线以及从起始站到达目的站的时间和费用。

我们按照上述模型与算法,在Matlab中分别实现问题中的六个小问,得到结果如下表:
该算法与模型能够较好的解决一次转车与二次转车的问题,若考虑多次转车,则需要更大的改动程序,在此不再继续对多次转车进行研究。

问题二:模型的建立与求解
模型简化
由于地铁线路的引入,使得该城市的交通网更加发达,但同时带来数据处理上的一些问题。

首先我们对模型②进行简化,考虑到题中所注释的假设(地铁换乘公汽信息数据文件格式说明):同一地铁站对应的任意两个公共汽车之间可以通过地铁站换乘且无需支付地铁费,结合实际情况,地铁站对应的公共汽车站之间的距离很近,相对于从起始站到目的站所用时间,地铁在地铁站所对应任意两站公共汽车站之间的行驶时间可以忽略不计,这样我们将地铁站点与地铁站点所对应的公共汽车站点都化为一个点,并将这些点在问题一的矩阵中用地铁站所对应的第一个汽车站点替代,例如:D24:S0537,S3580三个点都用S0537取代,并且将地铁所经过的两条线路化为286⨯的矩阵与所得到的新的矩阵组合成93186⨯的矩阵。

得到新的线路矩阵如下:
123n L L Y L L λ⎧⎫⎪⎪⎪⎪⎪⎪=⎨⎬⎪⎪⎪⎪⎪⎪⎭⎩;1234[,,,]n m L S S S S S λ=
我们替代后的这一点将会出现很多线路的交叉点,本不相联通但距离很小的线路先在已经在模型化简的条件下称为相互联通的一点,这样就使得:
(1)首先,检验6对起始站到终点站的线路中知否有直达的地铁线路,若有则直接乘地铁到达,票价3元。

经过检验,得到第六组可以通过地铁直接到达,线路为:T2(D27→D36);票价为:3元
(2)根据实际存在的情况,人们对交通工具的依赖程度不同,有人偏好与公汽,有人偏好欲地铁,另外一部分人对两者的偏好不太明显,我们首先根据乘客的乘车喜好把问题分为三种模型来考虑(1)、从起始站到目的站只乘公汽;(2)、从起始站到目的站只乘坐地铁;(3)、从起始站到目的站既乘坐公汽又乘坐地铁。

(3)根据三类不同的人群分别以时间最短为原则,选择最优路线,由于转车换乘会消耗大量的时间,特别是通过地铁实现公汽与公汽之间的换乘,虽然在相邻公汽站点之间搭乘地铁会不收取地铁费,但会废掉13分钟的时间完成换乘,时间与费用是一对矛盾体,所以我们择重考虑时间最短的原则,并在时间最短的原则上考虑费用较小,这样更能满足人们的需求。

(4)由于地铁的引入,以及我们采用的相邻多个站点简化为一个站点的方法,使得城市的交通网络更加发达,更容易实现任意两点之间的直达,但仍然有不能直达的两个
站点,所以我们对算法和问题一作同样的处理,即对于不能通过一次换乘的路线采用两次换乘或者多次换乘。

(5)利用上述原则和方法分别实现6对最优线路问题:
1)、S3359→S1828
2)、S1557→S0481
3)、S0971→S0485
4)、S0008→S0073
5)、S0148→S0485
6)S0087→S 3676
由题设知道所有站点之间的步行时间,同时考虑公共汽车与地铁线路,从而前面两问所建立的模型不再适用,为此我们引入一个一般的模型:
最短路模型
我们知道最短路问题(shortest path problem)是在已知一网络上各弧的长度的基础上,求出从图上给定的节点s V 到节点t V 的最短的通路。

问题三的本质是求一个网络图的最短路问题。

我们可以把本题的路线图看成是一个网络图,如下:
图1
说明:图中1-4点很近,但这条路线没有一条直接的通路,必须坐车或地铁经2和3点才能到达。

这是很不划算的。

既浪费了时间又花了车费。

这种线路设计在实际生活中是很常见的。

而当我们考虑了步行时间后,可以形成任意两点间的一条通路。

如下图:
图2
说明:考虑步行后,图中1-4,1-3,4-2都是直接联通的。

这时候可以实现任意一点的通路,只是在时间上增加了(在时间允许的范围内)。

我们要实现任意两个地方连通,只需分别赋以每条通路不同的权值,这就是最短路问题。

以各站点为图G 的顶点,两站间的直通线路为图G 相应两顶点间的边,得图G 。

对G 的每一边e ,赋以一个实数)(e w —相邻两站的时间,称为e 的权,得到赋权图G 。

G 的子图的权是指子图的各边的权和。

问题就是求赋权图G 中指定的两个顶点00,v u 间的具最小权的轨。

这条轨叫做00,v u 间的最短路,它的权叫做00,v u 间的距离,亦记作),(00v u d 。

求最短路已有成熟的算法:迪克斯特拉(Dijkstra )算法,其基本思想是按距0u 从近到远为顺序,依次求得0u 到G 的各顶点的最短路和距离,直至0v (或直至G 的所有顶点),算法结束。

为避免重复并保留每一步的计算信息,采用了标号算法。

下面是该算法。

(i) 令0)(0=u l ,对0u v ≠,令∞=)(v l ,}{00u S =,0=i 。

(ii) 对每个i S v ∈(i i S V S \=),用
)}()(),({min uv w u l v l i
S u +∈ 代替)(v l 。

计算)}({min v l i
S v ∈,把达到这个最小值的一个顶点记为1+i u ,令}{11++=i i i u S S 。

(iii). 若1||-=V i ,停止;若1||-<V i ,用1+i 代替i ,转(ii)。

算法结束时,从0u 到各顶点v 的距离由v 的最后一次的标号)(v l 给出。

在v 进入i S 之前的标号)(v l 叫T 标号,v 进入i S 时的标号)(v l 叫P 标号。

算法就是不断修改各项点的T
标号,直至获得P 标号。

若在算法运行过程中,将每一顶点获得P 标号所由来的边在图上标明,则算法结束时,0u 至各项点的最短路也在图上标示出来了。

而在计算赋权图中各对顶点之间最短路径,显然可以调用Dijkstra 算法。

具体方法是:每次以不同的顶点作为起点,用Dijkstra 算法求出从该起点到其余顶点的最短路径,反复执行n 次这样的操作,就可得到从每一个顶点到其它顶点的最短路径。

这种算法的时间复杂度为)(3n O 。

假设图G 权的邻接矩阵为0A ,
⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡=nn n n n n a a a a a a a a a A 21
22221112110 来存放各边长度,其中:
0=ii a n i ,,2,1 =;
∞=ij a j i ,之间没有边,在程序中以各边都不可能达到的充分大的数代替;
ij ij w a = ij w 是j i ,之间边的长度,n j i ,,2,1, =。

对于无向图,0A 是对称矩阵,ji ij a a =。

Floyd 算法的基本思想是:递推产生一个矩阵序列n k A A A A ,,,,,10 ,其中)
,(j i A k 表示从顶点i v 到顶点j v 的路径上所经过的顶点序号不大于k 的最短路径长度。

计算时用迭代公式:
)),(),(),,(m in(),(111j k A k i A j i A j i A k k k k ---+=
k 是迭代次数,n k j i ,,2,1,, =。

最后,当n k =时,n A 即是各顶点之间的最短通路值
以此类推,我们可以得出任意两站点之间线路选择问题的最短路。

六、模型的评价和改进方向
(1)在问题一的模型中,我们首先按最少转车次数为基本原则,在此基础上按照时间和费用择优挑选路线,这个模型具有普遍的合理性和适用性,但也由不足之处,比如没有考虑到不同人对交通工具的选择会有所不同的实际情况。

所以在模型改进中应该加入人为因素来考虑。

(2)问题二中,我们首先对模型进行简化处理,将高阶的复杂矩阵降阶,使复杂问题简单化,当模型规模较大时,这种方法在实现起来是很方便的。

另外在处理与地铁站对应的公汽站点时,我们采用了等价代换的方法,将同一地铁路线对应的不同汽车站点用同一站点代替。

还有,我们针对不同人对交通工具的依赖程度不同,对路线分三类考虑,分为:只乘坐公交车、只乘坐地铁和既乘公汽又坐地铁的,这样体现了模型的人性化,满足了对乘车有偏好的人群。

中国是一个人口大国,交通问题不仅仅是在奥运会来临之际才存在,它一直伴随着人们的生活,解决交通问题的关键就是构建交通一体化使各种交通工具之间能够自由结合,随着交通的发展,城市轨道作为城市客运交通骨干,其单独存在发展都是不经济和不有效的,它应该尝试与其他的交通方式密切结合,这才是今后交通发展的主流,只有城市公交与小汽车、自行车、步行等多种交通方式相密切结合,形成城市交通客运一体化,才能更加便利城市居民的生活,彻底解决交通堵塞问题。

(3)在考虑问题三时,若采用问题一、二的方案,将使问题陷入复杂的数据之中,最终也未必能得到精确的答案,所以,在第三问中,我们对问题进行转化,将复杂到无法计算的问题转化为简单的图论中的最短路问题,通过调用现成的算法很容易得到任意两点最短时间路径。

这类转化方法不仅仅可以应用解决数学中的最短路问题,而且还可以灵活的应用到其他学科,给我们解决问题带来了很大的方便。

例如:无向图,有向图和网络常常用于电子网络的分析、化合物(特别是碳氢化合物)的分子结构研究、空中航线和通信网络的描述、项目策划、遗传研究、统计、社会科学及它各种领域。

七、参考文献
[1]徐玖平等,运筹学,北京:科学出版社 2004。

[2]白风山等,数学建模,哈尔滨:哈尔滨工业大学出版社,2003.4。

[3]许金明等,MATLAB实用教程,北京:清华大学出版社,北京交通大学出版社,2005.7。

[4]陈怀琛,线性代数实践及matlab入门,北京:电子工业出版社,2005.10
[5]王朝晖,杨洁,公交线路中最优线路的查询算法设计,/bbs/index.asp?boardid=142&page=1,2005.9
八、附录
附件1:结合时间和费用后转车路线
X=[路线矩阵];
Y=reshape(x,929,86);%把矩阵分割成929*86% m1=0;
Sq=input('Sq=');
for i=1:929
for j=1:86
if Sq~=Y(i,j);
disp('');
else
m1=m1+1;
A1(m1)=i;
B1(m1,:)=Y(i,:);
end;
end;
end;
m1;
A11=A1(1,1:m1)%过同一车站路线的行标%
B11=B1(1:m1,:)%过同一车站的所有路线%
Sz=input('Sz=');
m2=0;
for i=1:929
for j=1:86
if Sz~=Y(i,j);
disp('');
else
m2=m2+1;
A2(m2)=i;
B2(m2,:)=Y(i,:);
end;
end;
end;
m2;
A22=A2(1,1:m2)%过同一车站路线的行标%
B22=B2(1:m2,:)%过同一车站的所有路线%
s=0;
for i=1:m1
for j=1:86
for m=1:m2
for l=1:86
if B11(i,j)~=0&B22(m,l)~=0; if B11(i,j)==B22(m,l); s=s+1;
f1(s)=i;
f2(s)=m;
f3(s)=j+86-l;
f4(s)=j;
f5(s)=l;
else
continue;
end;
end;
end;
end;
end;
end;
f1;%起点相同车站的路线行标%
f2;%终点相同车站的路线行标%
min(f3);%路线最短%
f4;%起点相同车站的路线纵标%
f5;%终点相同车站的路线纵标%
min(f4+86-f5);
s;%总共有多少个相同车站%
if s~=0
disp('一次转车即可以!');
else
disp('至少转两次!');
end;
w=0;
for t1=1:s
if f3(t1)==min(f3);
w=w+1;
e(w)=t1;
else
continue;
end;
end;
w;%最段路线的条数%
e;%f3中最短路线所对应的下标%
for t2=1:w
f44(t2)=f4(e(t2));
f55(t2)=f5(e(t2));
end;
f44
f55
% 考虑费用时候的路段长度 %
for t3=1:w
if f44(t3)<=20;
fei1=1;
else
if f44(t3)<=40;
fei1=2;
else fei1=3;
end;
end;
end;
fei1;%起点站所对应的最小费用%
for t4=1:w
if (86-f55(t4))<=20; fei2=1;
else
if (86-f55(t4))<=40; fei2=2;
else fei2=3;
end;
end;
end;
fei2;
switch w
case 1
B3=f1(e);
B4=f2(e);
case 2
for t2=1:2
r1=e(t2);
B3(t2)=f1(r1);
B4(t2)=f2(r1);
end;
B3;
B4;
end;
B3;
B4;
for t2=1:w
qlx(t2)=A11(B3(t2));
zlx(t2)=A22(B4(t2));
end;
[m,n]=size(f3);
n
w
e
qlx
zlx
fei0=fei1+fei2
附件2:转车次数
X=[路线矩阵];
Y=reshape(x,929,86);%把矩阵分割成929*86% m1=0;
Sq=input('Sq=');
for i=1:929
for j=1:86
if Sq~=Y(i,j);
disp('');
else
m1=m1+1;
A1(m1)=i;
B1(m1,:)=Y(i,:);
end;
end;
end;
m1;
A11=A1(1,1:m1)
B11=B1(1:m1,:)
Sz=input('Sz=');
m2=0;
for i=1:929
for j=1:86
if Sz~=Y(i,j);
disp('');
else
m2=m2+1;
A2(m2)=i;
B2(m2,:)=Y(i,:);
end;
end;
end;
m2;
A22=A2(1,1:m2)
B22=B2(1:m2,:)
s=0;
for i=1:m1
for j=1:86
for m=1:m2
for l=1:86
if B11(i,j)~=0&B22(m,l)~=0; if B11(i,j)~=B22(m,l); disp('');
else
s=s+1;
end;
end;
end;
end;
end;
end
s;
if s==0;
disp('至少转两次!');
else
disp('转一次车即可!');
end
%均成功了%
for i=1:929
for j=1:86
if B11(1,1)~=Y(i,j);
disp('');
else
m3=m3+1;
A3(m3)=i;
B3(m3,:)=Y(i,:);
end;
end;
end;
m3;
A33=A3(1,1:m3)
B33=B3(1:m3,:)
s1=0;
for i=1:m3
for j=1:86
for m=1:m2
for l=1:86
if B33(i,j)~=0&B22(m,l)~=0; if B33(i,j)~=B22(m,l); disp('');
else
s=s+1;
f1(s)=i;
f2(s)=m;
f3(s)=j+86-1;
f4(s)=j;
f5(s)=l;
end;
end;
end;
end;
end;
end
s;
f1
f2
min(f3)
f5;
w=0;
for t1=1:s
if f3(t1)==min(f3); w=w+1;
e(w)=t1;
else
continue;
end;
end;
w;
e;
for t2=1:w
f44(t2)=f4(e(t2));
f55(t2)=f5(e(t2)); end;
f44
f55
% 考虑费用时候的路段长度 % for t3=1:w
if f44(t3)<=20;
fei1=1;
else
if f44(t3)<=40;
fei1=2;
else fei1=3;
end;
end;
end;
fei1;
for t4=1:w
if (86-f55(t4))<=20; fei2=1;
else
if (86-f55(t4))<=40;
fei2=2;
else fei2=3;
end;
end;
end;
fei2;
for t2=1:w
r1=e(t2);
B3(t2)=f1(r1);
B4(t2)=f2(r1);
end;
B3;
B4;
for t2=1:w
qlx(t2)=A33(B3(t2));
zlx(t2)=A22(B4(t2));
end;
[m,n]=size(f3);
min(f3)
w
e
qlx
zlx
fei0=fei1+fei2+1
附件3 模型检验
X=[路线矩阵];
Y=reshape(x,929,86);%把矩阵分割成929*86% Y(线路1,:);
Y(线路2,:);
for i=1:86
for j=1:86
if Y(线路1,i)~=0&Y(线路2,j)~=0;
if Y(线路1,i)==Y(线路2,j);
i
j
else
continue;
end;
end;
end;
end
附件4:问题二模型一
%使换乘线路上站点变为同一点%
y22=y3(930:931,:)
m1=0;
Sq=input('Sq=');
for i=1:2
for j=1:86
if Sq~=y22(i,j);
disp('');
else
m1=m1+1;
A1(m1)=i;
B1(m1,:)=y22(i,:);
end;
end;
end;
m1;
A11=A1(1,1:m1);%过同一车站路线的行标% B11=B1(1:m1,:);%过同一车站的所有路线%
Sz=input('Sz=');
m2=0;
for i=1:2
for j=1:86
if Sz~=y22(i,j);
disp('');
else
m2=m2+1;
A2(m2)=i;
B2(m2,:)=y22(i,:);
end;
end;
end;
m2;
A22=A2(1,1:m2);%过同一车站路线的行标% B22=B2(1:m2,:);%过同一车站的所有路线%
% 先考虑时间 %
s=0;
for i=1:m1
for j=1:86
for m=1:m2
for l=1:86
if B11(i,j)~=0&B22(m,l)~=0; if B11(i,j)==B22(m,l); s=s+1;
f1(s)=i;
f2(s)=m;
f3(s)=j*3+(6+7);
f4(s)=j;
f5(s)=l;
else
continue;
end;
end;
end;
end;
end;
end;
f1;%起点相同车站的路线行标%
f2;%终点相同车站的路线行标%
f3;%时间最短%
f4;%起点相同车站的路线纵标%
f5;%终点相同车站的路线纵标%
if s~=0
disp('地铁可以直达,费用为3元!');
else
disp('至少要乘公交车!');
end;
附件5:问题二模型二
%使换乘线路上站点变为同一点%
m1=0;
Sq=input('Sq=');
for i=1:929
for j=1:86
if Sq~=y3(i,j);
disp('');
else
m1=m1+1;
A1(m1)=i;
B1(m1,:)=y3(i,:);
end;
end;
end;
m1;
A11=A1(1,1:m1);%过同一车站路线的行标%
B11=B1(1:m1,:);%过同一车站的所有路线%
Sz=input('Sz=');
m2=0;
for i=1:929
for j=1:86
if Sz~=y3(i,j);
disp('');
else
m2=m2+1;
A2(m2)=i;
B2(m2,:)=y3(i,:);
end;
end;
end;
m2;
A22=A2(1,1:m2);%过同一车站路线的行标%
B22=B2(1:m2,:);%过同一车站的所有路线%
% 先考虑时间 %
d11=input('d11=');%d11=0表示不乘地铁,d11=1表示乘地铁% s=0;
for i=1:m1
for j=1:86
for m=1:m2
for l=1:86
if B11(i,j)~=0&B22(m,l)~=0;
if B11(i,j)==B22(m,l);
s=s+1;
f1(s)=i;
f2(s)=m;
f3(s)=j*3+d11*(6+7);
f4(s)=j;
f5(s)=l;
else
continue;
end; end;
end;
end;
end;
f1;%起点相同车站的路线行标%
f2;%终点相同车站的路线行标%
f3;%时间最短%
f4;%起点相同车站的路线纵标%
f5;%终点相同车站的路线纵标%
if s~=0
disp('一次转车即可以!');
else
disp('至少转两次!');
end;
w=0;
for t1=1:s
if f3(t1)==min(f3);
w=w+1;
e(w)=t1;
else
continue;
end;
end;
w;%时间最短时的路线条数%
e;%f3中时间最短时所对应的下标%
for t2=1:w
f44(t2)=f4(e(t2));
f55(t2)=f5(e(t2));
end;
f44;
f55;
for t3=1:w
if f44(t3)<=20; fei1=1;
if f44(t3)<=40;
fei1=2;
else fei1=3;
end;
end;
end;
for t4=1:w
if (86-f55(t4))<=20;
fei2=1;
else
if (86-f55(t4))<=40; fei2=2;
else fei2=3;
end;
end;
end;
fei1;%起点站所对应的最小费用%
fei2;%终点站所对应的最小费用%
for t2=1:w
r1=e(t2);
B3(t2)=f1(r1);
B4(t2)=f2(r1);
end;
B3;
B4;
for t2=1:w
qlx(t2)=A11(B3(t2));
zlx(t2)=A22(B4(t2));
end;
[m,n]=size(f3);
n;
w;
e;
qlx;
zlx;
fei0=fei1+fei2;
y33=y3(qlx,:);
y44=y3(zlx,:);
ss=0;
for p1=1:w
for q1=1:86
for p2=1:w
for q2=1:86
if y33(p1,q1)~=0&y44(p2,q2)~=0; if y33(p1,q1)==y44(p2,q2); ss=ss+1;
rr(ss)=y33(p1,q1);
end;
end;
end;
end;
end;
end;
rr
附件6:问题二模型三
%使换乘线路上站点变为同一点%
m1=0;
Sq=input('Sq=');
for i=1:929
for j=1:86
if Sq~=y3(i,j);
disp('');
else
m1=m1+1;
A1(m1)=i;
B1(m1,:)=y3(i,:);
end;
end;
end;
m1;
A11=A1(1,1:m1);%过同一车站路线的行标%
B11=B1(1:m1,:);%过同一车站的所有路线%
Sz=input('Sz=');
m2=0;
for i=1:929
for j=1:86
if Sz~=y3(i,j);
disp('');
else
m2=m2+1;
A2(m2)=i;
B2(m2,:)=y3(i,:);
end;
end;
end;
m2;
A22=A2(1,1:m2);%过同一车站路线的行标%
B22=B2(1:m2,:);%过同一车站的所有路线%
% 先考虑时间 %
d11=input('d11=');%d11=0表示不乘地铁,d11=1表示乘地铁% s=0;
for i=1:m1
for j=1:86
for m=1:m2
for l=1:86
if B11(i,j)~=0&B22(m,l)~=0;
if B11(i,j)~=B22(m,l);
disp('');
else
s=s+1;
end;
end;
end;
end;
end;
end
s;
if s==0;
disp('至少转两次车(汽车或地铁)!');
else
disp('转一次车即可!');
end
%均成功了%
m3=0;
for i=1:929
for j=1:86
if B11(1,1)~=y3(i,j);
disp('');
else
m3=m3+1;
A3(m3)=i;
B3(m3,:)=y3(i,:);
end;
end;
end;
m3;
A33=A3(1,1:m3)
B33=B3(1:m3,:)
s1=0;
for i=1:m3
for j=1:86
for m=1:m2
for l=1:86
if B33(i,j)~=0&B22(m,l)~=0; if B33(i,j)~=B22(m,l); disp('');
else
s=s+1;
f1(s)=i;
f2(s)=m;
f3(s)=j+86-1;
f4(s)=j;
f5(s)=l;
end;
end;
end;
end;
end;
end
s;
f1;
f2;
min(f3);
f4;
f5;
w=0;
for t1=1:s
if f3(t1)==min(f3);
w=w+1;
e(w)=t1;
else
continue;
end;
end;
w;%时间最短时的路线条数%
e;%f3中时间最短时所对应的下标%
for t2=1:w
f44(t2)=f4(e(t2));
f55(t2)=f5(e(t2));
end;
f44;
f55;
for t3=1:w
if f44(t3)<=20;
fei1=1;
else
if f44(t3)<=40;
fei1=2;
else fei1=3;
end;
end;
end;
for t4=1:w
if (86-f55(t4))<=20;
fei2=1;
else
if (86-f55(t4))<=40; fei2=2;
else fei2=3;
end;
end;
end;
fei1;%起点站所对应的最小费用%
fei2;%终点站所对应的最小费用%
for t2=1:w
r1=e(t2);
B3(t2)=f1(r1);
B4(t2)=f2(r1);
end;
B3;
B4;
for t2=1:w
qlx(t2)=A33(B3(t2));
zlx(t2)=A22(B4(t2));
end;
[m,n]=size(f3);
n
w
e
qlx
zlx
fei0=fei1+fei2 ;
y33=y3(qlx,:);
y44=y3(zlx,:);
ss=0;
for p1=1:w
for q1=1:86
for p2=1:w
for q2=1:86
if y33(p1,q1)~=0&y44(p2,q2)~=0; if y33(p1,q1)==y44(p2,q2); ss=ss+1;
rr(ss)=y33(p1,q1);
end;
end;
end;
end;
end;
end;
rr。

相关文档
最新文档