| 赛区评阅编号(由赛区组委会填写): ————————————————————————————————————————————————————————————————————————— 2016年高教社杯全国大学生数学建模竞赛 承 诺 书 我们仔细阅读了《全国大学生数学建模竞赛章程》和《全国大学生数学建模竞赛参赛规则》 (以下简称为“竞赛章程和参赛规则”,可从全国大学生数学建模竞赛网站下载)。 我们完全明白,在竞赛开始后参赛队员不能以任何方式(包括电话、电子邮件、网上咨询等)与队外的任何人(包括指导教师)研究、讨论与赛题有关的问题。 我们知道,抄袭别人的成果是违反竞赛章程和参赛规则的,如果引用别人的成果或资料(包括网上资料),必须按照规定的参考文献的表述方式列出,并在正文引用处予以标注。在网上交流和下载他人的论文是严重违规违纪行为。 我们以中国大学生名誉和诚信郑重承诺,严格遵守竞赛章程和参赛规则,以保证竞赛的公正、公平性。如有违反竞赛章程和参赛规则的行为,我们将受到严肃处理。 我们授权全国大学生数学建模竞赛组委会,可将我们的论文以任何形式进行公开展示(包括进行网上公示,在书籍、期刊和其他媒体进行正式或非正式发表等)。 我们参赛选择的题号(从 A/B/C/D 中选择一项填写): B 我们的报名参赛队号(12 位数字全国统一编号): 201610038044 参赛学校(完整的学校全称,不含院系名): 南京大学 参赛队员 (打印并签名) :1. 聂敏璇 2. 刘敬哲 3. 袁鑫 指导教师或指导教师组负责人 (打印并签名): (指导教师签名意味着对参赛队的行为和论文的真实性负责) 日期: 2016 年 9 月 11 日
赛区评阅编号(由赛区组委会填写): ————————————————————————————————————————————————————————————————————————— 2016年高教社杯全国大学生数学建模竞赛 编 号 专 用 页 赛区评阅记录(可供赛区评阅时使用): 送全国评阅统一编号(赛区组委会填写):
全国评阅随机编号(全国组委会填写):
小区开放对道路通行能力的影响 摘要 本文要解决的问题是针对小区开放的问题,首先建立一套小区开放对周边道路交通影响的评价体系,重点在于建立数学模型来刻画或仿真模拟这一影响,并选取不同类型的小区进行研究分析。 针对问题 1,考虑多种可能的评价体系。由于题目数据难以获得,因此最终采用对数据要求较低的层次分析法建立模型,并将人的感受纳入考虑范围,确定车流质量、道路可达性、行车体验和安全性四大准则。通过两级分层,最终选择 V/C、平均速度、平均等待时间、车流密度、路网密度、速度标准差、排队队长以及急刹车频率作为最终指标,通过 MATLAB 软件得到最终的权向量为: ω=【 0.189,0.098,0.166,0.189,0.169,0.084,0.046,0.056 】 并通过一致性检验。 针对问题 2,建立了基于宏观交通流模型的微分方程模型和基于二维元胞自动机的仿真模型。微分方程模型中,将小区内和小区周边道路看作一个系统,基于机理分析,描述了车流在系统的内外层之间的交互流动传递。发现当且仅当内外系统分别对自身交通流密度增长的制约大于交互过程对交通流密度增长的刺激时,车流系统将达到稳定。对二维元胞自动机仿真模型,除了基本的经典 NaSch 规则、STCA 换道规则外,还加入了小区因素,以对演化规则设置进行精细的考量。尤其针对驾驶者驾驶进入小区这一过程,具体划分基本意愿、实时意愿、前方路况等多重指标做出综合的评判,并结合换道行为的可行性分析,细致地模拟了驾驶者在小区前道路上的心理、行为反应。同时在小区内部,将弯道“以直化曲”,并加入人行阻滞等因子和规则保证模型精确贴合实际。用封闭式小区对模型做了初步验证发现模型具有较为良好的仿真效果。两模型相互支撑,充分证明了模型的相对准确性和优越性。 针对问题 3,我们选取了实际生活中的三种类型的小区,处在道路施工处的网状道路结构小区,人口密度较低的环状道路结构的小区以及人口密度较大(儿童医院附近)的树状道路结构小区。基于问题 2 建立的元胞自动机模型,分别分析了三个小区开放前后周边道路的车流密度、平均等待时间、平均速度、路网密度、速度标准差和排队队长。综合考察发现,开放网状小区能够大大缩短车辆的排队等待时间,同时对缓解高峰期的交通压力有积极影响;开放环状小区能够提高周边道路车辆的平均速度,小区内环岛的设计提高了交通运输效率,对交通车流起到很好的疏导作用;开放树状小区并不能大幅度提高小区周边道路的整体评分,但是由于小区周边人口密度大,因此开放小区对于该地区交通的边际效用非常显著。 针对问题 4,结合真实生活中的交通设施情况,考虑小区门口三种交通设施的建设方案,运用仿真并基于层次分析构建的打分机制,对不同内部结构、车流量情况下的小区门口的道路设施,提出了切实可行的建议。 最后本文给出了模型的优点和改进之处,如无论何种方案,开放小区后外围道路的速度标准差均有一定程度的提高,这会降低驾驶者的行车体验,有待进一步研究。
关键词:小区开放;宏观交通流模型;层次分析法;微分方程;二维元胞自动机
一. 问题重述 2016 年 2 月 21 日,国务院发布《关于进一步加强城市规划建设管理工作的若干意见》,其中第十六条关于推广街区制,原则上不再建设封闭住宅小区,已建成的住宅小区和单位大院要逐步开放等意见,引起了广泛的关注和讨论。 目前我国封闭型小区有如下主要特点:封闭行强、人口集中、功能单一等,使城市路网密度和可达性降低,同时增加了周围路网的交通压力。在关于开放小区的议论中,焦点之一是:开放小区能否达到优化路网结构,提高道路通行能力,改善交通状况的目的,以及改善效果如何。一种观点认为封闭式小区破坏了城市路网结构,堵塞了城市“毛细血管”,容易造成交通阻塞。小区开放后,路网密度提高,道路面积增加,通行能力自然会有提升。也有人认为这与小区面积、位置、外部及内部道路状况等诸多因素有关,不能一概而论。还有人认为小区开放后,虽然可通行道路增多了,相应地,小区周边主路上进出小区的交叉路口的车辆也会增多,也可能会影响主路的通行速度。 现在针对小区开放对周边道路通行的影响进行研究,为科学决策提供定量依据,并建立数学模型解决以下问题: 1. 建立合适的评价指标体系,用以评价小区开放对周边道路通行的影响。 2. 建立关于车辆通行的数学模型,用以研究小区开放对周边道路通行的影响。 3. 小区开放产生的效果,可能会与小区结构及周边道路结构、车流量有关。选取或构建不同类型的小区,应用上述模型,定量比较各类型小区开放前后对道路通行的影响。 4. 根据研究结果,从交通通行的角度,向城市规划和交通管理部门提出关于小区开放的合理化建议。 二.问题分析 问题 1:针对问题 1,首先明确研究对象是小区周边道路的通行情况,而后建立评价指标体系。对于道路通行情况有不同的评价角度,因此考虑采用综合评价方法。先根据评价目标划分不同层级,应用层次分析法、TOPSIS 排序法或模糊综合评价法进行建模。 问题 2:题目要求建立模型用以研究小区开放对周边道路通行的影响。我们需要保证模型具有一定的实用价值,而小区开放现在并没有广泛普及,相关数据难以获得。为了获取对系统的宏观,我们建立了内外系统间的微分方程模型。同时,我们考虑使用在处理道路交通时常用的元胞自动机模型,建立关于车辆通行的仿真模型。 问题 3:题目要求选取或构建不同类型的小区来比较各类型小区开放前后对道路通行的影响。因此需要在问题 2 的仿真模型中将小区结构、周边道路结构以及车流量加以量化并作为模型参数,通过变化这些参数的值或范围得到定量比较的依据。 问题 4:问题 4 是前三个问题的延伸和拓展。根据问题 1 建立的评价体系、问题 2建立的仿真模型和问题 3 得到的定量结果,通过比较得出结构不同以及周边环境不同的小区开放的不同影响。我们希望通过前三个问题的解决,可以向城市规划和交通管理部门提出适合开放哪种结构、周边道路车流量在哪个范围内的小区,以及开放后应该如何进行交叉路口管制等具体建议。 三.基本假设 (1) 不具体讨论小区内车辆乱停乱放造成的占道情况。将占到情况、居民横穿道路等行为皆纳入阻滞系数。 (2) 汽车在小区周边道路正常行驶时只考虑行人影响,不考虑非机动车造成的影响。 (3) 不考虑发生交通事故的情况。 四.符号说明 ______________________________________________________________________________________________________ 符号 含义 单位 ————————————————————————————————————————————————————————————————————————— D 路网密度 km -1 Q(x,t) 交通流量, 单位时间内通过单位路长的车辆数 pcu/h ρ(x,t) 车辆密度,单位路长上车辆数 pcu/km u(x,t) 交通流平均速度 km/h uf 自由畅行速度,即车流密度为零时,车辆的最大速度 km/h ρjam 堵塞密度,即车辆基本无法移动时的速度。 pcu/km P 交通信号灯的密度,单位路程内的信号灯个数 km -1 T 信号灯周期 s L 小区内主要道路宽度 m ρa 小区周边道路的车辆密度 pcu/km ρb 小区内道路的车辆密度 pcu/km vt 车辆(元胞)在 t 时刻的速度 cell xt 车辆(元胞)在 t 时刻的位置 cell dn 此时车辆(元胞)前方的空元胞数 cell Cn 是车辆 n 现在所处的车道 Ln 车辆 n 与现车道的前面车辆之间的距离 cell Lsafe 安全换道距离 cell Ln,before / L n,back 车辆 n 与相邻车道前面/后面一辆车的距离 cell γ 综合进入小区意愿 γ1 基本进入小区意愿 γ2 实时进入小区意愿 λ 单位时间驶入目标道路车流量 veh/s η 阻滞系数 vmax1 外围道路最大行驶限速,设置为 5 cell/2.5s vmax2 小区内道路最大行驶限速,设置为 3 cell/2.5s ———————————————————————————————————————————————————— 五.模型的建立与求解
5.1 问题 1 模型的建立与求解
建立小区开放对周边道路通行情况的评价指标体系,其实质就是要寻找一组具有典型代表意义,同时能全面反映小区周边通行道路综合评价目标的影响因子,并定量描述其影响。即通过分析小区周边和内部通行道路的车流和路网的特征,建立评价目标与系统设计结构及要素间的对应关系,然后研究特征指标与评价准则及评价准则与评价目标的相关程度,从而确定指标的选择与设置 [1] 。同时需要强调的是,城市交通的主体是人,因此对道路情况的评价应该对行车体验这一准则有所考虑。最终我们从车流质量、道路可达性、行车体验和道路安全四个准则建立评价体系,运用层析分析法对小区开放后周边道路情况进行综合评价。
5.1.1 层次分析法建立评价指标
在车流质量、道路可达性、行车体验和道路安全 4 个准则的基础上,将其进行细分,最终细化为 8 个可得的数据指标,各指标选取如图 1 所示。 
根据《道路通行能力手册》 [2] ,相关指标定义如下: V/C:最大交通服务量(车流量)与基本通行能力的比值(本文中用平均车流量来代替这一指标)。 基本通行能力:在理想的道路和交通条件下,单位时间内一个车道或一条道路某一路段通过车辆的最大数。 平均速度:汽车在小区周边道路上行驶的平均速率。 平均等待时间:每次行程中,车辆停止等待(如等待交通信号灯,等待堵塞等)的平均时间。 车流密度:单位距离内的车辆数目。 路网密度:一定区域内所有道路的长度总和与该区域面积的比值。 速度标准差:车辆在小区周边道路上行驶时的标准差。用来衡量速度变化的剧烈程度。 基于上述准则和指标,评价得到目标层对于准则层的成对比较矩阵 A: 通过 MATLAB 软件计算目标层对准则层的权重向量为: ω1 =[0.546,0.084,0.202,0.168] 接着给出准则层到指标层的成对比较矩阵 B:  最终得到八个指标对目标层的权重向量为: 同时算得指标层对目标层的组合一致性比率 因此求得的权向量满足一致性要求。 从最终权向量 ω 可以看出,V/C、平均速度、平均等待时间、车流密度、路网密度、速度标准差所占权重较大,因此有理由在模型建立后着重分析以上几个指标。
5.2 问题 2 模型的建立与求解
对于问题 2,如果将小区周边道路看作一个网络系统的外层,小区内部道路看作网络系统内层,车辆的进出就是整个系统内外层的交换问题。如果将车辆的流动看作流体的流动,交换问题就变成了系统内外层的动态变化。因此我们考虑先使用微分方程建模处理动态变化问题的思想,建立基于宏观交通流模型的微分方程模型以考察整个系统的宏观特征。 其次,由于该系统内的微观行为十分复杂,难以进行数理描述,我们运用元胞自动机进行仿真建模,建立了基于二维元胞自动机的交通流模型,使我们的模型得以相互支撑,更加立体和丰富。需要说明的是,由于小区附近的的区域相对较小、进出驾车者心理、生理行为复杂,因而微观模型更能真实模拟系统状态。我们建模的重心仍然放在仿真模型上。
5.2.1 基于宏观交通流模型的微分方程模型
在传统的道路交通情况研究中,交通流理论是研究交通流随时间和空间变化规律的模型和方法体系.它是交通规划、道路与交通工程设计、交通控制与管理等科学技术工程领域的理论基础。宏观交通流理论采用交通流量 Q(x,t)——单位时间内通过单位路长的车辆数, 交通密度 ρ(x,t)——单位路长上车辆数, 以及交通流平均速度 u(x,t)来刻画车辆的平均合作行为 [3] 。流体力学模型在推动交通流理论的发展过程中,起着非常重要的作用。 根据《道路通行能力手册》 [2] 并根据交通流模型可知,Q、ρ、u 三者之间的关系为
 交通流模型中最简单的的守恒方程: 其中 t 表示时间,x 表示路程。 Greenshields 提出了速度-密度线性模型,把速度和密度的关系表示为: 满足 。式中 u f 为自由畅行速度,即车流密度为零时,车辆的最大速度;ρ jam 为 堵塞密度,即车辆基本无法移动时的密度 [3] 。 Payne 在宏观交通流模型的基础上引入了动量方程,模型的形式变为 (6)式右边第 1 项为期望项,与驾驶员本身对周边交通状况改变的反应过程有关;第 2项是弛豫项,描述车流速度在弛豫时间 τ 内向平衡速度的调整,弛豫时间就是系统交通流从不平衡向平衡过渡所需的时间。 针对小区开放的实际问题,从周边道路状况和小区内部交通状况两个方面考虑,借鉴了 Payne 的动量方程的思想,采用能够反应动态变化的微分方程模型进行建模,试图表述系统交通流在不平衡与平衡状态间的过渡。驾驶员在决定是否借助驶入开放式的小区来抵达目的地时,可能与如下参数有关:对于周边道路而言,交通信号灯的密度 P(即单位路程内的信号灯个数)及信号周期 T,限速 v max ,现在的车流密度 ρ a ;对于开放式小区内部而言,道路宽度 L,路网密度 d。 假设单位时间内系统内车辆密度的增长率(系统外驶入系统内的车辆)恒定为 k 1(k 1 > 0),单位时间内系统内的车辆密度的减少率(系统内驶出系统内的车辆)与小区周边道路的车辆密度成正比,比例系数为 k 2 (k 2 > 0)。以一定时间内小区周边道路车流密度的变化量 Δρ a 为因变量。驾驶员在周边道路行驶时,通常习惯回避交通信号灯特别是周期较长的交通信号灯,因此 P、T 会引起 Δρ a 增大。对于内部而言,道路宽度越大,网络最短时间距离越小,Δρ a 越大。 但是实际情况是,小区周边道路的车辆不可能一直减少,驶入小区内部的车也不可能一直增加,系统是一个内外部不断交换的过程。假设小区内部车流密度 ρ b 对系统交换的影响系数为 β,通过上述考虑和分析,最终建立关于车流密度的动态微分方程为: 其中 α 为比例系数。 是内外系统的交互过程中刺激交通流密度增长的度量; 是内外系统分别对自身交通流密度制约的度量。 下面考虑方程(7)的平衡点的稳定情况。令(7)式子右端等于 0,容易算出平衡点(x 0 ,y 0 )为 方程(7)的系数矩阵为 按照判断平衡点稳定性的方法计算 由稳定性准则,当  时,平衡点(x 0 ,y 0 )是稳定的;反之,是不稳定的。该条件表明,当且仅当内外系统分别对自身交通流密度增长的制约大于交互过程对交通流密度增长的刺激时,车流系统将达到稳定。 在此微分方程模型中,我们只考量了稳态的可能性。至于稳态如何产生如何湮灭,车流具体的稳定度有多高,我们在基于二维元胞自动机的交通流模型给出更为详尽的描述。
5.2.2 基于二维元胞自动机的交通流模型
元胞自动机(Cellular Automaton,简称 CA),或者称为单元自动机、点格自动机、细胞自动机或分子自动机,是一类时间、空间和状态都离散的动力学模型,是非线性科学的一种重要的研究方法,特别适合于对复杂系统的时空演化过程进行动态模拟 [4] 。元胞自动机是以有限状态的元胞(Cell)为基本单位,元胞散布在规则格网(Lattice Grid)中,遵循一定的局部规则作同步更新,大量的元胞通过简单的规则相互作用构成了在离散时间空间上演化的动力系统。元胞自动机不是由严格定义的物理方程或函数来确定,而是由一系列简单的规则构成,因此,非常适合于模拟复杂动力系统 [5] 。 元胞分布的空间集合叫做元胞空间,元胞的形状与格网形状一致。一维元胞空间就是将一矩形划分为若干等距的小矩形,二维元胞空间可以分为正三角形空间、正方形空间或正六边形空间,如图 2 所示。在用计算机实现的过程中,正方形二维空间建立元胞自动机模型更为方便。 元胞空间中的每一个元胞都可以记录其当前时刻的状态(如经典的“生命游戏”中,元胞状态可分为“生存”或“死亡”),随着时间 t 的推移,任一元胞 C i 的状态在不断发生变化,这种变化只与和 C i 相邻的八个元胞的状态相关,他们之间构成的这种动力学函数关系称为元胞状态的演化规则。用数学公式表示为 其中 f 表示演化规则, 和 分别表示 t+1 时刻和 t 时刻元胞 C i 的状态, 表示与 C i 相邻的 N 个元胞在 t 时刻的状态。 由于元胞自动机具有良好的动力学特性,常常被用于交通运输或车辆流动的仿真模型当中。 
我们通过元胞自动机来模拟小区周边和内部道路的车辆运行情况,并根据不同的道路设置不同的参数来进行仿真,以得到接近真实情况的仿真数据。
1 .模型假设 (1)居民区周边道路为双向六车道或双向八车道,只有最外侧车道的车辆才可以进入小区(内侧车道的车要先变道)。 (2)假设小区内部的道路只有双车道和单车道两种。单车道能够允许两辆车缓慢并排通过。小区内部由于一般无交通标识,除特殊情况外,基本不考虑单行限制。 (3)没有车辆在小区内部湮灭。大部分车只是途径路过,只有少量车会在系统中停下且对系统影响可以忽略,因而我们假定只有试图穿过街区的车辆会试图进入小区。 (4)驾驶员对开放小区内部道路的了解情况程度不一。 (5)不考虑大型车的驶入。通常居民区附近会对卡车、拖车等大型车辆进行限时同行。因而我们忽略这一可能。 2. 元胞信息 模型规定元胞空间中的一个标准元胞所代表的实际长度为 7.5 米,宽度为 3.5 米。 (考虑最大 50km/h 的速度限制,相应的,我们设定 2.5s 为演化周期。)每个元胞空间中都储存一定的信息,包括:该元胞的属性(如是否是交叉路口,有无交通信号灯,对交通流的阻滞系数等)、此刻在该元胞上的车辆的信息。车辆信息又包括:行车方向,目的地,速度,驾驶者进入小区的意愿等。
3. 车 流基本 演化规则 经典 NaSch 交通流规则,对元胞车辆车辆位置和速度的演化规则有如下定义: (1) 位置更新规则:x t+1 = x t +v t ; (2) 加速规则:驾驶员在行驶时都希望以尽可能大的速度驾驶,因此如果前方空元胞数大于此刻的速度,车辆会选择加速,v t+1 = min{v t +1, v max },车辆在外部道路行驶时v max = 5,内部行驶时 v max = 3; (3) 减速规则:如果前方空元胞数小于此刻的速度,车辆会相应选择减速以防碰撞,用 d n 表示此时车辆前方的空元胞数,v t+1 = min{v t , d n }; (4) 随机减速:考虑驾驶者的心理行为,我们还设置了随机减速函数。根据此时的道路状况(如车辆密度等指标),车辆会以概率 P 选择减速,v t+1 = max{v t -2, 0}。考虑不同居民区的人流密度,随机减速概率会有显著差异。另外,在小区入口的地带,由于居民的通行状况难以预测,我们相应设置了行人阻滞系数,以提高随机减速概率。 演化过程如下图所示:
(5) 换道规则 除了采用以上 NS 规则,我们还考虑在三车道或四车道上行驶时,驾驶员往往希望通过换道来达到尽可能大的速度,因此采用经典的 STCA 双车道换道规则 [5] ,将其应用于我们的多车道模型。该换道规则定义的换道基本条件如下: Cn 是车辆 n 现在所处的车道,标记为 0 或 1;Ln 为车辆 n 与现车道的前面车辆之间的距离,L safe 是模型规定的安全换道距离,L safe = v max 。L n < min{v n +1,v max }表示车辆 n 在原车道受阻,L n,before > L n 表示车辆 n 在相邻车道可以获得更高的速度,L n,back > L safe 表示车辆n 和相邻车道的后面一辆车的间距满足安全换道间距。
4. 外围道路车流的发生和湮灭 在四条外围道路的首端和尾端上,各设置一个元胞空间作为车辆的发生器、湮灭器。发生器的作用有:生成进入该道的车流数量,对每一进入改道的车辆分配车道、目标方向以及进入小区意愿。如图 4 所示:  (1) 车流数量生成 泊松分布常用来描述单位时间内随机事件发生的次数,如电话交换机自一定时间内的接到的呼叫次数。经统计分析 [5] ,进入既定车道的车流数量也服从泊松分布。因而我们设置的车辆发生器以泊松分布的概率产生车流,每次生成车数为 0 到 3 之间的整数。 其中 λ 为单位时间内进入区域的车辆数量,该数值应依据不同道路的车流量的统计结果来选择。下图为车流量 0.5veh/2.5s(λ=0.5),1veh/2.5s(λ=1.5),1.5veh/2.5s(λ=1.5)的不同生成数的概率密度图。 (2) 分配车道 发生器生成进入道路的车流数后,将对每辆车设置初始的行驶车道。考虑到同向的三车道的车流密度不完全相同,基于有学者对多车道车流的统计数据,我们发现通常驾驶者在最外侧行驶的概率比在内部要低一些。 我们在发生器仅生成 1 辆车的情况下,定义该车不会进入 I 车道,只会出现在 II、III 车道(车道标号由内侧向外侧依次定义,详见图 6)。其余情况,车辆的初始车道均匀随机设定。 (3) 分配目的地 在任一车辆生成时,生成器将同时随机赋予车辆在下一个路口的转向的情况。车辆的转向情况,同时决定了车辆是否会穿过小区的基本可能性。这是因为在该道路末端即将左转或直走的车辆,无法利用穿过小区来提升行驶效率。如图 6 所示,在车辆 1、2、 3 生成时,车辆 1 在下一个路口希望左转,车辆 2 希望右转,而车辆 3 希望直行。  因此只有车辆 2 的驾驶员会考虑是否通过开放式小区来穿过街区,车辆 1 和 3 则根本不会有驶入小区的可能。 (4) 基本进入小区意愿 在试图右转的车辆(如车辆 2)中,考虑驾驶员自身的行驶偏好,称为基本进入小区意愿,记为 γ 1 。γ 1 的含义为,尽管小区开放,但是并不是所有人都愿意通过小区来穿过街道,用 γ 1 来衡量这一偏好比例。参考权威网络媒体的调查结果 1 ,我们发现有大约30%的人支持开放式小区的建立,因此我们认为大部分驾驶者对在小区内部通行的接受程度较低。我们随机生成 γ 1 并将其定义在(0.3, 0.5)之间。 5. 进入小区过程 进入小区过程的模型,分为驾驶者的心理层面、行为层面以及道路设施情况。心理层面考虑驾驶者进入小区的意愿,该意愿综合了车辆产生时发生器分配的基本意愿、车辆行驶时的实时前方路况、车辆所在车道是内侧还是外侧;行为层面考虑当驾驶者希望进入小区时,其换道行为实现的可能性;道路设施情况考虑了小区门口三种不同道路设施结构(人行道、周期性红绿灯、按钮式红绿灯)对车流的影响。 (1) 驾驶者心理层面 a. 前方路况评分 驾驶员是否会选择进入小区与周边的道路状况相关。综合考虑两个因素进行评分比较。 其一,前方车辆数。考虑车辆 n 所在道路前方 3×5 的元胞内(如图 8 所示)的车辆数 w n,before ,基于对不同车流密度下驾驶员心理的分析,我们选择采用变形后的 Sigmoid 函数进行评分: 其中 λ 表示平均水平下的前方车辆数量, ,模型中取 λ = 6。 —————————————————————————————— 1 数据来自 http://xmtzs.baijia.baidu.com/article/330031。
其二,前方车辆的速度,记为 v n,before 。考虑前方车速与驾驶者心理的对应关系,采用负指数函数对车辆 n 前方的车辆速度进行评分 其中 μ 为模型允许的最大速度 v max 的评估系数,v max 越大,μ 越小,模型中取μ = 0.25。当上述两者评分的加和 S 大于某一阈值时,认为驾驶员希望拐入小区来绕过拥挤路段,反之则不希望拐入小区。当产生拐入小区的意愿时,驾驶员会按照基本变道规则进行变道尝试。 b. 实时进入小区意愿 进入车道时,发生器已经指定驾驶者的基本进入小区意愿 γ 1 。随着车辆行进,在到达小区前一定区域时,若其在最内侧车道 I,驾驶者将有很大概率为 避免换道的不确定性和复杂程度而放弃进入小区,选择继续直行。而在最外侧车道 III 则对其没有影响。定义该所在车道产生的影响因素为 实时进入小区意 愿 愿 γ 2 。 程序设定的行为函数的决定过程见算法框图 9。 (2) 驾驶者行为层面 当驾驶者具有进入小区意愿时,驾驶员会按照以下特别变道规则进行变道尝试。该变道规则区分于基本的 STCA 双车道换道规则,只考虑目标车道后方车辆的影响:  C n 是车辆 n 现在所处的车道,标记为 0 或 1;L n 为车辆 n 与现车道的前面车辆之间的距离,L safe是模型规定的安全换道距离,L safe = v max 。L n < min{v n +1,v max }表示车辆 n 在原车道受阻, L n,back > L safe 表示车辆 n 和相邻车道的后面一辆车的间距满足安全换道间距。 当驾驶者驶出小区时同样遵守此规则。 (3) 小区入口的交通设施影响 在小区与周边主路的交叉路口处,模型考虑了三种不同的交通设施情况。如表1 所示。 6. 小区内部道路 小区内部的道路结构由二维元胞自动机构成。对于内部而言,由于小区内部人口密度较大,道路宽度明显小于周边主要道路宽度,因此车辆进入小区后不能继续按照原有的限速规则行驶。因此,我们参考校园内的限速规约,减小了允许行驶的最大速度 v max 。 基于居民区内部人流量密集且难以约束其流动范围的特点,我们增大人口阻滞系数,并将该系数应用于“随机减速”这一规则上,以体现在小区内部和外部行驶时道路状况的不同。 考虑小区内部道路交汇处的情况,由于小区内部的道路状况较为复杂,人口密度较大使得交汇处发生意外的可能性大大增加,因此理性的驾驶员在道路交汇处一定会尤为谨慎。制定 小区内交 叉口的规则如下: 1.车辆必须在道路交汇处的前一个元胞处将强制停止(模拟弯道减速的情况),随后以速度 2 经过路口; 2.当发生辆车相遇时,一次仅允许通过一辆车。 3.多车在同一路口相遇时,考虑车辆间的协商行为难以描述,采取 4 次演化(10s)内各车跳转至目标车道,持速为 1 的规则加以简化。 我们实现了周边道路与小区内部元胞自动机的耦合交互。以车辆驶入小区内部为例,当周边道路的车辆进入小区后,将该车辆从道路对应的元胞自动机上湮灭,保留其速度、目的地等信息,同时在小区内部对应的元胞自动机的生成器处生成该车辆。  
建立元胞自动机模型后,我们用封闭式小区的情况对模型做了初步验证。模型验证时交通信号灯的周期为绿灯放行 10s,红灯 4s,运行次数为 500 次。在封闭式小区的情况下,周边道路的车辆无法进入小区,因此车流量大致等于车辆发生器的平均产生量(即λ 的值)。 当 λ = 1.5veh/2.5s 时得到单一车道的时空图如图 10 所示。密集处表示车辆发生了排队堵塞现象(交通信号灯位置处),从图中可以看出从堵塞处开始,排队波面逐渐向上游传播,然后开始逐渐向下游消散。同时密集排队现象呈现出明显的周期性特征,与模型设置的信号灯周期密切相关。这一定程度上证实了我们通过微分方程建模得出的结论。
为了充分说明模型的合理性和可利用性,分别取 λ = 0.5 veh/2.5s、1 veh/2.5s、1.5veh/2.5s 进行对比验证。 从图 11 可以看出,随着元胞自动机的不断演化,车流密度在不断发生波动,但是各个峰值之间的时间间隔基本一致,同样与模型设置的交通灯的信号周期密切相关。同时由表 2 可知,车流量 λ 越大,道路的平均车流密度车流密度在不断增加,这一点是符合常识的。  
图 12 和图 13 分别给出了不同 λ 情况下车辆平均速度和正在等待的车辆数目随时间 的变化曲线和散点图。在这里我们用正在等待的车辆数目来近似代替车辆的平均等待时间,由图 12 可以清晰地看出曲线图成周期性变化,并且平均车流量增大,车辆的平均速度在明显减小,同时散点数量变多,密集程度增加,意味着平均等待时间也在增大。 值得注意的是,在图 12 中,随着 λ 的增加,曲线的波动性在明显减弱。这说明在车流量小的情况下车辆的平均速度变化越剧烈。分析原因可能是模型在设置时没有考虑驾驶员对交通信号灯的提前判断,因此在车流量小的情况下,车辆的平均速度普遍较大,一旦交通信号灯红灯亮起,车辆会有剧烈的减速甚至急刹车的过程。反之当车流量较大时,车辆之间的相互影响增大,车辆加速的难度会相对增大,因此变化的剧烈程度会变小。表 3 更加清楚看到不同车流量下不同指标的对比。 通过验证发现,我们建立的元胞自动机模型能够较好的模拟出实际道路上的车流变化,模型结果符合实际情况,能够得到较好的解释。
5.3 问题 3 模型的建立与求解
5.3.1 小区内部结构的分类
开放式小区就是在保证小区内部居住、办公、教育、休息等活动正常运行的情况下,把小区内部的一条或者多条主要道路与周边主要道路相连,供来往车辆穿行。其主要功能就是为小区提供生活服务,并且为城市主要道路分流及连通城市主要道路。问题 3 要求选择或构建不同类型的小区来研究小区开放前后对周边道路交通情况的影响。通过对比研究,我们选择了三种主要的也是最为常见的小区结构,网状结构、环状结构和树状结构(图 14)。根据不同的结构和周边道路情况确定不同的参数,运行元胞自动机模型进行比较分析。 三种结构的小区的特点说明如下: (a) 网状结构。小区内部开放后成分片式网状布局,道路没有主干道与次要道路之分,所有与周边道路相连的交叉口之间相互平等,网络内部交叉口均为十字路口。 (b) 环状结构。小区内部有圆状或方形环岛,环岛道路一般为单行道。 (c) 树状结构。小区内部道路有一条主路和多条支路组成,交叉口为丁字路口或十字路口。通常情况下主路与周边道路的交叉口车流量较大。 
5.3.2 针对不同类型小区的仿真分析 为了体现模型的实用价值,我们选取了某市三个真实的小区地图,将真实地图抽象化、数据化后输入模型当中,以网状结构的小区为重点,对现实问题进行深入分析。
 图 15 为某居民小区 A 的周边道路结构图。该小区位于某大型城市的发达区域,周围均为居民区。四周道路均为双向四车道,不同时段的车流分布稳定。然而受建设地铁工程带来的长期影响,居民区四周道路均已实施单行限制。该规定造成多数车辆必须绕行,出租车等公共交通工具皆试图避免驶入该区域,严重降低了居民的出行效率。将实际地图抽象成网格,并输入元胞自动机模型。模型初始参数同样为交通信号灯的周期为绿灯放行 10s,红灯 4s,运行次数为 500 次。根据问题 1 模型建立的层次分析评价体系,选取其中车流密度、平均等待时间、平均速度、路网密度、速度标准差进行重点分析。 根据题目要求,分析开放前和开放后对小区周边道路通行情况的影响,这里考虑在小区开放后,小区与周边主要道路的交叉口处既有交通灯作用也有行人的阻滞。首先从宏观上对比网状结构小区开放前与开放后周边主要道路的时空图,如图 16 所示。 从图中可以明显看出,小区开放前排队拥堵情况较为严重,持续时间长且呈现出周期性变化。而小区开放后车流密度虽没有明显减少,但是排队拥堵情况大为改观,因此可以初步判定该小区开放后能对周边道路的交通起到非常重要的疏导作用。 继续考察两种情况下车流密度、平均等待时间与平均速度的对比情况,如图 17。 
可以看出,对于车流密度而言,在程序运行的初始阶段,开放后的车流密度的增长速度明显高于开放前的车流密度。原因可能是小区开放后有部分车辆会试图通过小区来穿过街区,因此会在小区门口前一段距离减速,这就对后方车辆的行驶造成了阻碍,此车流密度增长很快。同时观察(a)(b)两图可以看出,开放后车流密度相对而言波动比较平稳,而开放前起伏较为明显,这可能类似于实际中道路出现高峰期,使得在小区开放前的情况下,当 t = 100 左右时道路出现了堵塞情况。这从另一个侧面说明开放网状结构小区可能会有利于缓解高峰期的交通压力。 在平均等待时间方面,开放小区后的等待车辆数目明显少于开放前的数目,分布也更为分散,同时对比两图在 t = 50~100 区间的散点也可以发现,小区开放后对于高峰期的车辆起到了良好的疏散作用,使得停车等待的车辆大为减少。在平均速度上,开放后的车辆的平均速度较开放前整体变化较为平缓,同时没有出现高峰期速度明显降低的情况。 从表 4 的具体数据中也可以看出,小区开放后与开放前相比,车流密度、平均速度都有小幅度改善,但是并不是非常明显。然而,开放后的车辆在平均等待时间上却远小于开放前的车辆,这说明开放网状小区最大的优势在于其能够节约驾驶员的时间。值得注意的是,小区开放后较开放前的车辆平均速度标准差却有升高,分析原因可能是由于模型在设置时要求进入小区的车辆在小区门口前一定区域内必须换道、减速,这可能会 对周边车辆的行驶造成影响。 在外部道路结构方面,主要考察了三种交通管制方式对于几大指标的影响情况,如表 5。考虑只有行人的阻滞系数、只有交通信号灯管制以及两者同时存在的情况(由于上文提到的按钮交通灯既有行人因素也有交通灯因素,我们认为他与两者同时存在的情况相近,因此不再予以讨论)。通过数据比较发现只有行人和只有交通灯的情况下对车流密度影响相同(我们认为这是巧合),两者同时存在时车流密度会增大。在平均等待时间方面,只有行人存在时的平均等待时间远远小于另外两者,这是由于只有行人存在时只对车辆形成阻滞,但并不会使车辆停止,因而等待时间大大缩小。从数据中还可以看出,使用交通灯能大大提高车辆的平均速度,但同时会增加排队队长。 除此之外我们还考察了开放内部的车辆运行情况。如图 18 所示是程序运行过程中某两个时间点的车辆分布情况,可以看出车辆在进入小区后主要会在弯道和交叉路口处产生堆积和减速,但还没有形成大规模的排队堵塞现象。因此开放此网状结构小区是较为合适的。
图 19 为某居民小区 B 的周边道路结构图。该小区位于某二线城市的新开发城区,人口密度较低,交通压力较小。小区内部道路纵横交错,新修道路宽敞,由于人口密度低,平均道路的行人阻滞小,因而十分适宜对外开放。考虑其内部道路的环状特点,理应将该道路设置为单向环岛,以减少事故发生概率。 首先仍从宏观上对比环状结构小区开放前与开放后周边主要道路的时空图,如图 20 所示。 直观上发现,由于小区周边道路本身车流量不大,因此开放前开放后的整体差别并不明显。车流密度没有明显的减少,但是排队现象可能会得到一定程度的缓解。可以看出的是,在开放前,大约在 t = 120 左右出现了一定程度的拥堵,可能是由于一段时间内车流量突然增加,但是在小区开放后,这种拥堵现象几乎没有产生。但是同时,在开放前没有出现密集的时间区间里,开放后的时空图却出现了一定程度的密集,不过很快就消散开来。 从表 6 中可以看出,由于该地区的人口密度低,车流量本身并不大,因此开放小区并没有产生非常明显的影响。车流密度、平均等待时间都有小幅度降低,速度标准差有小幅度提高,这也与时空图中所表现出来的信息相吻合。同时可以发现,该地区的路网密度并不大,但是车流质量非常良好,是由于该地区本来地处偏僻,人口稀少,因而道路密度较低,但也带来了车辆平均速度的提高。 但是,环状小区开放后带来了周边道路车辆平均速度的明显提高,以及排队队长的明显降低。原因可能是环形小区内的交通环岛起到了非常显著的疏散效果。由于考虑安全原因程序设置环岛内只许单向行驶,使得交通车辆流动的速率大大提高,一方面能够起到在周边道路车辆拥堵时疏散交通的作用,另一方面也能使得驾驶员排队等待的时间大为降低。 由表 7 可以看出,人口密度较低的环状小区对于开放后的三种管制方式的敏感程度与网状没有很大差异,但是从速度标准差来看,人口密度小的道路上车辆的速度标准差要大于较为拥挤的道路,可能是由于模型没有考虑到人口密度较少的地区行人的阻滞系数较小。 图 21 为某居民小区 C 的周边道路结构图。该小区位于某大型城市的核心商业区,沿街的两侧南北向道路均为双向六车道,路网密集。然而该区域的车流堵塞情况显著,其原因在于儿童医院的人流量极大,而儿童医院门口的东西向道路仅为双向四车道,并时常有公交车经过,难以适应过高的交通需求。我们认为若将小区内部道路开放,用以疏散儿童医院的人流量,可能在一定程度上缓解堵塞情况。 由于该路段周边的车流量极大,因此反应在时空图上时拥堵现象十分严重,图像极为混乱不清。
我们对树状结构小区周边道路的具体数据做了分析,如图 22 所示。由于儿童医院位于该地区,因此人流量极大,在小区开放前,随着时间的增加,车流密度呈上升趋势,并伴随着剧烈的波动。但小区开放后,车流密度的起伏频率大大降低,但是浮动幅度却大大增加。比较两者的均值可以初步判断开放小区的确有利于降低道路的车流密度。同   时在开放前交通较为密集的时间段内,在开放后均有不同程度的改善。从等待时间看,开放前和开放后的小区均有较多较密集的等待车辆,而且开放后更为密集。但是开放后的等待车辆的峰值数明显低于开放前的数目,说明排队队长会有所减小,但是参与排队的车辆可能会增多。最后比较开放前后的平均速度发现,较为拥挤的区域开放小区后该地区车辆的平均速度应该会有较大幅度的提高,但是速度的波动性明显增强。 通过对比表 8 中的实际数据,与观察曲线图和散点图得到的结论大致相同。由于儿童医院附近的交通设施已经非常完善,因此我们不再对交通设施进行讨论。
5.3.3 结论
综合三种情况来看开放第一类网状小区最大的优势在于其能够节约驾驶员的时间,特别能够缓解交通高峰期的交通压力。第二类环状小区,由于我们选择的实际地点位于人口密度较低的地区,因此我们发现对于有这种特点的地区开放小区会对周边道路车辆的平均速度有较大影响,同时环岛的设计有利用提高交通运输的效率,降低交通事故发生的频率。第三类树状小区没有明显的特点,但是由于位于市中心区,因此开放小区会减小城市交通排队的队长,提高车辆运行的平均速度。
5.4 问题 4 的建议
我们根据问题 1 建立的层次分析法评价体系,对仿真模型的结果进行了评价,我们先用最大-最小准则对数据结果进行了规约。评价结果如表 9 所示。 从表中可以看出,综合所有方案来看,评价最高的是开放环状结构小区并在开放后采取综合管制的措施,但是由于小区本身处于偏僻地区,所以综合评比没有太大的现实意义。基于这种考虑我们采取横向比较的方式,提出以下三点结论和建议: 1. 对于网状小区和其所处的地区环境而言,开放后不管哪种管制方式都可以提高该小区周边道路通行状况的整体评分,但是不采用交通灯等设施的评分最 高。但是经过 研究发现开放此类小区可以很大程度上缩短驾驶员的等待时间,从人文角度讲具有 开放意义。 2. 对于环状结构小区而言,开放前的整体评分已经非常可观,但是值得注意的是,由于该小区处于人口密度相对较低的地区,因此如果开通小区后采用交通 信号灯的方式管制路口,往往会适得其反。这也从一个侧面说明了:(1)人口密度较低的地区没有必要开放小区;(2)这类地区的交通灯起不到调节交 通流的作用。 3. 对于第三类树状小区,尽管两种情况下的综合得分都不是很高,但是从提高率来看,开放人口密度较大的树状小区能够很大程度上缓解该地区周边道路的 交通压力。
六. 模型的改进与评价 6.1 模型的优点 1. 综合考虑了车流的微观和宏观特征,并分别建立具体模型加以描述并仿真验证。两模型分别从理论上和实证上相互支撑,充分证明了模型的相对准确性和优越性。在不同人口密度的区域内,选取三种结构不同的小区作为仿真对象;针对其仿真结果,我们均给予了合理解释,与实际情况紧密贴合,体现了其突出的现实意义。 2. 对二维元胞自动机的演化规则设置进行了精细的考量,尤其针对驾驶者驾驶进入小区这一过程,具体划分基本意愿、实时意愿、前方路况等多重指标做出综合的评判,并结合换道行为的可行性分析,细致地模拟了驾驶者在小区前道路上的心理、行为反映。 3. 结合真实生活中的交通设施情况,考虑小区门口三种交通设施的建设方案,运用仿真并基于层次分析构建的打分机制,对不同内部结构、车流量情况下的小区门口的道路设施,提出了切实可行的建议。
6.2 模型的改进 1. 元胞自动机只能将道路做网格状处理,不能很好的模拟弯道和环状道路。考虑到这 一点我们在将弯道以直化曲的基础上,对改道设置更大的随机减速概率,但仍无法大幅度提高仿真精度。 2. 通过仿真我们发现,无论何种方案,开放小区后外围道路的速度标准差均有一定程度的提高,这会降低驾驶者的行车体验。其原因主要在于小区门口行人、车流的阻滞效应。针对这一现象,我们目前的三种交通设施方案均无法有效解决,有待进一步研究。
七.参考文献 [1] 韩云霞. 基于 Fuzzy-AHP 方法的配送车辆新型通行道路综合性能评价研究—以移动路障为例[J].物流技术,2014,33(11):351-355. [2] 交通部公路科学研究院. 道路通行能力手册. 北京:人民交通出版社,2002. [3] 李莉,等. Payne-Whitham 型宏观交通流模型波动特性. 系统科学与数学,2007,12:915-921. [4] 祝玉学,赵学龙. 物理系统的元胞自动机模拟[M]. 北京: 清华大学出版社, 2003. [5] 芮青华,基于元胞自动机的城市路网微观交通系统仿真软件[D]. 西安:长安大学,2012. [6] 姜启源,谢金星,叶俊. 数学模型[M].第四版.北京:高等教育出版社,2011.
附录 A 层次分析法 clc clear a=[1 5 4 3 ; 1/5 1 1/2 1/3 ; 1/4 2 1 2 ;1/3 3 1/2 1 ]; [x,y]=eig(a);eigenvalue=diag(y);lamda=eigenvalue(1); ci1=(lamda-4)/3;cr1=ci1/0.9 w1=x(:,1)/sum(x(:,1)) b1=[1,2,5,1,6;1/2,1,3,1/2,3;1/5,1/3,1,1/5,1;1,2,5,1,6;1/6,1/3,1,1/6,1]; [x,y]=eig(b1);eigenvalue=diag(y);lamda=eigenvalue(1); ci21=(lamda-5)/4;cr21=ci21/1.12 w21=x(:,1)/sum(x(:,1)) b2=[1]; [x,y]=eig(b2);eigenvalue=diag(y);lamda=eigenvalue(1); ci22=0;cr22=ci22 w22=x(:,1)/sum(x(:,1)) b3=[1 ,5,3;1/5,1,1/2;1/3,2,1]; [x,y]=eig(b3);eigenvalue=diag(y);lamda=eigenvalue(1); ci23=(lamda-3)/2;cr23=ci23/0.58 w23=x(:,1)/sum(x(:,1)) b4=[1,2;1/2,1 ]; [x,y]=eig(b4);eigenvalue=diag(y);lamda=eigenvalue(1); ci24=(lamda-2)/1;cr24=ci24 w24=x(:,1)/sum(x(:,1)) w_sum=[w1(1)*w21(1),w1(1)*w21(2),w1(1)*w21(3)+w1(3)*w23(1),w1(1)*w21(4),w1(1)* w21(5)+w1(4)*w24(1)+w1(3)*w23(2),w1(2)*w22,w1(3)*w23(3),w1(4)*w24(2)] ci=[ci21,ci22,ci23,ci24]; cr=ci*w1/sum(0.58*w1) B.元胞自动机 map1 = {{1, 12}, {2, 12}, {3, 12}, {4, 12}, {5, 12}, {6, 12}, {7, 12}, {8, 12}, {9, 12}, {10, 12}, {11, 12}, {12, 12}, {13, 12}, {14, 12}, {15, 12}, {15, 11}, {15, 10}, {15, 9}, {15, 8}, {15, 7}, {15, 6}, {15, 5}, {16, 5}, {17, 5}, {18, 5}, {19, 5}, {20, 5}, {21, 5}, {22, 5}, {23, 5}, {24, 5}, {25, 5}, {26, 5}, {26, 6}, {26, 7}, {26, 8}, {26, 9}, {26, 10}, {26, 11}, {26, 12}, {27, 12}, {28, 12}, {29, 12}, {30, 12}, {31, 12}, {32, 12}, {33, 12}, {34, 12}, {35, 12}, {36, 12}, {37, 12}, {38, 12}, {39, 12}, {40, 12}, {41, 12}, {42, 12}, {43, 12}, {44, 12}, {45, 12}, {11, 1}, {11, 2}, {11, 3}, {11, 4}, {11, 5}, {11, 6}, {11, 7}, {11, 8}, {11, 9}, {11, 10}, {11, 11}, {11, 12}, {11, 13}, {11, 14}, {11, 15}, {11, 16}, {11, 17}, {11, 18}, {11, 19}, {11, 20}, {12, 20}, {13, 20}, {14, 20}, {15, 20}, {16, 20}, {17, 20}, {18, 20}, {19, 20}, {20, 20}, {21, 20}, {22, 20}, {23, 20}, {24, 20}, {25, 20}, {26, 20}, {27, 20}, {28, 20}, {29, 20}, {30, 20}, {31, 20}, {31, 21}, {31, 22}, {31, 23}, {31, 24}, {31, 25}, {31, 26}, {31, 27}, {31, 28}}; neibu[daoru_, t_, bool_] := (hang = 45; chu = {}; lie = 28; fangxiang1[x_, m_, n_, k_] := (If[x[[m]][[n]][[2 + k]] == 1, Module[{temp14 = {}}, Do[If[ 25 x[[#[[1]]]][[#[[2]]]][[1]] &[({RotationTransform[Pi/2][ x[[m, n, 3 + k]]], x[[m, n, 3 + k]], RotationTransform[-Pi/2][x[[m, n, 3 + k]]]}[[i]] + {m, n})] == 1, temp14 = Insert[temp14, {RotationTransform[Pi/2][x[[m, n, 3 + k]]], x[[m, n, 3 + k]], RotationTransform[-Pi/2][x[[m, n, 3 + k]]]}[[i]], 1];], {i, 1, 3}]; temp[[m]][[n]][[3 + k]] = temp14[[Position[#[[1]], #[[2]]] &[ NestList[ Max, ((x[[m]][[n]][[4 + k]] - {m, n}).# &) /@ temp14, 1]][[1]][[1]]]] ]]); fangxiang2[x_, m_, n_, k_] := (If[x[[m]][[n]][[2 + k]] == 1, Module[{temp14 = {}, temp15 = {}}, If[x[[m, n, 5 + k]] == Sqrt[2], temp15 = {RotationTransform[Pi/4][x[[m, n, 3 + k]]], x[[m, n, 3 + k]]*Sqrt[2], RotationTransform[-Pi/4][x[[m, n, 3 + k]]]}, temp15 = {RotationTransform[Pi/4][x[[m, n, 3 + k]]*Sqrt[2]], x[[m, n, 3 + k]], RotationTransform[-Pi/4][x[[m, n, 3 + k]]*Sqrt[2]]}] Do[If[ x[[#[[1]]]][[#[[2]]]][[1]] &[(temp15[[i]] + {m, n})] == 1, temp14 = Insert[temp14, {RotationTransform[Pi/4][x[[m, n, 3 + k]]], x[[m, n, 3 + k]], RotationTransform[-Pi/4][x[[m, n, 3 + k]]]}[[i]], 1];], {i, 1, 3}]; temp[[m]][[n]][[3 + k]] = temp14[[Position[IntegerPart /@ #[[1]], IntegerPart[#[[2]]]] &[ NestList[ Max, ((x[[m]][[n]][[4 + k]] - {m, n}).# &) /@ temp14, 1]][[1]][[1]]]]] ]); fangxiang[] := (temp = data; an = 0; Do[Do[ If[data[[m, n, 6]] == 1, fangxiang2[data, m, n, an], fangxiang1[data, m, n, an]] , {n, 1, lie}], {m, 1, hang}]; an = 5; Do[Do[ If[data[[m, n, 6]] == 1, fangxiang2[data, m, n, an], fangxiang1[data, m, n, an]] , {n, 1, lie}], {m, 1, hang}]; data = temp); vmax = 3; 26 temp = data; jiasu1[x_, m_, n_, k_] := If[x[[m]][[n]][[2 + k]] == 1, temp[[m]][[n]][[5 + k]] = Min[x[[m, n, 5 + k]] + 1, vmax];]; jiasu2[x_, m_, n_, k_] := If[x[[m]][[n]][[2 + k]] == 1, If[Abs[x[[m, n, 3 + k, 1]]] == Sqrt[1/2], temp[[m, n, 5 + k]] = Sqrt[2], temp[[m, n, 5 + k]] = 2 ]]; jiasu[] := (temp = data; an = 0; Do[Do[If[data[[m, n, 6]] == 1, jiasu2[data, m, n, an], jiasu1[data, m, n, an]], {n, 1, lie}], {m, 1, hang}]; an = 5; Do[Do[If[data[[m, n, 6]] == 1, jiasu2[data, m, n, an], jiasu1[data, m, n, an]], {n, 1, lie}], {m, 1, hang}]; data = temp); fangzhi1[x_, m_, n_, k_] := If[x[[m, n, 2 + k]] == 1, d = 0; For[d = 0, x[[m + ((d + 1)*x[[m, n, 3 + k]])[[1]], n + ((1 + d)*x[[m, n, 3 + k]])[[2]]]][[{2 + k, 1}]] == {0, 1} && x[[m, n, 6]] != 1 && x[[m + ((d + 1)*x[[m, n, 3 + k]])[[1]], n + ((d + 1)*x[[m, n, 3 + k]])[[2]]]][[6]] != 2, d++;]; d1 = 0; For[d1 = 0, x[[m + ((d1 + 1)*x[[m, n, 3 + k]])[[1]], n + ((1 + d1)*x[[m, n, 3 + k]])[[2]]]][[{Cases[{2, 2 + 5}, Except[2 + k]][[1]], 1}]] == {0, 1}, d1++;]; temp[[m, n]][[5 + k]] = Min[x[[m, n, 5 + k]], d, Max[IntegerPart[d1/2], 1]];]; fangzhi2[x_, m_, n_, k_] := If[x[[m, n, 2 + k]] == 1, If[Abs[x[[m, n, 3 + k, 1]]] == Sqrt[1/2], If[x[[m + x[[m, n, 3 + k, 1]]*Sqrt[2], n + x[[m, n, 3 + k, 2]]*Sqrt[2], 2 + k]] == 1, 2 + 1(*, temp[[m,n,5+k]]=0*)], fangzhi3[x, m, n, an] ]]; fangzhi3[x_, m_, n_, k_] := If[x[[m, n, 2 + k]] == 1, For[d = 0, x[[m + ((d + 1)*x[[m, n, 3 + k]])[[1]], n + ((1 + d)*x[[m, n, 3 + k]])[[2]]]][[{2 + k, 1}]] == {0, 1} , d++;]; temp[[m, n]][[5 + k]] = Min[x[[m, n, 5 + k]], d];]; fangzhi[] := Quiet[(temp = data; an = 0; Do[Do[ If[data[[m, n, 6]] == 1, fangzhi2[data, m, n, an], 27 fangzhi1[data, m, n, an]], {n, 1, lie}], {m, 1, hang}]; an = 5; Do[ Do[If[data[[m, n, 6]] == 1, fangzhi2[data, m, n, an], fangzhi1[data, m, n, an]], {n, 1, lie}], {m, 1, hang}]; data = temp)]; weizhi[x_, m_, n_, k_] := If[x[[m, n]][[2 + k]] == 1, If[{m, n} + x[[m, n, 3 + k]]*x[[m, n, 5 + k]] - x[[m, n, 4 + k]] == {0, 0} || ({m, n} + x[[m, n, 3 + k]]*x[[m, n, 5 + k]] - x[[m, n, 4 + k]]).x[[m, n, 3 + k]] == Norm[({m, n} + x[[m, n, 3 + k]]*x[[m, n, 5 + k]] - x[[m, n, 4 + k]])], jian++; chu = Insert[chu, Position[gate, x[[m, n, 4 + k]]][[1, 1]], -1] , If[Abs[x[[m, n, 3 + k]].{1, -1}] == Sqrt[2], Module[{k1 = Cases[{0, 5}, Except[k]][[1]]}, If[temp[[({m, n} + x[[m, n]][[3 + k]]*x[[m, n, 5 + k]])[[1]], ({m, n} + x[[m, n]][[3 + k]]*x[[m, n, 5 + k]])[[2]]]][[2 + k1]] == 1, Print[{ii, m, n, "变道"}]; If[temp[[m, n, 2 + k]] == 1, Print["Error 变道"]; temp[[m, n, 2 + k ;; 5 + k]] = x[[m, n, 2 + k ;; 5 + k]]] , temp[[({m, n} + x[[m, n]][[3 + k]]*x[[m, n, 5 + k]])[[1]], ({m, n} + x[[m, n]][[3 + k]]*x[[m, n, 5 + k]])[[2]], 2 + k1 ;; 5 + k1]] = x[[m, n, 2 + k ;; 5 + k]]]], If[ temp[[({m, n} + x[[m, n]][[3 + k]]*x[[m, n, 5 + k]])[[1]], ({m, n} + x[[m, n]][[3 + k]]*x[[m, n, 5 + k]])[[2]]]][[2 + k]] == 1, Print[{ii, m, n}]; If[temp[[m, n, 2 + k]] == 1, Print["Error"], temp[[m, n, 2 + k ;; 5 + k]] = x[[m, n, 2 + k ;; 5 + k]]] , temp[[({m, n} + x[[m, n]][[3 + k]]*x[[m, n, 5 + k]])[[1]], ({m, n} + x[[m, n]][[3 + k]]*x[[m, n, 5 + k]])[[2]], 2 + k ;; 5 + k]] = x[[m, n, 2 + k ;; 5 + k]]]] ;]]; 28 weizhi[] := (ini[]; an = 0; Do[Do[weizhi[data, m, n, an], {n, 1, lie}], {m, 1, hang}]; an = 5; Do[Do[weizhi[data, m, n, an], {n, 1, lie}], {m, 1, hang}]; Do[Do[temp[[m, n, 6]] = standard[[m, n, 6]], {n, 1, lie}], {m, 1, hang}]; data = temp; ini[];); plot[x_] := ArrayPlot[ Table[x[[m]][[n]][[2]]*(x[[m, n, 5]] + 1), {m, hang - 1}, {n, lie - 1}] + Table[x[[m]][[n]][[2 + an]]*(x[[m, n, 5 + an]] + 1), {m, 2, hang}, {n, 2, lie}], ColorRules -> {4 -> Red, 3 -> Green, 2 -> Yellow, Sqrt[2] + 1 -> Yellow, 1 -> Blue, 0 -> White}]; an = 5; ini[] := (temp = Table[{0, 0, {0, 0}(*方向*), {0, 0}(*目的地*), 0(*速度*), 0(*路口前一格*), 0, {0, 0}(*方向*), {0, 0}(*目的地*), 0(*速度*)}, {m, hang}, {n, lie}]; (temp[[#[[1]]]][[#[[2]]]][[1]] = 1) & /@ map1; (temp[[#[[1]], #[[2]]]][[6]] = 1) & /@ Outer[Plus, joint, {{0, 1}, {-1, 0}, {0, -1}, {1, 0}}, 1, 1][[1]]; (temp[[#[[1]]]][[#[[2]]]][[6]] = 2) & /@ joint;); ini[]; data = temp; standard = temp; ii = t; ii++; If[ii == 1, ini[]; data = temp; datasave = {}; delta = {}; liang = {}; zeng1 = {}; jian1 = {};, data = daoru]; zeng = 0; jian = 0; Do[ birthpoint = gate[[k]]; If[k == 3 || k == 4, If[bool[[k]] && data[[birthpoint[[1]], birthpoint[[2]], 7]] != 1, zeng++; data[[birthpoint[[1]], birthpoint[[2]], 7]] = 1; data[[birthpoint[[1]], birthpoint[[2]], 9]] = Cases[gate, Except[birthpoint]][[RandomInteger[{1, 3}]]]; data[[birthpoint[[1]], birthpoint[[2]], 8]] = Module[{temp14 = {}}, Quiet[Do[If[ data[[#[[1]]]][[#[[2]]]][[1]] &[({{0, 1}, {-1, 29 0}, {0, -1}, {1, 0}}[[i]] + birthpoint)] == 1, temp14 = Insert[temp14, {{0, 1}, {-1, 0}, {0, -1}, {1, 0}}[[i]], 1];], {i, 1, 4}]]; temp[[birthpoint[[1]], birthpoint[[2]], 8]] = temp14[[Position[#[[1]], #[[2]]] &[ NestList[ Max, ((data[[birthpoint[[1]], birthpoint[[2]], 9]] - {birthpoint[[1]], birthpoint[[2]]}).# &) /@ temp14, 1]][[1]][[1]]]] ]; data[[birthpoint[[1]], birthpoint[[2]], 10]] = RandomInteger[{1, 2}];], If[k == 1 || k == 2, If[bool[[k]] && data[[birthpoint[[1]], birthpoint[[2]], 2]] != 1, zeng++; data[[birthpoint[[1]], birthpoint[[2]], 2]] = 1; data[[birthpoint[[1]], birthpoint[[2]], 4]] = Cases[gate, Except[birthpoint]][[RandomInteger[{1, 3}]]]; data[[birthpoint[[1]], birthpoint[[2]], 3]] = Module[{temp14 = {}}, Quiet[Do[If[ data[[#[[1]]]][[#[[2]]]][[1]] &[({{0, 1}, {-1, 0}, {0, -1}, {1, 0}}[[i]] + birthpoint)] == 1, temp14 = Insert[temp14, {{0, 1}, {-1, 0}, {0, -1}, {1, 0}}[[i]], 1];], {i, 1, 4}]]; temp[[birthpoint[[1]], birthpoint[[2]], 3]] = temp14[[Position[#[[1]], #[[2]]] &[ NestList[ Max, ((data[[birthpoint[[1]], birthpoint[[2]], 4]] - {birthpoint[[1]], birthpoint[[2]]}).# &) /@ temp14, 1]][[1]][[1]]]] ]; data[[birthpoint[[1]], birthpoint[[2]], 5]] = RandomInteger[{1, 2}];]]];, {k, 1, 4}] fangxiang[]; jiasu[]; fangzhi[]; weizhi[]; Return[{data, ii, chu, jian, Plus @@ (Table[{data[[m, n, 2]], data[[m, n, 7]]}, {m, hang}, {n, lie}] // Flatten), zeng}]) // Quiet daolu1[data_, t_, boolx_] := (Jian = 0; jiansujilv1 = 0.5; Ini[]; chedao = Temp; Standard = Temp; Ini[] := (Temp = 30 Table[{0(*方向*), 0(*有无车*), 0(*速度*), 0.2(*路况*), 0(*意愿*)}, l, 6]; (Temp[[#[[1]], #[[2]], 1]] = -1) & /@ (Table[{m, n}, {m, l}, {n, 3}] // Flatten[#, 1] &); (Temp[[#[[1]], #[[2]], 1]] = 1) & /@ (Table[{m, n}, {m, l}, {n, 4, 6}] // Flatten[#, 1] &); (Temp[[#[[1]], #[[2]], 4]] = jiansujilv1) & /@ (Table[{m, n}, {m, Gate[[1]], Gate[[1]]}, {n, 4, 6}] // Flatten[#, 1] &);); generator[x_] := If[chedao[[1, x, 2]] != 1, Zeng++; chedao[[1, x]][[{2, 3, 5}]] = {1, RandomInteger[{1, 5}], RandomChoice[{1, -100, -100}]*RandomReal[{0.3, 0.5}]};]; Generator[] := (iii = RandomReal[]; iiii = RandomSample[{4, 5, 6}]; Which[iii < CDF[PoissonDistribution[1], 0], , iii < CDF[PoissonDistribution[1], 1], generator[RandomChoice[{4, 5}]];, iii < CDF[PoissonDistribution[1], 2], generator[iiii[[1]]]; generator[iiii[[2]]]; , iii < CDF[PoissonDistribution[1], 3], generator[iiii[[1]]]; generator[iiii[[2]]]; generator[iiii[[3]]];]); Ini[]; Huandao[x_, m_, n_, delta_] := If[x[[m, n, 2]] == 1, If[x[[m, n + delta, 2]] == 1, (Temp[[m, n]][[{2, 3, 5}]] = x[[m, n]][[{2, 3, 5}]]), Temp[[m, n + delta]][[{2, 3, 5}]] = x[[m, n]][[{2, 3, 5}]]]]; lbefore[x_, m_, n_, delta_] := Module[{dlr = 0}, If[x[[m, n + delta, 1]] == x[[m, n, 1]], dlr = 0; For[dlr = 0, x[[m + (dlr + 1)*x[[m, n, 1]], n + delta, 2]] == 0 && m + (dlr + 1)*x[[m, n, 1]] != l && m + (dlr + 1)*x[[m, n, 1]] != 0, dlr++;]; Return[dlr], Return[0], Return[0]]]; lback[x_, m_, n_, delta_] := Module[{drr = 0}, If[x[[m, n + delta, 1]] == x[[m, n, 1]] && m + (drr + 1)*x[[m, n, 1]] != l && m + (drr + 1)*x[[m, n, 1]] != 0, drr = 0; For[drr = 0, x[[m + (drr - 1)*x[[m, n, 1]], n + delta, 2]] == 0, drr--;]; Return[Abs[drr]], Return[0], Return[0]]]; (*If[Youguai,delta=1,*) Huandao1[x_, m_, n_] := Quiet[If[x[[m, n, 2]] == 1, (d = 0; dr = 0; dl = 0; For[d = 0, m + (d + 1)*x[[m, n, 1]] != l && m + (d + 1)*x[[m, n, 1]] != 0 && 31 x[[m + (d + 1)*x[[m, n, 1]], n, 2]] == 0, d++;]; If[d < Min[x[[m, n, 3]] + 1, Vmax], dr = lbefore[x, m, n, 1]; dl = lbefore[x, m, n, -1]; bool1 = (dr > d && lback[x, m, n, 1] > Vmax); bool2 = (dl > d && lback[x, m, n, -1] > Vmax); Which[{bool1, bool2} == {True, True}, Which[dr > dl, delta = 1, dr < dl, delta = -1, dr == dl, delta = RandomChoice[{-1, 1}]], {bool1, bool2} == {True, False}, delta = 1, {bool1, bool2} == {False, True}, delta = -1, {bool1, bool2} == {False, False}, delta = 0]; , delta = 0;]; If[ Youguai[x, m, n] && lback[x, m, n, 1] > Vmax && m <= Gate[[1]], delta = 1]; Return[delta]), 0]]; Huandao[] := (Ini[]; Do[Do[Huandao[chedao, m, n, Huandao1[chedao, m, n]], {n, 1, Length[Temp[[1]]]}], {m, 1, Length[Temp]}]; chedao = Temp;); Vmax = 5; Jiasu[x_, m_, n_] := If[x[[m, n, 2]] == 1, Temp[[m, n, 3]] = Min[x[[m, n, 3]] + 2, Vmax]]; Jiasu[] := (Temp = chedao; Do[Do[Jiasu[chedao, m, n], {n, 1, Length[Temp[[1]]]}], {m, 1, Length[Temp]}]; chedao = Temp;); Fangzhi[x_, m_, n_] := If[x[[m, n, 2]] == 1, d = 0; For[d = 0, x[[m + (d + 1)*x[[m, n, 1]], n, 2]] == 0, d++;]; Temp[[m, n, 3]] = Min[x[[m, n, 3]], d]]; Fangzhi[] := (Temp = chedao; Quiet[Do[ Do[Fangzhi[chedao, m, n], {n, 1, Length[Temp[[1]]]}], {m, 1, Length[Temp]}]]; chedao = Temp;); Jiansu[x_, m_, n_] := If[x[[m, n, 2]] == 1, If[MemberQ[{1, 2, 3, 4}, Mod[nn, 24]], If[ m + x[[m, n, 1]]*(Abs[x[[m, n, 3]]]) > Gate[[1]] && m <= Gate[[1]], If[True, Temp[[m, n, 3]] = (Gate[[1]] - m)]] , If[ m + x[[m, n, 1]]*x[[m, n, 3]] > Gate[[1]], If[RandomReal[] < jiansujilv1, Temp[[m, n, 3]] = Max[x[[m, n, 3]] - 2, 1]], If[RandomReal[] < x[[m, n, 4]], Temp[[m, n, 3]] = Max[x[[m, n, 3]] - 2, 1]]] ]]; Jiansu[] := (Temp = chedao; Do[Do[Jiansu[chedao, m, n], {n, 1, Length[Temp[[1]]]}], {m, 1, 32 Length[Temp]}]; chedao = Temp;); Weizhi[x_, m_, n_] := If[x[[m, n, 2]] == 1, If[m + x[[m, n, 3]]*x[[m, n, 1]] >= l || m + x[[m, n, 3]]*x[[m, n, 1]] <= 0, Jian++, Temp[[m + x[[m, n, 3]]*x[[m, n, 1]], n]][[{2, 3, 5}]] = x[[m, n]][[{2, 3, 5}]]]]; Weizhi[] := (Ini[]; Do[Do[Weizhi[chedao, m, n], {n, 1, Length[Temp[[1]]]}], {m, 1, Length[Temp]}]; chedao = Temp;); Youguai[x_, m_, n_] := (d = 0; d = d + x[[m, n, 5]]; d = d + LogisticSigmoid[ Count[Table[ x[[i]][[j]][[2]], {i, m + 1, m + 10}, {j, 4, 6}] // Flatten, 1] - 10]; d = d*Switch[n, 4, 0.6, 5, 0.9, 6, 1.1](*车道*); Return[d > 0.2]); Youguai[] := If[chedao[[Gate[[1]], 6, 2]] == 1, If[Youguai[chedao, Gate[[1]], 6], Jian++; chedao[[Gate[[1]], 6, {2, 3, 5}]] = {0, 0, 0}; Return[True], Return[False]];, Return[False]]; zhuanchu[] := If[chedao[[Gate[[1]] + 1, 6, 2]] == 0 && boolx == 1, Zeng++; chedao[[Gate[[1]] + 1, 6, {2, 3, 5}]] = {1, 2, -100};]; plot1[x_] := ArrayPlot[ Table[x[[m]][[n]][[2]]*(x[[m, n, 3]] + 1), {m, Length[x]}, {n, Length[x[[1]]]}], ColorRules -> {1 -> Pink, 6 -> Blue, 2 -> Yellow, 3 -> Purple, 4 -> Red, 5 -> Green}]; fun[chedao_] := Plus @@ (Table[chedao[[m, n, 2]], {m, 1, l}, {n, 4, 6}] // Flatten); nn = t; nn++; If[nn == 1, Ini[]; chedao = Temp; Standard = Temp; Jian = 0; Zeng = 0; , chedao = data;]; Jian = 0; Zeng = 0; 33 Generator[]; Huandao[]; Jiasu[]; Fangzhi[]; Jiansu[]; Weizhi[]; Temp = Standard; guai = Youguai[]; zhuanchu[]; Liang = fun[chedao]; Return[{chedao, nn, guai, Jian, Liang, Zeng}]) // Quiet; ii = 0; datasave = {}; cunchumap = {}; nn = Table[0, 4]; chedaosave = Table[{}, 4]; cunchu = Table[{}, 4]; guairu = Table[{}, 4]; Jian11 = Table[{}, 4]; Liang11 = Table[{}, 4]; Zeng11 = Table[{}, 4]; jian11 = {}; liang11 = {}; zeng11 = {}; chu11 = {}; boolhui11 = Table[{False}, 4]; joint = {{11, 12}}; gate = {{11, 1}, {1, 12}, {31, 28}, {45, 12}}; Do[Do[Gate = {{34, 12, 31, 16}[[i]]}; l = {45, 28, 45, 28}[[i]]; cunchu[[i]] = daolu1[chedaosave[[i, Length[chedaosave[[i]]]]], Length[chedaosave[[i]]], boolhui11[[i, -1]]]; boolhui11[[i]] = Insert[boolhui11[[i]], False, -1]; chedaosave[[i]] = Insert[chedaosave[[i]], cunchu[[i, 1]], -1]; guairu[[i]] = Insert[guairu[[i]], cunchu[[i, 3]], -1]; Jian11[[i]] = Insert[Jian11[[i]], cunchu[[i, 4]], -1]; Liang11[[i]] = Insert[Liang11[[i]], cunchu[[i, 5]], -1]; Zeng11[[i]] = Insert[Zeng11[[i]], cunchu[[i, 6]], -1]; , {i, 1, 4}]; Do[bool = guairu[[#, Length[guairu[[1]]]]] & /@ {1, 2, 3, 4}; cunchumap = neibu[datasave[[Length[datasave]]], Length[datasave], bool]; datasave = Insert[datasave, cunchumap[[1]], -1]; jian11 = Insert[jian11, cunchumap[[4]], -1]; liang11 = Insert[liang11, cunchumap[[5]], -1]; zeng11 = Insert[zeng11, cunchumap[[6]], -1]; chu11 = Insert[chu11, cunchumap[[3]], -1]; 34 If[chu11[[-1]] != {}, Do[boolhui11[[chu11[[-1, ic]], Length[boolhui11[[1]]]]] = True, {ic, Length[chu11[[-1]]]}]] , 1], 200]
|