1. 写在建模之前:先想清楚公交模型要回答什么问题
做TransModeler公交建模之前,我建议你先问自己一个问题:这次仿真到底要解决什么实际的业务问题?因为我见过太多人一上来就埋头画线路、设站点,结果折腾了一个星期,最后领导问“你这个模型到底能说明什么”,自己却答不上来。
公共交通系统建模在TransModeler里绝不是“把公交线路画在地图上”这么简单。它本质上是在回答一组非常具体的运营问题:这条公交线路的班次间隔设置是否合理?增设站点之后会对社会车辆产生多大影响?如果BRT专用道全天候启用,交叉口的排队会不会溢出?乘客到底是从哪个站上车、从哪个站下车,高峰小时的断面客流量是否超出车辆运力?这些问题背后,是交通工程师对“供给”与“需求”的匹配关系做数字化验证。
为了把这件事说清楚,这篇文章沿着一条实际项目的建模链条展开:从路网设施准备、站点与线路绘制,到车辆运行规则、发车计划,再到乘客需求分配与结果输出。你在读的过程中可以顺手打开TransModeler对照操作,这套流程我实测过很多遍,踩过的坑比官方手册写出来的多得多。
另外,这一篇是TransModeler系列的第七篇,前几篇讲的是路网构建、动态交通分配、信号优化这些基础能力。公交建模恰好是站在这些地基之上的一项综合应用,所以如果你还没有把基础路网跑通,建议先把前几篇的操作过一遍再来看公交部分,否则后面讲车道级停靠逻辑和乘客上客过程时,你可能会觉得有点飘。
2. 路网设施准备:公交专用道与站点泊位的隐藏细节
2.1 公交专用道不是画一条线就完事
很多初学者在TransModeler里定义公交专用道时,以为只要在车道属性里勾选“公交专用”就结束了。实际上这里有一个非常关键的区分:公交专用道在仿真中承担的角色是“通行路权控制”,它决定社会车辆是否允许进入这条车道;而站点泊位设计则是另一个维度的问题,它决定公交车停靠时是否会阻塞后续交通流。这两个维度必须同时处理好,否则模型跑起来会出现公交车和社会车辆互相“穿模”一样的诡异行为。
以我做过的一个BRT走廊项目为例,我们在城市主干道中央设置了两条物理隔离的公交专用道。在TransModeler的道路图层里,我把这两条车道的车辆类型许可设置为“公交+应急”,同时把车道宽度和限速分别调到3.5米和50km/h。然而,如果只是做了这一步,你会发现BRT车辆在进站时仍然会被右侧社会车辆干扰,因为站点区域的车道功能没有明确设置“公交停靠”与“社会车辆绕行”的隔离逻辑。
解决的办法是在节点编辑器中为公交站点所在的路段增加一段附加车道,术语叫“站点拓宽段”。这段拓宽段的作用是让公交车脱离主交通流,进入一段独立的停靠区域。拓宽段的长度要根据高峰小时的停靠公交车辆数来估算:假设你预测15分钟内有12辆公交车需要停靠,平均每辆车停靠时间约30秒,那么主线上需要容纳的排队空间至少是6辆车的长度。按一辆车12米计算,拓宽段长度建议做80米以上。这个参数如果取小了,仿真时你会发现公交车辆在拓宽段入口处就开始排队,进而回堵到上游交叉口。
2.2 站点泊位的类型选择:直通式还是港湾式
站点泊位的几何形式直接决定公交车停靠时的通行效率。TransModeler里可以定义直通式站点(curbside stop)和港湾式站点(bus bay),两者的仿真行为差异很大。
直通式站点的特点是公交车直接占用最外侧车道停靠,乘客上下车时后续车辆必须等待或变道绕行。这种站点在地价紧张的老城区很常见,建模时要注意把站点位置设置在离交叉口出口道足够远的地方,一般建议距出口道停车线至少50米,否则公交车停靠会遮挡右转车辆视线,同时在信号相位切换时容易造成排队溢出。我曾经在一个项目中因为站点离交叉口只有30米,结果晚高峰仿真时右转车道被停靠公交车完全堵死,交叉口吞吐量骤降30%以上。
港湾式站点则相对复杂一些,因为车辆在停靠前要先从外侧车道变换进港湾,停靠完成后再从港湾重新汇入主路。这种“驶入-停靠-驶出”三段式行为在TransModeler里需要配置车辆在站点区域的横向偏移参数,以及汇入主路时的接受间隙(gap acceptance)阈值。我建议你把汇入主路的临界间隙设置在4到6秒之间,小于这个值会导致公交车迟迟无法汇入,后面排队积压;大于这个值则公交车过于激进地抢行,会让社会车辆频繁减速。
我的经验是:在路网规划层面,尽量优先考虑港湾式站点,因为它对交通流稳定性的扰动最小;但在老城区或红线受限区域,直通式站点必须配合严谨的交叉口渠化设计。无论选哪种,你都需要在TransModeler中用“公交站点编辑器”把泊位数量和停靠位置标识清楚,这一段数据直接影响后面出行需求分配中的“上车/下车”地点准确度。
3. 公交站点与线路绘制:一张图讲清楚“线-站-路”三层关系
3.1 线路走向的几何绘制要贴合实际车道
TransModeler中绘制公交线路是在“Transit”图层里完成的,方式与绘制普通车辆路径类似,但有几处细节完全不一样,值得单列出来说明。
首先是线路走向的贴合度问题。绘制线路时必须沿路段中心线走,但更准确的做法是使用“车道级路径”功能,把线路的轨迹绑定到具体的车道。为什么需要做到车道级?因为只有绑定到具体车道,仿真时公交车才会持续行驶在公交专用道上,不会因为换道逻辑而偏离路径。我之前在一个项目中看到其他工程师用中心线画完线路就结束了,结果模型运行时公交车偶尔会“跨线行驶”,背景社会车辆对该车道的占用率数据也明显失真。后来我逐条把线路改绑到公交专用道,输出结果立刻正常了。
其次是线路节点的选择顺序。TransModeler要求线路必须按“站点顺序”排列节点,这意味着你在绘制线路时,如果沿途有10个站点,那么线路的几何走向顺序必须严格与这10个站点的空间顺序一致。别小看这个要求,实际画图时你很容易因为道路渠化绕行、高架上下匝道而调整线路走向,一旦节点顺序被破坏,TransModeler会直接报错,或者更隐蔽的问题是线路站点虽然在地图上看起来正常,但车辆运行时完全不理睬站点直接通过。
第三,尽量用“线路模板”来管理多条相似的线路分支。比如某条快速公交主线有“全程车”“区间车”“大站快车”三种运营模式,在TransModeler里可以分别创建三条线路,但共享同一组站点集合。这样后续调整站点位置时,只需要修改共享的站点对象,三条线路的路径会自动同步更新,省去了逐个线路改站点的痛苦。
3.2 站点的“车道侧”决定上下车行为
始终记住一个原则:公交站点不仅是一个点,它是依附在某条路段某条车道上的一个有向停靠位置。在TransModeler中,每个站点必须被赋予明确的“方向”“车道”“位置偏移量”。
- 方向:站点是服务于上行方向还是下行方向,或者双向共用。如果双向共用,要注意两条方向的车流不能共享同一个停靠位置,否则会形成对向冲突。
- 车道:这是很多新手忽略的地方。站点必须绑定到具体的车道编号,比如“第1车道(最外侧)”或“第2车道(公交专用道)”。如果不绑车道,仿真时系统可能默认公交车辆会在任意车道上停车,这明显不符合实际。
- 位置偏移量:这个参数描述站点距路段起点的距离,单位是米。设置偏移量时,你需要确定道路沿线里程桩的起点位置,通常以路段上游节点为0米。我习惯把站点偏移量精确到5米以内,因为公共交通乘客的“步行接驳范围”对站点位置非常敏感,如果偏差过大,后续的步行分配模型会产生误导性的结果。
我还想提醒一点:在TransModeler中,站点与公交线路之间不是一对一的关系,而是一对多。一个大型换乘站可能同时服务于五六条线路,建模时你只需要维护这一组停靠位,再把这些线路分别关联到同一个站点对象上即可。这样在统计站点上客量时,数据会自动按线路维度汇总,非常方便。
3.3 线路发车频率的初始设定技巧
绘制完线路后,需要设置每条线路的发车频率。这里有一个建模习惯非常关键:不要一开始就用真实运营时刻表来跑模型,我建议先用“固定频率法”做初标定。
所谓固定频率法,就是给每条线路设定一个整数化的发车间隔,比如高峰15分钟一班、平峰30分钟一班,先把整个模型跑通,确认路网性能、站点停靠逻辑没有明显问题。然后再把真实的“首末班时间+发车间隔变化表”输入到发车计划中,逐步逼近实际运营情境。这样做的好处在于,当初期模型出现异常时,你可以快速判断问题到底是出在路网几何层面还是出在发车计划层面,而不是在两者的耦合中迷失方向。
如果你的研究对象是快线或BRT系统,建议把“停站时间分布”数据也一并做成外部CSV导入。停站时间并不等于一个固定常数,它受上下客人数影响比较大。TransModeler内置的停站时间公式会按上车人数、下车人数和单位平均服务时间来计算,单位平均服务时间通常设定为成人上车2.5秒/人、下车2.0秒/人。如果你的项目涉及老年人或携带大件行李乘客比例较高,可以适当把服务时间上调到3.2秒/人,否则高峰站的停站时间会被低估。
4. 车辆运行与停站规则:让公交车“懂规矩”
4.1 首个站点的boarding规则是隐性关键
TransModeler仿真的公交车车辆运行,并不是简单的“压着线跑”,它需要在每个站点判断是否要停靠、停靠多久、开关门顺序如何。这里最容易出问题的是线路的首个站点。
在TransModeler中,如果你不特殊配置,车辆在线路起点站会执行“boarding”动作,也就是说它会等待乘客上车,并且这个等待时间受“发车延误”参数影响。但很多公交系统的实际运营中,起点站的乘客往往在线路发车前就已经在车上等候,车辆只需要准点出发即可。这时我建议把首个站点的“boarding”行为关闭,只保留“timing point”功能——即车辆在起点站只需检查是否到了发车时刻,到点就走。
为什么要特意强调这个?因为如果你把第一个站点也按普通站点处理,仿真时发车频率会被人为拉长,尤其在大客流起点站,车辆排队等上客的时间会被计入行程时间,导致后续所有站点的到达时刻整体偏移。这个细节看似小,但对“公交行程时间可靠性”指标的影响极大。
4.2 停站时间阈值与开关门逻辑
TransModeler的站点停靠逻辑里,有一个参数叫做“最小停站时间”(minimum dwell time),另一个是“最大允许停站时间”。两个阈值配合使用,可以模拟“如果没人上下车,车辆可以直接通过”的行为。
实际操作中,我建议最小停站时间设为2到3秒。原因是公交司机在实际操作中即使看到没人上下车,也会做一个“减速-停车-开门-关门-起步”的完整动作,完全不浪费时间是不可能的。但如果你的模型里车辆停站时间总是等于最大停站时间,那就要检查上下客需求是不是设置得过高,或者车辆容量是不是设得太小导致拥挤无法上车。
车辆容量是另一个容易被忽视的变量。TransModeler允许你设置每辆公交车的“总载客容量”和“座位数”。如果你的模型中容量设得过大,乘客全部上车后车辆仍然轻载,那么高峰和平峰的拥挤度差异就体现不出来;反之容量设得过小,会出现站台滞留人数暴涨,进而引发下游站点的“跳站”现象。我的建议是优先采用实际车型的公告荷载人数,比如12米城市客车荷载80人,其中座位约28个。如果做远期方案评估,可以在此基础上乘以1.1的弹性系数,但一定要在模型说明文档里注明这个系数。
4.3 车辆加减速性能对行程时间的影响
公共交通建模中,车辆动力性能对行程时间的影响往往被高估或低估。TransModeler默认的公交加速度大约在0.8到1.2 m/s²之间,这个范围基本符合城市公交的平均水平。但BRT或纯电动公交的加速性能往往更好,可达1.5 m/s²以上,减速性能也更强。
在项目实践中,我通常会在“车辆类型”里建立两种公交车型:标准车和BRT车。标准车加速度设1.0 m/s²,减速度1.2 m/s²,最大车速50km/h;BRT车加速度设1.4 m/s²,减速度1.5 m/s²,最大车速80km/h。如果你懒得分两种车型,整个公交网络只用一种车型参数来跑,最后输出的行程时间方差会非常小,这在分析“公交运行可靠性”时就是一个失真源。因为现实中,普通公交和BRT在路段行驶时的速度差异,会导致乘客等车时间的波动性显著增加。
5. 发车计划与车辆调度:从频率到时刻表的完整建模
5.1 初始发车数量与“偏置”设置
在TransModeler中,发车计划的核心对象是“车次”(trip)。每条线路每天可以包含几十甚至上百个车次。设置车次时有三个维度需要同时确定:起点发车时刻、终点到达时刻(或行程用时)以及车辆编号。
最容易被忽略的是“车次偏置”这个概念。很多人在配置文件里把每条线路的发车时刻统一定为整点或半点,例如8:00、8:15、8:30这样规整地排列。但现实中的公交车队并不是所有车辆都能准时从头班开始运营,车辆在线路上的起始位置可能分位于不同的站点。TransModeler允许你在车次中指定“起点站点索引”,如果你把某条线路的某个车次设为从第3站开始载客,那么车辆会先在起点站空驶到第3站后,再开始正式的载客行程。这个机制可以用来模拟“区间车”或“车辆周转调度”的真实情境。
5.2 让模型自动生成车次表的两种备选方案
如果你手上没有完整的运营时刻表,但又想快速构建一个有合理发车频率的公交模型,TransModeler提供了另一种机制:按频率生成。你可以设定“从6:00到9:00每10分钟一班,从9:00到16:00每20分钟一班”。系统会自动把这一串车次插入到线路时间表中。
用频率生成法时,有一个参数叫“偏差容忍度”(departure tolerance),它表示车辆实际发车时刻与计划时刻之间允许的最大偏移量。TransModeler默认可能给到2分钟,但我建议在早期建模阶段把它设为30秒以内,让车辆严格按照计划运行。因为公交模型中,发车准点率是一个重要输出指标,如果你一开始就让偏差容忍度很大,那么后续输出的“到站准点率”数据就失去了基准意义。这一点很多教程不会提,只有你实际做完一整轮标定后才会体会。
5.3 车辆编组与回场车处理
高峰期加车、平峰期抽车,这是公交运营的常态。TransModeler中处理“回场车”会比普通私家车建模多一层约束——回场车虽然没有载客任务,但必须使用公交专用道和站点专用进出口,而且不能占用常规乘客站台。
我在做线路车辆周转分析时,会单独建立一组“场站线路”(deadhead routes),用来表示车辆从终点站驶回车场或者从车场驶往起点站的空驶过程。这组线路在仿真中会占用道路资源,影响社会车辆的行驶条件,所以不能省略。否则你计算的“公交专用道社会车辆延误”会缺少空驶公交车的干扰因素,结果偏乐观。
6. 乘客需求分配:从OD矩阵到公交上客量的关键一跳
6.1 公交OD矩阵与道路OD矩阵的分离
公交建模的乘客需求分配,在TransModeler里通常依赖于一个公共交通OD矩阵。这个矩阵描述的是“从哪个交通小区出发、使用公共交通、到达哪个交通小区”的乘客量。它和道路网络的小汽车OD矩阵是两套独立数据,但两套矩阵在空间上必须匹配到同一个交通小区划分,否则模型会出现“小区割裂”的严重错误。
拿到OD矩阵后,TransModeler会执行“公交路径选择”过程,为每位乘客选择一条公交出行链。这个过程要考虑的因素包括:步行到站时间、候车时间、车内时间、换乘次数和换乘走行时间。默认的广义成本函数中,候车时间的权重通常设置为车内时间的1.5到2倍,换乘惩罚则折算为等效车内时间5到10分钟。
如果你的模型里乘客需求不高,比如总数只有几千人,那么分配结果会比较稳定。但如果是数十万人的大区域公交模型,我强烈建议把需求分配逻辑切换为“随机用户平衡”模式,让每个OD对的路径选择结果有一个合理的波动范围,而不是每次都选择同一条绝对最短路径。这种随机性更贴近实际,因为乘客对公交系统的感知并不完全理性。
6.2 步行接驳范围要按场景调整
基于站点的步行可达范围,是公交需求分配中影响面最广的参数之一。TransModeler默认的步行接驳半径通常取500米,也就是大概步行6到8分钟的距离。但如果你研究的对象是城市核心区,建议把半径缩到300米,因为中心城区换乘便利,乘客愿意步行的距离更短;而如果是外围新城或镇区公交,可以把半径放宽到800米甚至1000米。
一个容易犯的错误是用同一个半径套全部站点。结果往往是中心区站点的上客量被高估,外围站点的上客量被低估。在实际项目中,我会按站点周边用地性质分组设置半径:商业核心区300米、居住区500米、工业区外围800米。这种精细化的建模确实需要多花一些前期整理时间,但换来的是后续站点压力分析、车辆配置方案的高置信度。
6.3 公交容量约束与过载跳站
公交系统的容量约束是区别于道路仿真的核心特征之一。在TransModeler中,公交车载客量是有限的,当车辆达到额定载客量后,后续等待的乘客无法上车,只能等待下一班车。这个“过载跳跃”行为如果处理不好,会出现如下失真场景:高峰期某站台等待人数很大,但仿真结果是每一辆车都能正常接走所有乘客,车辆载客率永远在额定容量以下,这显然不真实。
处理容量约束的关键参数是“最大载荷因子”。我通常设为1.0到1.2,允许早晚高峰短时超载10%到20%,符合公交运营现实。此外,TransModeler里会有一个“留存率”参数,用来估算“因过载而无法上车的人数”。你将这个人数按时间序列导出后,可以直接用Excel画出“滞留乘客曲线”。这条曲线对公交公司调整班次非常有说服力,比单纯输出“平均满载率”更能直观暴露供给缺口。
7. 输出分析与方案比选:别让仿真止步于“动画好看”
7.1 多维度KPI的选取逻辑
公交仿真项目汇报时,领导关注的无非是几类指标:运行速度、准点率、断面满载率、乘客等待时间、车辆运营成本。TransModeler自带的分析工具可以生成很丰富的表格和图形,但裸用默认输出会让人陷入指标海洋,反而抓不到重点。
我建议根据项目合同的研究目标来选3到5个核心KPI,做成对比表。例如,研究“是否新增公交专用道”这个方案时,我关注四个指标:公交平均行程时间、公交运行速度标准差(代表可靠性)、社会车辆平均延误(代表影响)、交叉口排队长度(代表空间溢出风险)。这四个指标覆盖了公交效率、可靠性、影响程度和空间约束四个维度,缺一不可。
7.2 靠站时间热力图与断面客流图
如果要向不懂仿真的决策者展示成果,我强烈推荐两个输出:一是“站点停靠时间热力图”,另一种是“断面客流时间-空间图”。
站点停靠时间热力图把每个站点在高峰时段的总停靠时间按颜色深浅展示在地图上。某站颜色越深,代表该站的公交停靠压力越大,潜在排队风险越高。这个图几乎不用解释,汇报时领导一眼就能看出最紧张的站点在哪里。断面客流时空图则是把公交线路上每个断面的客流量绘制成随时间变化的剖面图,可以直接看出客流高峰的推移方向和峰值断面位置,这是编制行车计划的第一手依据。
TransModeler的“Transit Performance”模块里提供了这两种图形的雏形,但你可能需要把输出的CSV数据再导入到专业可视化工具里精细调整样式。不要嫌麻烦,因为这类图在评审会上最能体现建模深度。
7.3 多方案比选中的一致性要求
如果你要做“现状方案”和“规划方案”的对比,有一个大坑必须避开:两套方案中的需求数据必须保持一致。公共交通模型对需求变化极度敏感,如果你在规划方案里顺手调高了公交分担率或者增加了站点周边人口数据,那么输出的差异就说不清是路网方案导致的还是需求变化导致的。做严谨的方案比选时,固定需求输入,只改变供给方案,才能让对比结果具有归因价值。
此外,每次跑完模型,建议把模型版本号、参数文件哈希、OD矩阵文件名都记录在案。公交建模项目的周期通常会横跨好几个月,没有版本管理的话,很容易出现“这个方案结果怎么跟我上周跑出来的完全不一样”的尴尬局面。我自己的习惯是用日期+方案描述做文件名,比如“20250412_方案A_公交专用道_早高峰”,绝不使用“final_v3”这类模糊命名。
8. 常见问题与排查技巧实录
8.1 公交车不按线路走或直接跳过站点
排查顺序:先检查线路节点顺序与站点顺序是否一致;然后检查站点是否绑定到了正确的车道;最后检查站点是否处于线路路径的“服务范围”内。我遇到最多的情况是站点偏移量设到了路段的中间,但线路路径在路段末端走的是另一个方向,系统判定站点不在线路上,直接忽略。
8.2 公交车辆在站点区域频繁换道
这个通常是“站点拓宽段”没有设置好。你需要在站点前后增加足够长度的渐变段,让公交车能平滑地从主线车道进入拓宽段。渐变段长度建议控制在20到30米,太短则车辆切换轨迹过急,不仅看着别扭,还会影响相邻车道车辆行驶。
8.3 满载率一直偏低或偏高
满载率偏低,先看需求OD矩阵是总量不足还是分布过于分散;满载率偏高,则检查车辆容量设置和发车频率是否匹配。还有一种隐蔽原因:某条线路与其他线路共享了过多的重复路段,导致客流被多条线路分流,每条线路的满载率都不高。这时要检查是不是乘客换乘逻辑中的“换乘惩罚”设得太低,乘客被诱导到了多乘一次车的方案里。
8.4 模型跑完后输出文件巨大
TransModeler的城市级公交模型跑完一整天仿真,输出的原始事件文件可能有几十GB,直接处理会非常痛苦。我习惯在仿真设置里只输出聚合间隔为15分钟的统计数据,而关闭逐秒级的事件事务日志。如果你确实需要逐秒级数据来分析局部拥堵传播过程,那也是单独再跑一小段时间窗口,而不是全时段全量输出。
8.5 常见问题速查表
| 问题表现 | 可能原因 | 建议解法 |
|---|---|---|
| 公交车不进站 | 站点方向错误 | 检查站点方向属性,是否面向线路行驶方向 |
| 公交车长时间堵在站区 | 拓宽段过短或泊位不足 | 增加拓宽段长度与泊位数 |
| 乘客等待时间异常高 | 发车频率过低或容量不足 | 调整发车间隔或增大车辆容量 |
| 满载率曲线过于平缓 | 车型参数未区分 | 建立标准车和BRT车两套车辆类型 |
| 公交专用道空置但社会车道拥堵 | 公交发车频率太低 | 核对线路发车计划是否为空,增加车次 |
| 仿真结果与真实GPS数据偏差大 | 停站时间公式参数不当 | 根据实际上下客时间标定单位服务时间 |
9. 个人实操收尾:一个容易被忽略的“校核技巧”
公共交通系统建模做到最后,我通常不会只依赖TransModeler自带的验证工具去判断模型好坏,因为内部的指标只是相对参考,真正能检验模型贴近真实的是外部数据。
我在每个项目都会找公交运营方要三样东西:线路的平均运营速度、每个重点站点的实际上下客人数、以及早晚高峰的车辆准点率。把这三个外部观测值与仿真输出做对比,偏差如果在15%以内,模型基本可以用于方案测试;如果某个站点的偏差超过30%,我会回到那个站点的周边做一次实地访问——往往是站点位置在现实中因为有障碍物或站台长度限制而发生了移动,而路网数据里还是旧位置。这种“现场校核”看起来土办法,却是我见过最能提升模型可信度的环节。
最后再分享一个实操细节:公交建模过程中,图层管理务必保持清爽。我会单独为公交系统建立一套命名规范,例如“BUS_站点_编号”“BUS_线路_编号”“BUS_车场_编号”,这样当你做多方案反复迭代时,随便打开一个图层,从名字就能判断它的作用,而不会因为几十个同名图层而抓狂。命名的成本几乎为零,但节省的返工时间非常可观。
公共交通系统仿真的核心价值,并不在于把公交车的轨迹模拟得多么炫酷,而在于帮助工程师用严谨的量化逻辑去验证“线、站、车、人”四个要素之间的互动关系。只要你在路网设施、线路站点、车辆运行、发车计划、需求分配这五个层面都做到位,输出的模型就具备真正的决策支撑能力。希望这篇分享能让你在TransModeler的公交建模路上少走几段弯路。