1. 需求预测与VISSIM:为什么微观仿真先要算清“车从哪来”
交通仿真这行干久了,你会发现一个特别真实的规律:很多项目最后结果跑偏,根本原因不在路网画得够不够细、信号配时调得准不准,而是前期需求输入本身就站不住脚。VISSIM作为微观仿真软件,它的核心能力是在你给定了“有哪些车、走哪些路、什么时候出现”的前提下,把交通流的交织、排队、延误演算出来,但“有哪些车、走哪些路”这件事,本身不是VISSIM该去猜的,它必须来自交通需求预测。
我在实际项目里见过不止一次这样的场景:建模的人拿到VISSIM就急着画路网,路段连接、冲突区、信号灯一个一个对上去,结果到了加载车流时才发现,不知道该给每条路段分配多少流量,只能凭感觉填一个数。后面所有信号优化、车道设计的结论都建立在这些“拍脑袋”流量上,评审会上一问流量来源,整个模型的置信度瞬间归零。
所以在进入VISSIM建模之前,先把需求预测的逻辑链条弄明白,比学任何功能按钮都重要。交通需求预测在工程实践里通常指一套从社会经济数据出发、推算出未来某个时段路网上交通量的方法体系,宏观层面最经典的是四阶段法,也就是出行生成、出行分布、方式划分、路径分配。这四步做下来,你会得到一套分区与分区之间、时段与时段之间的出行交换量,也就是OD矩阵,以及分配到每条道路上的断面预测流量。
VISSIM就是这条链的“最后一公里”。宏观模型把需求算到了道路级别,告诉你这条路预测流量是每小时多少辆;VISSIM则在更小的空间尺度上,把车一辆一辆放进路网,模拟它们如何受信号、车道、交织、公交停靠的影响,最终算出行程时间、排队长度、停车次数这些运行指标。作为仿真工程师,我们需要做的就是搭好从宏观需求到微观输入之间的桥。
这座桥具体怎么搭,没有想象中的那么玄。核心无非是三件事:把OD矩阵转换成VISSIM能读的结构,把预测断面流量拆成不同车型、不同时段的输入,再把路径分配的结果通过VISSIM的路径决策功能体现出来。这三件事如果做得干净,仿真结果自然能和预测数据对标;哪一环断了,后面的校验就会越调越离谱。
下面我按自己在多个实际项目中的做法,把需求和仿真的衔接过程拆开讲。
2. VISSIM需求建模的核心工具与底层逻辑
2.1 车辆构成与车辆类型:先把“车队”定义清楚
VISSIM里所有车都是基于“车辆类型”和“车辆构成”这两个概念在跑。这个设计看起来简单,但很多人用着用着就混了。
车辆类型是一辆车的物理属性,比如小汽车、公交车、货车,各自的长宽、加速度、速度分布、颜色这些参数都属于模型类型层面。车辆构成则是在某个流量输入点上,不同类型车辆所占比例的混合体,比如某条路段上小汽车占92%、公交车占3%、重型货车占5%,这就是一个车辆构成的组合。
做需求预测转化时,我习惯先核对需求预测报告里的车型分类。国内常见的预测口径会给出客车比例、货车比例,有些详细的还会区分小客、大客、小货、中货、大货。VISSIM里不需要原封不动建那么多车型,过细的车型划分反而会让标定参数变得繁琐。我的经验是,如果预测口径只有客车货车两类,就设置小汽车、公交车、货车三个基本车辆类型足够;如果研究区内公交专用道或BRT线路比较重要,再单独拆出一个公交车类型专供公交线路使用。
实际配置时要注意一点,车辆构成的百分比不能直接照搬路段断面车种比例,因为OD需求不一定会均匀地分摊到所有路段上。比如需求预测给出全网客车75%、货车25%,但你的仿真路网主要覆盖中心城区,货车限行政策导致区域内货车比例可能只有8%,这种情况下应该按仿真区域的实际构成来定义,而不是机械地拿全网比例套每一条路段。
还有一个高频踩坑点:公交车和货车在VISSIM里如果共用一条路径决策,而路径决策又按车辆构成来区分比例,公交线路和货车路径很容易被混在一起。最稳妥的做法是公交车单独建一条路径,靠车辆类型属性来约束哪些车允许使用这条路径,不要把所有车都塞进同一个构成里。
2.2 需求输入不等于流量输入:OD需求的底层逻辑
VISSIM里有两种看起来很像、但底层逻辑完全不同的需求加载方式,一种是“输入流量”(Input Flow),另一种是“OD需求”,这两个概念如果没分清楚,模型搭到一半很容易走弯路。
输入流量是直接在某条路段起点或者连接器上,以“各小时车辆数”的方式把车放进去。这种方式的优点是简单直观,适合路网边界出入口明确、需求数据只有断面流量的情况。缺点也很明显:每一条入口路段都要单独输入,而且如果路网内部有多个交叉口需要选路,你还要再配合路径决策来告诉车走哪条路;一旦预测方案调整,比如某个路口流量变了,你得手动改一片入口流量,维护成本很高。
OD需求则是以“起点区—终点区”之间交换量的形式,一次性定义整个网络的需求矩阵。VISSIM会根据你设定的路径选择规则,把OD对之间的车辆实际分配到具体线路上。这种方式更接近交通需求预测的本来面貌:宏观模型产出OD矩阵,VISSIM接收OD矩阵,再通过网络加载和路径决策把车流分布到路网。缺点是需要建立OD区、定义区与路段之间的连接关系,前期工作量稍大,但当你需要做方案比选、敏感性测试的时候,OD需求的方式会让调整效率翻倍。
我这几年做VISSIM项目,一个重要的判断标准是:如果手头只有几个关键路口的现状流量和未来流量,就用输入流量方式,快速建模、快速出数;如果手头有完整的宏观模型OD矩阵,或者要评估路网级方案对交通流重分布的影响,就一定要用OD需求方式。选择哪种方式本身就是需求预测结果细化程度决定的,而不是拍脑袋决定。
2.3 路径决策:让车按预测路径开起来的关键
需求输入解决的是“有多少车要跑”,路径决策解决的是“这些车到底怎么跑”。VISSIM的路径决策机制看起来只是一个起点—终点选择功能,实际上它承担了分配模型和微观仿真之间的接口任务。
做静态路径决策时,你需要在某一组起点和终点之间指定一条或几条具体路径,并给每条路径设置一个比例。这其实是在用微观模型的手动方式,模拟宏观模型里已经算好的路径分配结果。比如宏观模型告诉你从A区到B区有60%的车走北侧主干道、40%的车走南侧次干道,你在VISSIM里就把这个比例直接配到对应的两条路径上。
需要注意的是,路径决策比例和OD需求是两层东西。OD需求决定总量,路径决策决定拆分比例,两者相乘才是某条具体路径上的流量。我曾经犯过一次错误,在路由决策里把路径比例设成50%、50%,还反复核对OD矩阵,怎么算某条路段的流量都对不上,最后才发现是另一组路径决策起了冲突,被重复计算的路径把流量吞掉了一部分。VISSIM中起点和终点区只能与一组路径决策匹配,多个起点终点之间的路径如果不做隔离,很容易发生路径重复和流量重复统计的问题。
2.4 静态路径与动态路径选择:该用谁心里要有数
VISSIM同时也支持动态路径决策,也就是在仿真过程中根据路网实际的拥堵情况,动态计算车辆应该选择哪条路径。这个功能听起来比静态路径高级很多,很多初学者一上来就喜欢用动态路径,觉得这样不用手动设置比例。
但我的建议是,动态路径决策的使用条件相当苛刻。动态路径基于“动态交通分配”原理,它需要假设驾驶员在当前路网状态下会选择自己认为阻抗最小的路径,而这个行为假设是否成立,取决于你对路网阻抗函数、出行者信息掌握程度、路径选择敏感系数这些参数的标定是否到位。如果这些参数没有经过仔细标定,动态路径的结果可能比静态路径更失真,因为软件默认参数往往是典型欧美驾驶行为标定的,放在国内混合交通环境下很容易水土不服。
所以一般来说,能用静态路径的项目尽量用静态路径——宏观模型已经帮你把路径分配做完了,你复用它的结果即可,微观仿真要做的只是“还原”,不是“重算”。只有在两种情况我才会考虑动态路径:一是宏观模型本身没有做路径分配,只给了OD矩阵;二是路网中某个关键走廊发生拥堵后,预测流量需要在多条替代路径之间实时转移,静态路径比例无法反映这种转移效应。
3. 从需求预测到VISSIM仿真的完整实操流程
3.1 从宏观预测结果中提取关键数据
在开始动VISSIM之前,我建议先花半天时间把需求预测报告中的数据吃透。一份合格的预测报告至少会给出以下东西:
首先是研究范围内的交通小区划分与OD矩阵。注意看OD矩阵的时间粒度,是按高峰小时给的还是按全天给的,如果是全天OD,你需要按高峰小时系数折算成仿真时段的需求;如果是高峰小时OD,还需要检查这个高峰小时是否和研究路网实际最堵的时段一致。
其次是模型分配后的路段断面流量。这部分数据一般图表形式出现,你要做的是把它提取成结构化清单,每条路段对应一个高峰小时流量,有条件的话再分车型。这个清单将成为后面VISSIM输出校验的基准值,没有这个基准,后面无论怎么调参数都没有“准不准”这一说。
最后是关键的路径流量数据。宏观模型里通常可以查任意一个OD对在各路径上的分配结果,把这个结果导出来,作为VISSIM静态路径决策比例的原始依据。这一步容易被忽略,但恰恰是让VISSIM复现宏观预测结果的最好弹药。
3.2 建立路网并准备OD区连接
路网底图的导入和道路几何的绘制是VISSIM建模的地基,这部分很多人已经很熟了,我只说和需求预测直接相关的两个关键点。
第一,路网边界一定要和宏观模型的小区划分对齐。交通需求预测的OD矩阵是按交通小区组织的,如果你的VISSIM路网边界里没有定义对应的小区,或者小区划分和宏观模型不一致,那么OD矩阵导进来就是完全错位的。实际操作中,我会根据宏观模型报告里的小区范围,在VISSIM里做一块或多块多边形OD区,把各个小区的质心连接器引到周边路网上。
第二,连接器的位置和方向要符合实际可达性。小区连接器可以理解成所有从该小区出发的车辆“涌出”到路网的位置,如果连接器接到了一条单向通行且不能转弯的路段上,车辆就可能永远找不到出口,直接导致OD需求无法加载到路网中。我习惯把连接器落在小区边界的车道起终点处,并确保每条连接器都能在合理距离内汇入主要集散道路。
3.3 导入OD矩阵并配置需求组件
数据准备好、路网画好后,就是导入OD并建立需求组件。VISSIM导入OD的方式有几种,我用的比较多的是通过矩阵文件导入,矩阵文件本质上就是一个行列对应的CSV或者TXT文本,行是起点区编号,列是终点区编号,单元格是相应时段的车辆数。
先创建OD区,给每个OD区分配好和宏观模型对应的编号;再建立OD车辆组和OD需求矩阵;然后把矩阵文件中的数据分配到对应OD区 pairs;最后给每个OD pair配置路径决策。
这里有一个非常实用的小技巧:导入矩阵后千万别急着跑仿真,先把“需求显示”打开,用VISSIM的OD需求可视化检查一遍。因为矩阵导入是一个完全程序化的操作,很容易出现某个OD pair的连接器接错、某个小区编号对不上导致流量为0的情况。可视化检查能在仿真前就暴露问题,等仿真跑出车来再发现流量错了,光排查就得花掉大半天。
3.4 路径决策配置与动态交通分配参数校核
OD需求加载完毕,接下来配置路径决策。采用静态路径时,我需要把上一步从宏观模型导出的路径流量比例填到每一条路径上。一个常见的做法:先把所有OD对之间主要的路径都识别出来,通过VISSIM的路径搜索功能自动生成一组基础路径,再人工核对走向是否符合实际,最后把比例逐个填进去。这一步虽然琐碎,但建议不要省人工核对,自动生成路径偶尔会出现绕行或者穿过小区内部的异常走向。
采用动态路径时,需要设置动态交通分配的相关参数,包括路径更新的频率、行程时间感知权重、驾驶员对路况的熟悉程度比例等。VISSIM默认参数可以作为一个起点,但我的经验是,动态分配的关键在校核,不在参数初始值。先把仿真跑起来,看路网流量分布是否和宏观预测的分配结果吻合,如果不吻合,优先调整道路阻抗参数和路径更新周期,而不是盲目去调驾驶员行为参数。
3.5 流量校验与迭代收敛
无论用静态路径还是动态路径,最终都要回答一个问题:VISSIM仿真出来的路段流量,和需求预测报告给出的路段流量,差多少。
这一步是整个流程中最核心的校准工作。我会把VISSIM运行完成后各路段、各车道的流量统计导出来,和预测断面流量做一张对比表。通常观察两个指标:一是绝对误差,预测流量和仿真流量的差值;二是相对误差,差值与预测流量的比值。在国内的工程实践中,主干路断面流量误差控制在15%以内、次干路控制在20%以内是比较常见的要求。
如果某个断面误差偏大,排查的顺序一般是先检查OD总量是否正确,再检查路径决策是否漏配或者配错,最后检查路网节点是否导致车辆被卡住。优先级千万不要搞反,我见过很多人一上来就调驾驶行为参数,结果越调越乱,最后发现是某条连接器方向画反了导致流量少了三分之一。
迭代的过程要记录每一次运行结果和参数修改的原因,形成一张参数-误差对照表。这个过程本质上就是微观模型的标定,和宏观模型标定的思路一致,只是颗粒度更细。一般经过两三轮迭代,模型就能达到相对稳定的状态。
4. 常见问题与排查技巧实录
4.1 路网明明画好了,为什么车辆不加载或者数量异常
这个问题在VISSIM项目里出现频率极高,尤其是刚开始接触OD需求建模的新手。最常见的原因有三个:
第一个原因是起始小区连接器没有正确连接到路径决策的起点上。路径决策的起点应当落在某个路段上,而OD需求通过连接器从小区进入路网后,必须能在路网内部找到一个匹配的路径起点,否则车辆生成后直接消失。排查时选中OD区,看它的连接器和路径决策起始位置是否在同一个车道逻辑连接链上。
第二个原因是OD矩阵里的车辆数和实际加载时间不匹配。VISSIM的OD需求是按小时流量定义的,如果你矩阵里填的是全天总流量而没有除以服务小时数,加载进仿真后车辆密度会高到路网直接崩溃;反过来,如果你用的是全天OD但没有延长仿真时长,仿真时段内根本跑不完这么多车,后半段的OD需求不会被加载。
第三个原因是输入流量和OD需求重复叠加了。同一个边界路段,如果既通过输入流量放了一波车,又接到了某个OD需求组件里,车辆就会翻倍。这种情况在混合使用了两种加载方式的项目里最常见,排查方法也很简单:检查边界路段上是否同时存在输入流量图标和OD区连接器。
4.2 仿真路段流量和预测流量对不上
模型跑起来了,流量也加载了,但一对比预测值却在关键断面上差了30%以上,这类问题的排查逻辑一定是沿着“需求总量—路径比例—路网容量”这条链走。
首先看需求总量:把仿真时段内所有OD对的需求加总,和宏观模型预测OD矩阵的总出行量对比。这个数通常是最不容易错的,但如果差了,说明矩阵导入环节就有问题。
然后看路径比例:同一OD pair在VISSIM里如果有多个路径决策,而实际上某条路径因为信号控制或者道路条件被堵死,流量就会被迫转移到其他路径上,断面的流量分配和宏观预测自然不同。这时候要在仿真动画里观察车辆走向,看是否有大量车辆在不合理的路径上堆积。
最后看路网容量:如果模型中某个无信号交叉口严重饱和,车辆排队溢出到了上游,会导致上游流量无法进入统计断面,仿真输出的流量就会低于预测值。宏观模型因为用的是解析分配方法,不太会出现这种排队向上游回溢式的影响;而微观仿真把这种相互作用如实反映了出来,如果预测方案本身确实超出了路网容量,那仿真结果反而是更接近真实。
4.3 动态路径决策不收敛或者结果波动剧烈
动态路径决策在使用中经常出现两种现象:一是每次换一个随机种子,结果流量分布差异明显;二是同一OD对的路径流量在多次运行中忽高忽低,不稳定。
这个问题的根源在于动态交通分配本身并不是一个快速收敛的过程,尤其是当路网中存在多个接近等价的平行路径时,车辆会在几条路径间不断试探和摇摆。VISSIM通过迭代来逼近均衡解,但迭代次数不够或路径切换阈值设置不当,结果就会保持震荡。
我的建议是:第一,保证动态路径仿真有足够的预热时间,让路网先加载到一个稳定状态再开始统计;第二,多组随机种子运行并取平均值,模拟的目标本来就是对随机性的统计描述,单次运行没有任何意义的;第三,如果震荡始终无法消除,就要考虑是否确实是路网本身存在更稳定的路径组合,可以先用静态路径把流量比例锁死,也许更适合这个项目的需求。
4.4 高峰小时系数换算的坑
交通需求预测给出的OD矩阵通常对应一个“设计高峰小时”,但仿真模型里你会发现如果直接把这个小时流量塞进一个3600秒的仿真时长,车辆会非常密集地迎面扑来,仿真刚开始几分钟就陷入死锁。
这是因为高峰小时流量并不等于整个小时内均匀流量,它其实是“小时流率”,也就是把高峰时段内最密集的15分钟流量折算成一小时的量。VISSIM默认的OD需求也是按流率加载的,这本身没有错,但如果你把仿真时长设定为3600秒,从0秒就开始按这个流率加载,路网相当于从零负荷直接跳到了最高负荷,没有任何缓冲期。
实际操作中我习惯把仿真预热时间加上。比如高峰期是17:00到18:00,我会把仿真时长设置为从16:30开始到18:15结束,前30分钟用较低的流量加载做预热,17:00前后逐步提升到高峰流率,这样车辆进入路网是平滑递增的,排队形成的过程也更接近真实。VISSIM可以通过定义不同时间段的OD需求或者流量输入曲线来实现这个变化,不用写代码,图表化的时间轴编辑就能完成。
5. 从预测到仿真的衔接心得与工作流建议
做完了这么多项目,我对交通需求预测和VISSIM仿真的关系最大的体会是:不要把仿真当成需求预测的“下一道工序”,两者更应该是一套反复校核的双向反馈机制。宏观预测结果给微观仿真提供输入,微观仿真结果反过来又能验证宏观预测的合理性,比如某个节点通行能力不足导致宏观模型中分配到该节点的流量根本无法通过,这本身就是一个需要反馈给规划方案的信号。
因此我在这类项目中养成了一个比较固定的工作流:
在项目启动阶段,先把需求预测报告的数据整理成三类文件:OD矩阵文件、断面流量清单、路径流量表。这三类文件就像仿真的“三张底牌”,后面任何模型调整都要回到这三张底牌来校验。
在建模过程中,路网几何严格按照底图绘制,但连接器和OD区的设置要和预测报告的小区划分逐一对应。每次修改路网后,重新运行一遍原有OD输入,看流量是否发生剧烈变化,如果变了,说明修改动作动到了需求加载的结构,需要检查连接关系而不要只归因于信号参数。
在方案比选阶段,如果多个路网方案需要对比,尽量保持OD输入、路径选则策略、车辆构成参数三者固定,只改变路网或信号方案。这样方案的差异就完全是由设施条件引起的,而不是因为需求随机性带来的噪声,比选结论才有意义。
最后再提一个我比较常用的日常技巧:每次跑完仿真,把所有输出指标和预期值放在同一张表里检查,不要只看总流量。行程时间、排队长度、停车次数这些数据,任何一个偏离预期都可能是需求输入出问题的信号。尤其是停车次数,如果模型里某条路段的停车次数明显高于预期,但流量却正常,往往意味着这条路上的车辆遇到了异常的交通控制或路径干扰,值得顺着车辆轨迹去查一轮。
整个模型的价值从来不在于VISSIM跑得有多炫,而在于你有没有把“车从哪里来”这件事真正讲清楚。需求预测给VISSIM提供了这个答案的起点,VISSIM又用更真实的方式把这个答案演绎出来,两者配合得当,交通方案的评价结果才能真正站得住脚。