(请先阅读“全国大学生数学建模竞赛论文格式规范”)
2016年2月21日,国务院发布《关于进一步加强城市规划建设管理工作的若干意见》,其中第十六条关于推广街区制,原则上不再建设封闭住宅小区,已建成的住宅小区和单位大院要逐步开放等意见,引起了广泛的关注和讨论。
除了开放小区可能引发的安保等问题外,议论的焦点之一是:开放小区能否达到优化路网结构,提高道路通行能力,改善交通状况的目的,以及改善效果如何。一种观点认为封闭式小区破坏了城市路网结构,堵塞了城市“毛细血管”,容易造成交通阻塞。小区开放后,路网密度提高,道路面积增加,通行能力自然会有提升。也有人认为这与小区面积、位置、外部及内部道路状况等诸多因素有关,不能一概而论。还有人认为小区开放后,虽然可通行道路增多了,相应地,小区周边主路上进出小区的交叉路口的车辆也会增多,也可能会影响主路的通行速度。
城市规划和交通管理部门希望你们建立数学模型,就小区开放对周边道路通行的影响进行研究,为科学决策提供定量依据,为此请你们尝试解决以下问题:
请选取合适的评价指标体系,用以评价小区开放对周边道路通行的影响。
请建立关于车辆通行的数学模型,用以研究小区开放对周边道路通行的影响。
小区开放产生的效果,可能会与小区结构及周边道路结构、车流量有关。请选取或构建不同类型的小区,应用你们建立的模型,定量比较各类型小区开放前后对道路通行的影响。
根据你们的研究结果,从交通通行的角度,向城市规划和交通管理部门提出你们关于小区开放的合理化建议。
为了评价小区开放对周边道路通行的影响,可以选取以下合适的评价指标体系:
平均延误时间:考虑到车辆通行效率,可以通过测量小区开放前后周边道路上车辆的平均延误时间差来评价通行情况。
车流量变化:考虑到交通流量的变化,可以统计小区开放前后周边道路上的车辆流量差异,从而评价开放对车辆通行的影响。
交通拥堵指数:可以通过计算开放前后周边道路的交通拥堵指数来评估小区开放对交通状况的改善程度。
交通事故发生率:可以比较小区开放前后周边道路上的交通事故发生率,评价开放对道路安全的影响。
建立关于车辆通行的数学模型来研究小区开放对周边道路通行的影响,可以考虑以下方面:
元胞自动机模型:将车辆看作元胞,在模型中制定元胞运动规则,模拟车辆在周边道路上的通行情况。
优化路径选择模型:考虑到车辆选择路径的影响,可以设计优化路径选择函数来模拟车辆选择最优路线的过程。
通过应用建立的数学模型,可以定量比较不同类型的小区开放前后对道路通行的影响。根据不同类型的小区结构、周边道路结构和车流量的变化,可以进行以下研究:
比较不同小区结构:选择不同类型的小区,例如高层住宅小区和别墅社区,分别研究开放前后对周边道路通行的影响,比较其差异。
比较周边道路结构:选择周边道路结构不同但小区结构相似的区域,比较开放前后对道路通行的影响,以评估道路结构对通行的影响。
比较不同车流量:根据实际情况设置不同的车流量,并观察开放前后对周边道路通行的影响,从而评价车流量对通行的影响程度。
根据研究结果,可以向城市规划和交通管理部门提出关于小区开放的合理化建议,包括:
在城市规划中考虑道路通行因素:在规划新建小区或进行城市改造时,应充分考虑小区开放对周边道路通行的影响,合理设计道路网络和交通流动模式。
加强交通信息传播:提高实时路况信息的传播,使车辆驾驶员可以根据路况选择最优路径,减少资源浪费和效用损失。
针对不同类型的小区,采取针对性的管理措施:根据研究结果,针对不同类型的小区特点,制定相应的规范和管理策略,以提高道路通行效率和安全性。
交通是城市的命脉,开放小区会对周边道路车辆通行产生多方面的影响。为了帮助交通管理部门和城市规划部门做出科学决策,需要针对不同类型的小区分情况权衡小区开放带来的正、负效应。本文针对小区开放对周边道路通行的影响问题,以元胞自动机、相关性分析、优化理论和控制变量法为理论基础建立了完整的数学模型。
针对问题一,由分析可知小区开放从两个方面对周边道路的车辆通行产生影响:一方面小区开放后内部道路分担了周边道路的部分车流量,减少了有信号灯的交叉路口的平均延误时间;另一方面,由于进出小区的车辆增多导致小区进出口车辆分、合流效应增加,延长了后方车辆的排队时间。因此,周边道路的交叉口所产生的平均延误时间的总和可以有效衡量车辆通行情况。本文选取小区开放前后周边道路上平均延误时间之差(下称前后延时差)来衡量小区开放对周边道路车辆通行的影响。
针对问题二,将车看作元胞,根据车辆所在位置制定元胞运动规则,构造基于元胞自动机的车辆通行模型。根据车辆所在位置可分为四个子模型:车辆进入研究区域模型、一般道路模型、有信号灯的交叉路口模型以及无信号灯的交叉路口模型。在两个交叉路口模型中,根据路况信息的完全程度,制定了两种元胞路径选择规则:当路况信息不完全时,车辆等概率随机选择道路;若路况信息较为完全时,车辆利用优化路径选择函数来选择最优道路。用计算机模拟车辆通行模型以获得小区开放前后周边道路的实时车流量,从而可得前后延时差。
针对问题三,用道路节点数目来量化小区内部道路类型、用小区内部道路的可替代道路长度来量化周边道路类型、用车辆进入道路的概率来量化周边道路的车流量,采用控制变量法,结合相关性分析,得出了不同情况下小区开放对周边道路车辆通行的影响。先考虑简化后的模型,即不考虑出入口的分、合流效应,前后延时差只受有信号灯的交叉路后延时缩短的影响,因此前后延时差始终为正。进行三组控制变量实验,得到结论:控制其他因素不变,前后延时差与小区内部道路长度呈负相关关系;与小区内部道路节点数目呈负相关关系;与周边道路车流量呈现先正后负的相关关系,可以求得使前后延时差最大的最优车流量。再者考虑完整的模型,即考虑小区出入口的分、合流效应,前后延时差受到有信号灯的交叉路口延时缩短和小区出入口排队时间增长的共同作用,着重考虑前后延时差为负值的情况:控制其他因素不变,前后延时差为负值的比率与小区内部道路长度无显著相关关系;与周边道路车流量在 0.01 的显著性水平下呈现正相关关系。在信息较为完全的条件下,应用问题二中的优化路径选择函数,出入口存在分、合流效应的小区也可以实现前后延时差非负的情况。
针对问题四,城市规划部门在开放已建成小区的时候,应重点考虑开放内部交通复杂度低、内部道路长度短、周边道路车流量大的小区;在新建小区时也应考虑这些因素。交通管理部门应重点加大实时路况信息的传播,缓解由于信息不完全而带来的资源浪费和效用损失,使得车辆驾驶员可以根据路况信息选择最优路径,从而使得小区开放对周边道路通行的正效应最大。
交通状况恶化成为城市中日益凸显的问题,因此,建设开放型小区并逐步开放已建成的住宅小区被提上议程。利用小区内部道路来疏散周边道路的交通是否真的可以改善周边道路的车辆通行状况?一方面,承担“毛细血管”功能的小区内部道路分担了部分车流,车辆可选择的道路增多,客观上可以提高周边道路的通行能力;另一方面,小区开放后会导致进出小区的车辆增多,因此会增加小区出入口处的交通复杂度,增加主路车辆的排队时间,从而影响周边道路的通行速度。所以,研究开放小区对周边道路通行的影响不能一概而论,应从小区面积、地理位置、内外部道路状况出发,分类型、有针对地进行建模分析,从而为科学决策提供合情合理的定量依据。
为了更好的研究不同情况下开放小区对周边道路通行的影响,本文依次提出了以下问题:
(1)选取合适的评价指标体系,来评价小区开放如何影响周边道路通行。
(2)为研究小区开放如何影响周边道路通行,建立关于车辆通行的数学模型。
(3)小区开放后对周边道路的影响与许多变量有关,例如小区的结构以及周边道路的结构和车流量。选取或构建不同类型的小区,应用建立的模型来定量比较各种条件下小区开放对周边道路通行的影响。
(4)根据以上研究结果,从交通通行的角度出发,就小区开放的问题向交通管理和城市规划部门提出合理化的建议。
问题一要求选择合适的评价指标体系来评价小区开放对周边道路车辆通行的影响。首先需要明确小区开放对周边道路车辆通行的影响因素,以及这些影响因素所缓解或加重的共同交通现象。其次,需要选取合适的指标来量化这些影响现象,从而建立评价指标体系。
问题二要求建立关于车辆通行的数学模型,研究小区开放对周边道路通行的影响。根据问题一的分析,研究小区开放对周边道路通行的影响涉及通行能力的增大和通行速度的降低。因此,需要建立小区周边道路上的车辆通行模型,并将之拆分为多个子模型,针对不同道路类型进行建模。利用路径选择函数来模拟车辆在道路上的路径选择,得到整个研究范围内的车辆通行情况,并计算评价指标体系中的参数,以直观地展示小区开放对周边道路通行的影响。
问题三指出小区开放对周边道路的影响可能因条件不同而异,因此需要考虑小区的结构、周边道路的结构和车流量等因素。首先,应明确哪些变量可以用来量化这些因素,并对评价指标体系产生影响。其次,进行控制变量实验,在保持其他因素一定条件下,改变某一因素,观察小区开放前后评价指标的变化情况。然后,利用控制变量实验收集到的数据进行相关性分析,从统计学的角度给出更科学、合理、有说服力的结论。
问题四要求根据研究结果,从交通通行的视角,向城市规划和交通管理部门提出合理的建议。这些建议包括:对城市规划部门的建议,包括在建设新的开放型小区时应重点考虑哪些有利的小区结构和道路类型,以及应该开放什么类型的已建成小区;对交通管理部门的建议,包括如何在开放小区或不开放某些已建成小区的基础上合理管理交通,以实现交通通行的最优化。
(1) 小区周边道路均为双车道,即同方向只有一条机动车道。
(2) 小区周边道路在机动车道和非机动车道之间设有分隔带。
(3) 研究的车辆只包含四轮以上的机动车,且均考虑为标准车辆。
(4) 小区周边道路坡度为0。
(5) 受小区开放影响的道路只包括与小区出入口处车流存在分、合流现象的道路及小区内部道路的替代道路。(更详细的图示见5.1.1)
(6) 若在小区出入口处设有交通信号灯,则允许车辆左转进出小区。否则,小区出入口处不允许机动车左转。
(7) 不考虑路面公交车及停车位的影响。
(8) 不考虑交通事故的影响及大范围违法穿行的情况。
(9) 车辆进入小区周边道路的概率分布满足平稳性。
(10) 假设小区开放前进出小区的车辆很少,因此不考虑小区开放前出入口处的因车辆分、合流现象产生的延误时间。
(1) 在四车道或六车道的条件下,当道路上存在无信号灯交叉口的时候,车辆更倾向于靠内侧道路行驶,且内侧车道受交叉口分、合流的影响比较小。因此,为简便计算,可以将模型简化为只考虑双车道的情况。
(2) 在交通较为拥堵的路段,才值得讨论是否有必要开放小区来疏散交通。若该区域交通通畅,则在短时间内没有必要耗费财力物力、承担安全风险来开放小区。因此本文将研究的对象定位于已经或有明显趋势出现交通拥堵的路段。在这种路段中,如果在小区出入口处不设信号灯且允许车辆左转进入小区,则会造成来向和对向两条道路的延误,对道路通行影响较大,极易造成拥堵。因此,假设只有在小区出入口处设有交通信号灯的前提下才允许车辆左转进入小区,是合理的。
根据引言和给定的信息,小区开放对周边道路通行产生了反向的影响。一方面,小区开放后,内部道路可以减少周边道路的车流量,提高周边道路的通行能力;另一方面,进出小区的车辆增加会增加主路上的车辆排队时间,降低周边道路的通行速度。为了评价小区开放前后周边道路的拥堵情况变化,可以使用交通拥堵指数来衡量。该指数主要考虑交叉路口延误时间的增长,通过计算有信号灯的交叉路口平均延误时间的差值来评价。
具体地,定义前后延时差(ΔDT)作为评价指标,它反映了小区开放对周边道路通行的影响。ΔDT的计算公式如下:
ΔDT = ∑(YDTi - YDTia) / n
其中,n为受影响的有信号灯交叉路口数量,YDTi为小区开放前第i个交叉口路口处的平均延误时间,YDTia为小区开放后第i个交叉口路口处的平均延误时间。
在计算中,还需要计算有信号灯的交叉路口平均延误时间(YDT)和小区入口平均延误时间(NDT)。YDT的计算公式为:
YDT = T * (1 - exp(-x * t / C))
其中,T为信号灯周期长度,tg为有效绿灯时间,x为道路饱和率,C为道路设计通行能力。
对于小区入口平均延误时间(NDT),可采用参考文献中给出的计算公式进行计算。
综上所述,通过计算前后延时差ΔDT以及有信号灯交叉路口平均延误时间YDT和小区入口平均延误时间NDT,可以量化小区开放前后周边道路的拥堵情况变化,进而评估小区开放对周边道路通行的影响。
5.2.1 问题分析
为了研究受小区开放影响的周边道路上车辆通行情况,我们可以使用元胞自动机来建立车辆通行模型。通过将车辆视为元胞,并结合不同的模型,可以模拟小区内部及周边道路的车辆通行情况,并计算出各条道路上的实时交通量 R。进而可以根据公式(5.1.2)和(5.1.4)求得两种交叉路口的平均延误时间,并代入公式(5.1.1)中计算周边道路的前后延时差 ΔDT。
5.2.2 模型建立
在这个问题中,我们使用元胞自动机作为模型来描述车辆的状态和运行规则。具体模型规则如下:
此外,我们还定义了几个在模型中使用到的概念。车辆的状态包括车辆所在的道路和位移等信息。车辆的预状态是指在区域内没有其他车辆或道路完全通畅、车辆之间不会相互干扰的情况下,车辆在下一时刻理应到达的状态。
5.2.2.1 车辆进入研究区域的模型
在这个模型中,我们使用概率 δ 来模拟车辆进入研究区域的情况。每个单位时间内,车辆以概率 δ 进入研究区域。同时,我们将新进入的车辆设置为初始状态,即处于入口道路的末端位置,面临着选择进入哪个交叉路口的问题。
5.2.2.2 一般道路上的车辆通行模型
该模型适用于不在交叉口上的车辆状态转移模型。具体计算步骤如下:
5.2.2.3 无信号灯的交叉路口车辆通行模型
对于无信号灯的交叉口,包括小区内的交叉口和小区的出入口,我们假设去往不同道路的车辆互不干扰。在驶入道路之前,车辆驾驶员无法判断哪条道路更通畅,因此随机选择一条道路进入。具体路径选择方案为“等概率随机选择前方路径方案”。
5.2.2.4 有信号灯的交叉路口车辆通行模型
对于有信号灯的交叉口,定义 L(t) 为交通信号灯状态。当车辆处于有信号灯的交叉路口时,根据信号灯状态进行状态转移:
5.2.3 模型改进
考虑到现代科技的发展,信息不完全的效用损失得以缓解。例如,可以利用实时交通信息发布,帮助驾驶员选择路径。因此,我们对路径选择函数进行改进。
新的路径选择规则为:在从道路集合 Q 中选择道路时,不再使用等概率随机选择,而是根据比重选择。每条道路 j 的比重函数 weight_j 定义如下:
weight_j = k1 * (V - M) + k2 * R
其中,k1和k2 是比重函数的设计参数,在本实验中均取 1;V 是一个足够大的修正因子,大于所有道路中 k1l + k2R 的最大值;l 是该路的逻辑距离,即车辆通过该路需要多少单位时间。在选择道路时,应选择道路集合 Q 中比重函数值最小的那条路。
这些是建立车辆通行模型的基本思路和方法,通过模拟和计算可以得到交通量、平均延误时间和前后延时差等指标。
不同条件下小区开放对周边道路通行的影响不同,因此需要考虑小区的道路结构以及周边道路的结构和车流量等因素。在计算机模拟过程中,用以下变量来量化这些因素。
表 1 影响因素及量化变量对应表
因素 变量
小区周边道路结构 小区内道路的长度 sc(即周边可替代路的长度)
小区内部道路结构 小区内道路节点个数 num
小区周边道路车流量 R 车辆进入该研究区域的概率
首先,考虑简化的小区模型 5.3.1,即不存在分、合流效应。在此基础上考虑 5.3.2 中的小区,即存在分、合流效应,对该小区内道路的长度 sc 和小区周边道路车流量 R 进行控制变量实验。
5.3.1 不存在分、合流效应的小区
(1)基本模型
考虑如下小区类型,受小区开放影响的道路有①和②两条,因为小区出入口位于十字路口某一出口方向,因此小区出入口处不存在合流与分流的现象,车流只受信号灯的控制,前后延时差 DT 只与有信号灯的交叉路口的平均延误时间YDT 有关。
假设小区内部路长 sc = 100s0 ,tg T = 0.25 ,T = 20 ,小区周边道路车流量 R = 0.5 。用 MATLAB 实现问题二的车辆通行模型,得到平均延时如下图所示:
(图略)
由上图可知,小区开放后明显降低了平均延误时间。这是由于该小区周边道路只受到有信号灯的交叉路口的延误时间YDT 的影响,当小区开放后,小区内部道路③分担了周边道路的一部分车流量,降低了周边道路的通行压力,因此有效的提高了通行能力。另一方面,由于小区出入口不存在分流和合流现象,小区开放不会降低道路的通行速度。因此,该类小区开放后有利于周边道路的通行。
(2)控制变量实验
当小区内部的道路结构和周边道路结构变化时,小区开放对周边道路通行的影响不同。为研究这一问题,分别对小区内部道路长度 sc 、小区周边道路车流量 R 和小区内部道路节点个数 num 进行控制变量实验。
① 小区内部道路长度 sc 对平均延时的影响
保持其他变量不变,当小区内部道路距离 sc 发生变化时,得到平均延时的数值变化如图所示:
(图略)
由上图可知,当其他变量一定时,平均延迟时间与小区内道路距离呈正相关关系。小区内部道路距离越短,则开放小区后对周边道路通行的正效应越大。
② 小区内部道路节点数 num 对平均延时的影响
考虑小区内部有两条道路的情况:若两条道路之间有一条道路将二者联通,则可认为小区内部道路节点数 num = 2 ;若两条道路之间有两条道路将二者联通,则可认为小区内部道路节点数 num = 4 。
保证其他因素不变,用计算机模拟问题二中的车辆通行模型,得到平均延误时间和小区内部道路节点数目关系如图所示:
(图略)
由上图可以直观的看出,小区内部道路节点数目越多,小区开放后的平均延误时间越长,即前后延时差 DT 越小。
③ 小区周边道路车流量 R 对平均延时的影响
保持其他变量不变,改变小区周边道路车流量 R ,得到前后延时差 DT 的数值变化。用 SPSS 对周边道路车流量 R 和前后延时差 DT 作相关性分析,得到结果如下表。
(表略)
由表中数值可知,周边道路车流量 R 和平均延误时间差值 的相关系数为 0.988,p 值小于 0.01,即在 0.01 的水平上呈现出显著的正相关关系。为更直观的反映二者的关系,绘出不同 R 值下的平均延迟时间随研究时间t 的变化示意图:
(图略)
由上图直观可知,保持其他变量不变时,小区周边道路车流量 R 变化时,小区开放前后平均延迟时间的差值并非随之单调变化,即存在一个最优的周边道路车流量 R ,使得小区开放对周边道路通行的正效应最大。
根据前面问题的分析结果,我们建议城市规划部门在开放已建成小区时,应重点考虑以下因素:
我们建议交通管理部门重点加大实时路况信息的传播力度,以缓解由于信息不完全而带来的资源浪费和效用损失。具体建议如下:
(1) 该模型较为全面地考虑了现实情况,将车辆通行模型抽象为若干子模型,并考虑了不同小区类型的影响因素,保证了模型的科学性和严密性。
(2) 在模型求解过程中,充分利用了数学软件如Matlab,成功解决了问题,并得到了较为理想的结果。
(3) 模型的量化指标和数据来源较为合理,保证了模型的完整性和适用性。
(1) 考虑机动车和非机动车在道路上的混行情况,修改自行车的影响系数,以更准确地反映现实情况。
(2) 将周边道路的坡度纳入考虑,以提高模型的适用性。
(3) 考虑同向多车道的情况,以更全面地反映车辆通行情况。
(4) 考虑车流量到来的时间趋势,如早晚高峰时段,以更真实地模拟车辆通行情况。
(5) 扩充评价指标,使模型更全面地评估小区开放对周边道路车辆通行的影响。
通过对模型的改进,我们可以更准确地预测和评估小区开放对周边道路通行的影响,为相关部门制定政策和规划提供更有针对性的建议。
附录
注:以下均为本次比赛过程中有用的 matlab 执行脚本程序或函数
1、道路运行情况模拟程序
clc;
%clear;
Tmax = 1000; %考虑的时间的上限
carnum = 0; %carnum 是当前通过的车的总数目
fieldCarNum = 0; %fieldCarNum 进入小区的车辆数
%beta = 8; %1-alpha / 10,为出现车的概率,体现车流量
fieldCapure = 800; %小区内道路的承载量
fieldDistance = 80; %小区内道路的逻辑长度
fRpb = 0.8; %行人自行车修正系数
R = 0.5; %主路进入小区的比例
L1 = 0.005; %车身长度,km
h = 0.0025; %标准饱和车头时距
alpha = pi / 4; %转弯角度
mu = 0.18; %横向力系数
v = 50; %车辆速度
t_avg = L1 / v ; %畅通情况下车辆直行通过计算截面的平均耗时
ER = (L1 + alpha * R)/(h * sqrt(127 * R * mu));
%右转车转换系数
fR = 100/(100 + R * (ER - 1));
%右转修正系数
theta = 0; %车辆入口延时的影响因子
delay = zeros(Tmax, 1); %记录入口延时
T = 20; %路灯周期
Tg = 5; %绿灯时间
Car = cell(carnum,1); %Car 是所有的车的集合
Car0 = cell(carnum,1); %Car 是所有的车的集合
car = struct('road',0,'distance',0,'state',0); %road 是当前车所在的道路,
distance 表示在这条路上的位置,state 表示是否在区域里,1 在里面,0 在外面
t = 0; %当前时间
Dt = cell(t,1); %每个时刻的平均延误
Dt0 = cell(t,1); %每个时刻的平均延误
Light = 0; % Light 表示当前灯是红灯 0,还是绿灯 1
roadnum = 4; %roadnum 是所有的道路数目
Outroad = []; % 与出口相连的路
Outroad(1) = 4;
Inroad = [2,3]; %与入口相连的路
FieldRoad = []; %小区内的路
FieldRoad(1) = 3;
21
Troad = zeros(roadnum,1);%每条路上的路灯周期
Tgroad = zeros(roadnum,1);%每条路上绿灯时间
RoadMap = zeros(roadnum,roadnum); %路的可达性矩阵
RoadMap0 = zeros(roadnum,roadnum); %路的可达性矩阵
Roadcapture = zeros(roadnum,1); %Roadcapture 路的设计承载量
Roadcarnum = zeros(roadnum,1); %Roadcarnum 路当前有的车数量
Roadcarnum0 = zeros(roadnum,1); %Roadcarnum 路当前有的车数量
Roaddistance = zeros(roadnum,1);%Roaddistance 路的距离
Roaddt = zeros(roadnum,1); %Roaddt 每条路上的平均延迟时间
Roadcapture = [1000,1000,1000,1];
Roadcapture(3) = fieldCapure;
Roadcapture = Roadcapture';
Roaddistance = [100,100,100,1];
Roaddistance(3) = fieldDistance;
Troad(:) = 20;
Tgroad(:) = 5;
RoadMap = [0,0,0,0;1,0,0,0;1,0,0,0;0,1,1,0];
RoadMap0 = [0,0,0,0;1,0,0,0;0,0,0,0;0,1,0,0];
myres = zeros(500,4);
Flag = [0,1,0,0]';
mainflow = 3600 * (1 - beta / 10); %主路的车流量
for t = 1:Tmax
%%%%%%判断当前是否有车到来 0 没有,1 有
Dt{t} = 0;
Dt0{t} = 0;
ra = rand();
if ra >= beta / 10
ra = 1;
else
ra = 0;
end
%%%%%%增加车的数量,更新车的情况
if ra == 1
carnum = carnum+1;
car.road = 1;
car.distance = Roaddistance(1);
car.state = 1;
Car{carnum} = car;
Car0{carnum} = car;
Roadcarnum(1) = Roadcarnum(1)+1;
Roadcarnum0(1) = Roadcarnum0(1)+1;
end
%%%%%%判断当前红绿灯情况
Light = mod(t,T);
if Light <= Tg
Light = 1;
else
Light = 0;
end
for cari = 1:carnum
if(Car{cari}.state == 0)
continue;
end
%%不考虑小区开放时
if Light == 1 %%%绿灯时
[nextroad,nextdistance,nextstate] =
nextdir(cari,RoadMap0,Car0,Roaddistance,Outroad,Roadcarnum0); %%%函数
nextdir 返回 cari 这辆车下一次所在的路的在路上的距离
else %%%%红灯时
[nextroad,nextdistance,nextstate] =
nextdir_red(cari,RoadMap0,Car0,Roaddistance,Outroad,Roadcarnum0);
end
Roadcarnum0(Car0{cari}.road) = Roadcarnum0(Car0{cari}.road)-1;
Car0{cari}.road = nextroad;
Car0{cari}.distance = nextdistance;
Car0{cari}.state = nextstate;
if nextstate == 1
Roadcarnum0(nextroad) = Roadcarnum0(nextroad)+1; %%%%%%当前
这条路上的车的数量
end
%%考虑小区开放时
% disp(strcat('car', num2str(cari)));
if Light == 1 %%%绿灯时
[nextroad,nextdistance,nextstate] =
nextdir(cari,RoadMap,Car,Roaddistance,Outroad,Roadcarnum); %%%函数
nextdir 返回 cari 这辆车下一次所在的路的在路上的距离
else %%%%红灯时
22
23
[nextroad,nextdistance,nextstate] =
nextdir_red(cari,RoadMap,Car,Roaddistance,Outroad,Roadcarnum);
end
myres(t, 1) = nextroad;
myres(t, 2) = nextdistance;
myres(t, 3) = nextstate;
myres(t, 4) = cari;
Roadcarnum(Car{cari}.road) = Roadcarnum(Car{cari}.road)-1;
Car{cari}.road = nextroad;
Car{cari}.distance = nextdistance;
Car{cari}.state = nextstate;
if nextstate == 1
Roadcarnum(nextroad) = Roadcarnum(nextroad)+1; %%%%%%当前这
条路上的车的数量
end
end
if( ra == 1 && ismember(nextroad, FieldRoad) )
fieldCarNum = fieldCarNum + 1;
theta = theta + 1;
else
if(theta >= 0.3)
theta = theta - 0.3;
else
theta = 0;
end
end
if(carnum > 0)
R = R * 0.5 + 0.5 * fieldCarNum / carnum;
ER = (L1 + alpha * R)/(h * sqrt(127 * R * mu));%右转车转换系数
fR = 100/(100 + R * (ER - 1));%右转修正系数
x = ( mainflow) / Roadcapture(1); %道路饱和度
C1 = x * (fRpb + fR); %主流向通行能力
NDT = (1/C1 - t_avg) * (1/t_avg + 1) * t_avg / 2; %信号交叉路口平
均延误
Dt{t} = theta * NDT;
delay(t) = Dt{t};
end
%%%%%%计算每条路的平均延误时间
dt =
((0.5*Troad).*(1-Tgroad./Troad))./(1-min(1,Roadcarnum.*(720./Roaddist
ance')./Roadcapture).*(Tgroad./Troad)).*Flag;
Dt{t} = Dt{t} + sum(dt);
24
dt0 =
((0.5*Troad).*(1-Tgroad./Troad))./(1-min(1,Roadcarnum0.*(720./Roaddis
tance')./Roadcapture).*(Tgroad./Troad)).*Flag;
Dt0{t} = Dt0{t} + sum(dt0);
end
dtDelta = cell2mat(Dt0) - cell2mat(Dt);
save(strcat(num2str(beta), 'dtDelta_6.mat'), 'dtDelta');
save(strcat(num2str(beta), 'Dt_6.mat'), 'Dt');
save(strcat(num2str(beta), 'Dt0_6.mat'), 'Dt0');
2、绿灯时,车辆状态移动函数
function
[nextroad,nextdistance,nextstate]=nextdir(cari,RoadMap,Car,Roaddistan
ce,Outroad, RoadCarNum)
% 函数 nextdir 返回 cari 这辆车这一秒之后的状态
% nextroad: 1s 后所在的路
% nextdistance:1s 后在路上距路入口的逻辑距离
% nextstate: 1s 后,该车是否还在区域内
% cari:车的序号
% RoadMap: 路的可达性矩阵
% Car:当前各辆车的状态
% Roaddistance:每条路的长度
% Outroad:所有可能出去的路
% RoadCarNum: 当前每条路上有多少车
car = Car{cari}; %当前正在考虑的车
nextroad = car.road;
nextdistance = car.distance;
if car.distance >= Roaddistance(Car{cari}.road) &&
ismember(car.road,Outroad);
nextstate = 0;
return;
else
nextstate = 1;
end
nextdistance = nextdistance + 1;
if(Roaddistance(nextroad) < nextdistance)
nextroad = chooseRoad(cari,nextroad,RoadMap,Car,Roaddistance,
RoadCarNum); %%%交叉路口选择路的方向
nextdistance = 1;
% disp(strcat('car', num2str(cari)));
% disp(strcat('change road to', num2str(nextroad)));
end
for i = 1 : (cari - 1)
if(Car{i}.state == 1 && Car{i}.road == nextroad &&
Car{i}.distance == nextdistance)
%%%% 车辆不能走,
nextroad = car.road;
nextdistance = car.distance;
end
end
3、红灯时,车辆转移函数
function
[nextroad,nextdistance,nextstate]=nextdir_red(cari,RoadMap,Car,Roaddi
stance,Outroad, RoadCarNum)
% 函数 nextdir 返回 cari 这辆车这一秒之后的状态
% nextroad: 1s 后所在的路
% nextdistance:1s 后在路上距路入口的逻辑距离
% nextstate: 1s 后,该车是否还在区域内
% cari:车的序号
% RoadMap: 路的可达性矩阵
% Car:当前各辆车的状态
% Roaddistance:每条路的长度
% Outroad:所有可能出去的路
% RoadCarNum: 当前每条路上有多少车
car = Car{cari}; %当前正在考虑的车
nextstate = 1;
nextroad = car.road;
nextdistance = car.distance;
if car.distance >= Roaddistance(Car{cari}.road) &&
ismember(car.road,Outroad);
return;
end
nextdistance = nextdistance + 1;
if(Roaddistance(nextroad) < nextdistance)
nextroad = chooseRoad(cari,nextroad,RoadMap,Car,Roaddistance,
RoadCarNum); %%%交叉路口选择路的方向
nextdistance = 1;
end
for i = 1 : (cari - 1)
if(Car{i}.state == 1 && Car{i}.road == nextroad &&
Car{i}.distance == nextdistance)
%%%% 车辆不能走,
nextroad = car.road;
nextdistance = car.distance;
end
end
25
26
4、方向选择函数,即车辆到达交叉路口时,选择下一条路的判断函数
其中包括两种方案:根据最优选择、随即选择
function [nextroad] = chooseRoad(cari,currentRoad,
RoadMap,Car,Roaddistance, RoadCarNum)
%%%交叉路口选择路的方向
% nextroad:选择的下一条路的标号
% cari:车的序号
% currentRoad: 当前所在的路的标号
% RoadMap: 路的可达性矩阵
% Car:当前各辆车的状态
% Roaddistance:每条路的长度
% RoadCarNum: 当前每条路上有多少车
k1 = 1;%%%%两个参数
k2 = 1;
nextroad = 0;
min = intmax();
roadNum = length(RoadMap);
% disp(strcat('currentroadNum', num2str(currentRoad)));
myNeighbor = zeros(roadNum);
myNeighborNum = 0;
for i = 1 : roadNum
if(RoadMap(i, currentRoad) == 0) %%道路不通的情况
continue;
end
myNeighborNum = myNeighborNum + 1;
myNeighbor(myNeighborNum) = i;
% disp(strcat('roadNum', num2str(i)));
%{ 根据最优选择
myvalue = 0;
for j = 1 : (cari - 1)
if(Car{j}.state == 1 && Car{j}.road == i && Car{j}.distance ==
1)
%%%% 判断走这条路是否需要等
myvalue = intmax() - 100000;
break;
end
end
%%计算每条路的指标
myvalue = myvalue + k1 * Roaddistance(i) + k2 * RoadCarNum(i);
if(myvalue < min)
min = myvalue;
27
nextroad = i;
end
%}
% disp(i);
% disp(myvalue);
end
%%随即选择
nextroad = myNeighbor(ceil(rand() * (myNeighborNum)));
5、作图函数模板脚本
load('60Dt.mat');
load('60Dt0.mat');
load('60dtDelta.mat');
Dt_60 = cell2mat(Dt);
Dt0_60 = cell2mat(Dt0);
DtDelta_60 = dtDelta;
load('80Dt.mat');
load('80Dt0.mat');
load('80dtDelta.mat');
Dt_80 = cell2mat(Dt);
Dt0_80 = cell2mat(Dt0);
DtDelta_80 = dtDelta;
load('100Dt.mat');
load('100Dt0.mat');
load('100dtDelta.mat');
Dt_100 = cell2mat(Dt);
Dt0_100 = cell2mat(Dt0);
DtDelta_100 = dtDelta;
load('120Dt.mat');
load('120Dt0.mat');
load('120dtDelta.mat');
Dt_120 = cell2mat(Dt);
Dt0_120 = cell2mat(Dt0);
DtDelta_120 = dtDelta;
load('140Dt.mat');
load('140Dt0.mat');
load('140dtDelta.mat');
Dt_140 = cell2mat(Dt);
Dt0_140 = cell2mat(Dt0);
DtDelta_140 = dtDelta;
load('160Dt.mat');
load('160Dt0.mat');
load('160dtDelta.mat');
Dt_160 = cell2mat(Dt);
Dt0_160 = cell2mat(Dt0);
DtDelta_160 = dtDelta;
load('180Dt.mat');
load('180Dt0.mat');
load('180dtDelta.mat');
Dt_180 = cell2mat(Dt);
Dt0_180 = cell2mat(Dt0);
DtDelta_180 = dtDelta;
load('200Dt.mat');
load('200Dt0.mat');
load('200dtDelta.mat');
Dt_200 = cell2mat(Dt);
Dt0_200 = cell2mat(Dt0);
DtDelta_200 = dtDelta;
x=1:500;
plot(x, Dt_60,x, Dt_80,x, Dt_100,x, Dt_120,x, Dt_140,x, Dt_160,x,
Dt_180,x, Dt_200);