城市交通网络平衡分析:从UE模型到Frank-Wolfe求解的实战指南
2026/9/24 11:12:13 网站建设 项目流程

简介:《城市交通网络平衡分析理论与实践》(黄海军)是一份PDF格式的学术资料,主要面向交通工程、城市规划与轨道交通领域的科研人员、在校学生及一线从业者,针对城市交通拥堵、延误和运行效率不高等现实问题,提供系统的分析思路与解决框架。内容涵盖理论篇与实践篇:理论部分聚焦网络拓扑结构、交通流动规律、出行时间、速度与容量等核心指标,探讨其变化趋势与影响因素;实践部分则介绍交通监控系统、模拟仿真、优化算法、信息化系统及交通规划设计等落地方法,有助于读者掌握从数据监测、方案推演到策略优化的完整链条。资源以单个PDF文件提供,大小8.1MB,共1个文件,便于直接阅读与存档。目前已有608人学习下载,适合作为交通网络分析课程的补充读物,也适合需要开展相关研究或项目实践的人员参考。

1. 交通模型算出来的均衡流量,为什么不能直接当预测值用

做交通规划或路网评估的工程师,大概率经历过这种场景:拿着一套城市路网数据跑完交通分配,得到各路段均衡流量,兴冲冲和实地调查数据对比,结果发现偏差大到让人怀疑模型是不是坏了。这时候回头翻黄海军老师这本《城市交通网络平衡分析理论与实践》,会意识到问题不在软件,而在建模者对“网络平衡”这四个字的理解还停在套公式层面。

城市交通网络平衡分析要解决的核心问题是一个反直觉的命题:每个司机都只走自己认为最短的路径,最终全网却会形成一个谁都无法单方面改善的稳定状态。这个状态叫用户均衡(UE)。它既不等于系统最优(SO),也不等于实测流量,但它是一切拥堵评价、收费政策、路网改善方案的理论底座。这篇笔记把UE/SO模型、Frank-Wolfe求解、BPR阻抗标定这条线完整拆开,让新手能跑通最小算例,让熟手能避开那几个教科书里不写的收敛坑和参数坑。

2. 把网络平衡模型的骨架拆开:UE、SO与Beckmann变换

2.1 用户均衡:Wardrop第一原理为什么能当优化目标写

用户均衡的概念来自Wardrop在1952年提出的第一原理:在均衡状态下,同一OD对之间所有被使用的路径拥有相等且最小的出行时间,没有被使用的路径出行时间不小于前者。直观理解就是:任何一个司机换路都不会更快,路网达到一种“谁都没动力换路”的稳定态。

但问题是,这个描述是文字性的,没法直接拿来计算。黄海军书里花了大量篇幅做的事情,就是把这个文字条件转成数学上可处理的变分不等式和优化问题。这里有个关键认知:UE不是一个系统最优状态,因为每个司机只考虑自己的出行时间,不考虑自己加入某条路之后对其他司机造成的额外拥堵。边际成本被忽略,所以UE状态下全网总出行时间一定大于等于系统最优的SO状态。

具体到数学形式,设路径p上的流量为fp,路径出行时间为cp(f),UE条件可以写成:

fp > 0 时 cp(f) = μ,fp = 0 时 cp(f) ≥ μ

μ是OD对之间的最小出行时间。这个互补条件看着简单,但包含一个硬约束:路径枚举在真实路网里是不可行的,城市路网OD对之间可能有几万条路径,不可能真的把每条路径都列出来。所以实际求解不会走路径枚举路线,而是走“路段流量”路线,这就是Beckmann变换登场的理由。

2.2 系统最优:UE与SO之间的差距就是拥堵费的理论依据

系统最优(SO)的目标是让全网总出行时间最小化。用数学表达就是最小化所有路段流量x_a与路段行驶时间t_a(x_a)的乘积之和:Σ x_a · t_a(x_a)。注意UE优化的是每一辆车自己的时间,SO优化的是全网总时间,两者的目标函数形态不一样。

UE和SO的差距在单条瓶颈路段上就能看出来。假设一条路流量增加时行驶时间线性上升,UE状态下没人愿意绕路,即使绕路能让全网更快;SO状态下会强制一部分车绕路,让瓶颈路段的流量控制在更高效的水平。这个差距不是理论游戏,拥堵收费的基本逻辑就是把UE推回SO:对司机征收的通行费等于他在该路段产生的边际拥堵成本,让个人决策包含社会成本。

书里推导的最优收费公式是:收费额 = x_a · dt_a/dx_a,这正是UE和SO目标函数之间差的那一项。做收费方案评估时,如果只给决策者看UE流量而不解释这个gap,方案很难有说服力。理解这一项,胜过背十个收费计算模板。

2.3 Beckmann变换:把均衡问题变成能求解的凸优化问题

Beckmann在1956年证明了一个关键结论:满足Wardrop第一原理的UE流量,恰好是下面这个优化问题的最优解:

minimize Z(x) = Σ ∫₀^{x_a} t_a(ω)dω

约束是流量守恒和路径流量非负。这个变换的价值在于:把“每个人独立决策”的分散行为,等价成一个单目标凸优化问题,然后就能用标准的数学规划算法求解。

之所以能这么换,前提是路段行驶时间函数t_a(x_a)是严格递增的,且路段之间互不影响(对称Jacobian假设)。前者在BPR函数下成立,后者在真实路网里是个理想化假设——一条路堵车导致相邻路口排队蔓延,这个路段间的交互效应会被静态UE模型丢掉。

书里会反复强调这个变换的适用边界:它要求阻抗函数是路段流量的函数、OD需求固定、用户对路网信息完全掌握。任何一条被违反,Beckmann变换的等价性就弱化,但很多从业者完全不知道这回事,拿着固定OD就在那跑均衡,跑出来结果不正常也不知道是假设出了问题。

3. 从理论到可算:阻抗函数、Frank-Wolfe算法与最小复现流程

3.1 BPR阻抗函数:参数标定比背公式重要得多

实际求解UE问题前,必须先定阻抗函数的形式。交通分配里最常见的路段时间函数是BPR(Bureau of Public Roads)函数:

t_a(x_a) = t₀_a [1 + α_a (x_a / C_a)^β_a]

其中t₀_a是自由流时间,C_a是路段通行能力,α和β是标定参数。教科书里最常见的取值是α=0.15、β=4,但这组参数来自美国上世纪六十年代的公路数据,直接挪到国内城市道路、不同等级路网,翻车概率很高。

我一般会按道路等级分三档取参数,而不是全网统一抄一组:

道路等级α取值范围β取值范围说明
快速路/高速0.15~0.353~5拥堵拐点明显,β取大值更陡
主干路0.3~0.52~3受信控影响,阻抗曲线更平缓
次干路/支路0.4~0.81.5~2.5容量小,实际拥堵和BPR曲线偏差大

注意,BPR函数假设路段行驶时间只和该路段流量有关,路口的信控延误、排队溢出、转向受阻这些都没建模。如果路网里信控交叉口占比高,阻抗函数除了BPR还要叠加路口延误项,否则分配出来的流量会明显偏向主干路——因为次干路在模型里太“好走”了。

3.2 Frank-Wolfe算法:UE问题的最小可复现求解骨架

Beckmann变换把UE变成一个凸规划,但实际求解用的不是通用优化器,而是Frank-Wolfe算法(简称FW)。FW的核心思路:在每次迭代中,用当前流量处的一阶近似线性化目标函数,求一个“全有全无”分配方向,然后在这个方向和当前解之间做一维搜索,更新流量。

下面给一个最小可复现的FW求解骨架,用纯Python手写核心迭代部分,不依赖交通专用库。路网用一个简单两路段平行网络演示。

import numpy as np # 两条平行路段,连接同一个OD对 # 路段1:自由流时间20分钟,通行能力2000 pcu/h # 路段2:自由流时间15分钟,通行能力1500 pcu/h t0 = np.array([20.0, 15.0]) cap = np.array([2000.0, 1500.0]) alpha = np.array([0.15, 0.15]) beta = np.array([4.0, 4.0]) total_demand = 3000.0 # 总OD需求量 pcu/h # BPR阻抗函数 def travel_time(flow): return t0 * (1 + alpha * (flow / cap) ** beta) def total_cost_gradient(flow): # Beckmann目标函数的梯度,即路段时间函数值 return travel_time(flow) # 全有全无分配:把全部需求放到当前最短路径上 def all_or_nothing(tt): shortest = np.argmin(tt) x = np.zeros_like(tt) x[shortest] = total_demand return x # FW迭代 x = all_or_nothing(travel_time(np.zeros(2))) for k in range(100): tt = travel_time(x) # 求下降方向:辅助流量点减当前流量 y = all_or_nothing(tt) d = y - x # 一维搜索求最优步长lambda # 用二分法求解 dZ(x + lambda*d)/dlambda = 0 lo, hi = 0.0, 1.0 for _ in range(60): mid = (lo + hi) / 2 grad_mid = np.sum(d * total_cost_gradient(x + mid * d)) if grad_mid > 0: hi = mid else: lo = mid lam = (lo + hi) / 2 x_new = x + lam * d if np.max(np.abs(x_new - x)) < 1e-6: x = x_new break x = x_new tt_final = travel_time(x) print("均衡流量:", x) print("均衡时间:", tt_final)

这段代码的逻辑分四步:第一步用自由流时间做一次全有全无分配,得到初始流量;第二步按当前流量计算各路段时间,找到当前最短路径;第三步用二分搜索在下降方向上找最优步长;第四步更新流量,直到连续两次流量的最大变化小于阈值。

参数说明:t0和cap是每条路段的固有属性,alpha和beta是BPR标定参数,二分的迭代次数60次足够收敛,流量收敛阈值1e-6针对这个只有两条路的算例已经非常严格。真实路网里,路段数量过万后,一维搜索用精确二分代价很高,工程实现通常用黄金分割或者直接固定步长序列(如MSA方法),收敛判据也放宽到相对Gap而非绝对流量差。

3.3 收敛判据:看Gap还是看流量变化,结果可能完全不一样

教科书里FW的标准收敛判据是相对Gap(Relative Gap),定义是(当前目标函数值 - 线性化下界)/ 当前目标函数值。但工程实践中,只盯Gap有个大坑:FW算法的迭代轨迹呈之字形震荡,Gap在后期的下降速度非常慢,经常出现Gap已经很小、但路段流量还在明显摆动的情况。

我的习惯是双轨判断:既看相对Gap是否降到阈值(通常取1e-4到1e-6),也看路段流量的最大绝对变化量是否连续多次低于阈值。后者更直接地反映“分配结果是否已经稳定”,毕竟最终交给下游做V/C比评估的是流量,不是Gap值。

此外要留心FW的一个已知短板——对初始解敏感。初始流量不同,FW可能收敛到同一个均衡解,但收敛路径差别很大,在迭代预算有限时会得到不同的截断结果。做方案对比时,所有情景必须用同样的初始解和同样的迭代次数,否则不同方案之间的流量差异可能来自算法噪声而非路网方案本身,这个错误在项目里见过不止一次。

4. 落到工程:路网数据准备、工具选型与结果判读

4.1 三类输入数据:拓扑、OD、阻抗参数一个都不能糊弄

跑UE分配之前,数据准备环节决定了结果质量的80%。所需输入分三类:路网拓扑、OD矩阵、阻抗参数。

路网拓扑的核心是路段和节点表。路段表至少包含起终点节点编号、长度、自由流速度、车道数、通行能力;节点表包含节点编号和坐标。最容易出问题的是拓扑连通性——路网里隐藏的断头路、跨线桥缺连接、单向匝道方向反了,这些在可视化时未必看得出来,但分配结果会一片混乱。我的检查习惯是用一个程序扫全网的“可达性矩阵”,确认每个OD对之间都能找到路径,再从N个随机OD对里抽检最短路径合理性。

OD矩阵是另一个大头。UE模型把OD当作固定输入,但实际工程里OD往往来自四阶段法的出行生成和分布预测,本身就有误差。更麻烦的是,OD矩阵和路网阻抗存在内部依赖关系——出行分布阶段用了路网走行时间,走行时间又取决于分配流量,静态UE模型把这个循环切断了。处理方式通常是做OD矩阵校核(OD Estimation),用路段实测流量反推OD,但这已经属于更进阶的优化问题,不属于UE分配本身。

阻抗参数这块,之前表格里给了不同道路等级的参考区间。实地标定时最靠谱的方法是做跟车调查或浮动车数据回归,把实测行程时间对流量做拟合,反推alpha和beta,而不是抄手册值。

4.2 工具选型:商业平台、开源库和自研代码怎么选

做UE分配的工具有四类,特征差异很大:

工具类型代表适用场景主要短板
商业交通规划软件TransCAD、EMME、Visum、Cube城市综合交通模型、政府项目交付授权贵、黑盒求解器难排查
开源交通库AequilibraE、SuMMA科研、中小规模路网、预算受限项目文档不全,前沿功能更新慢
自研脚本Python + NumPy 实现FW/MSA教学、算法调试、批量敏感性分析大规模路网性能不够
微观仿真内置分配SUMO 的动态用户均衡动态分配、信号协调场景标定成本高,慢

商业平台里EMME的均衡求解器稳定性最好,适合大路网多情景快速对比;TransCAD在OD校核和公交分配上集成度高,国内交付项目用得多。但如果只是做一次学术分析或小范围路网评估,用AequilibraE配合QGIS就足够,没必要上商业平台。自研FW只建议用在理解算法和小算例验证,城市级路网用纯Python实现会很吃力。

我提醒一句:商业软件输出UE结果只需要点一个按钮,看起来越简单的东西越容易让人放弃思考。关键诊断信息(收敛Gap曲线、迭代次数、是否有路段流量超容量)经常藏在输出报告里不看,等结果不对劲才回头查,血泪经验。

4.3 结果判读:V/C比、路段流量偏差和模型校核的标准

UE分配结果落地到工程判断,最常见的是看V/C比(流量容量比)识别拥堵路段,以及评估改善方案前后的流量变化。但这里有个容易踩的认知陷阱:分配得到的路段流量是模型均衡流量,不是真实流量,它和实测值的偏差需要经过校核流程去理解和修正,直接拿模型流量和现场计数比大小没有意义。

校核通常分三档:路段流量级校核(GEH统计量小于5可接受)、走廊级校核(整条走廊的流量总量偏差控制在15%以内)、全网级校核(总车公里数偏差控制在10%以内)。GEH是交通模型校核里的标准统计量,公式是sqrt(2×(模拟-实测)²/(模拟+实测)),GEH大于10的路段意味着模型和现实存在显著偏差,需要检查阻抗参数或OD。

实操中,我一般调参的顺序是:先查拓扑错误;再调BPR的alpha和beta;还不行就怀疑OD矩阵,做OD反推或重新抽取样本调查;最后才是考虑模型结构升级。很多人一上来就调OD,其实路网里一根连接线反向就足以让两条路的流量互换,这种低级错误比OD误差的占比大得多。

5. 避坑排查:城市交通网络平衡分析里的五个高频翻车点

5.1 现象:UE迭代几十轮后相对Gap卡在1e-3附近震荡,怎么都降不下去

原因:FW算法在高维路网上收敛速度慢是出名的,它的下降方向是可行域的顶点方向,搜索路径呈锯齿状,后期步长越来越小,Gap下降极其缓慢。路网规模上万条路段时,FW要降到1e-6的Gap可能需要上千次迭代,大部分项目根本等不起。

解决:优先换算法而不是硬熬迭代次数。常见做法是加一个聚合优化步骤(如PARTAN方向加速),或者直接切换到基于梯度的算法(如梯度投影法GP、交替方向法ADMM)。商业软件EMME内置的求解器已经很少用纯FW了。如果只能留FW,把收敛标准放宽到相对Gap=1e-3,同时用路段流量变化作为辅助判据,别死磕数学收敛。

5.2 现象:给同一个路网换一组差不多的初始流量,最终分配结果差异明显

原因:从理论上看,当阻抗函数严格单调且路网连通时,UE解唯一。实际不唯一的原因是机器精度和迭代截断共同造成的“近似解不唯一”,以及阻抗函数在低流量段过于平缓导致目标函数近似平坦,FW在这些区域里前后迭代的流量差别微小但都离真正均衡点很远。

解决:检查是否存在阻抗函数参数异常的路段(比如alpha=0导致时间恒定不随流量变化),修正后再跑;同时固定所有方案对比的统一初始解。给路网中所有路段赋予一个极小的基础流量能避免零流量路段在全有全无分配时被异常选中,这个trick在新路网调试期特别实用。

5.3 现象:分配结果里次干路的流量明显偏大,和实地观察完全相反

原因:阻抗函数没考虑交叉口延误。纯BPR函数只计算路段行驶时间,而城市次干路的通行瓶颈往往在信号交叉口,一个周期延误几十秒,对路径选择的影响远大于路段行驶本身。模型里次干路速度看起来比实际快,流量自然被派过去了。

解决:在城市路网里给阻抗函数叠加节点延误项。简化做法是把路口进口道的信控延误折算成等效路段时间,拼接到路段时间上再参与分配。进阶做法是用排队论模型(如HCM 2010的延误公式)在迭代中动态计算路口延误。如果项目用的商业软件支持节点阻抗定义,务必开启。

5.4 现象:模型校核时发现部分路段模拟流量和实测流量系统性偏差超过50%,但拓扑和参数查不出问题

原因:OD矩阵本身有错。固定OD假设下,如果某个小区的发生吸引量偏差大,误差会沿着最短路径传播到多条关联路段,形成几条路同时超差的现象。四阶段法前两步的误差全部会在分配阶段被放大,这不是求解器能解决的。

解决:先看偏差路段的空间分布是否聚集在某几个OD影响区,若是,说明OD矩阵局部失真。先用路段实测流量做OD矩阵校核,有条件就补充调查数据重新估计OD。如果时间不够,做敏感性分析:把可疑OD按±20%扰动后重新分配,评估流量变化范围是否影响最终工程结论,这是最稳妥的项目交付策略。

5.5 现象:同一个路网,用AequilibraE和用TransCAD分配,结果差异大到不敢置信

原因:不同软件对收敛标准、初始流量、阻抗函数形式的默认设置不同。AequilibraE默认可能只跑100次迭代就停,TransCAD的收敛阈值是相对Gap=1e-6,这两个截断点对应的路段流量差异在拥堵路网上可以超过10%。此外,BPR函数的变体形式(是否含路口延误项)在不同软件里默认设置也不一样,表面看着同一个模型,底层差异很大。

解决:跨软件对比时,先统一三个设置:阻抗函数形式及参数、收敛判据、最大迭代次数。然后选一个中等规模子路网做基准测试,逐路段对比流量差异。如果差异集中在少数路段,检查这些路段的通行能力和自由流速度输入是否一致。别盲目信任任何软件的默认值,输入同源性比对才是基础。

6. 从静态均衡往前一步:用弹性需求与多模式交互检验模型边界

静态UE模型的假设基础是固定OD,出行需求不随路网拥堵程度改变。这个假设在中长期规划里说得过去,但用来评估短期的收费政策或严重拥堵改善方案时,固定需求会高估方案效果——因为现实中有一部分出行会因为拥堵加剧而取消、改时或换目的地。想验证模型在这个场景下是否可用,最简单的升级是弹性需求模型。把固定OD换成需求函数D(μ),即需求随OD对最小出行时间μ递减,均衡条件从“流量守恒”变成“需求与供给双向反馈”。

更实际的做法是多模式分配。城市路网里私家车、公交、地铁共享一个物理空间,但各自阻抗差异很大。多模式UE模型把不同方式放在同一个广义成本框架里(时间+票价+换乘惩罚),让出行者在方式之间也遵循均衡选择。判断一个UE结果是够做政策评估,就看你敢不敢把收费方案的流量结果拿去做公交客流预测,如果发现二者的联动关系在模型里没有任何反馈通道,说明模型能力已经到边界了。

我自己的习惯是每做完一个UE模型,先自问三个问题:OD是固定的吗?阻抗是只依赖自身路段流量吗?所有出行者都完全掌握路网状态吗?若任何一个答案是“明知不成立但接受假设”,那模型结论只能说“在这一组假设前提下成立”。在项目报告中把这段话写清楚,比堆十个拟合优度检验都更有说服力。UE模型真正的价值在于提供一个稳定且可解释的参照系,方案之间的相对比较远比单点的绝对流量可信,这也是线和面两种评估场景永远用得到它的原因。

另一点是网络加载(Network Loading)与路径成本的交互:大路网上路径旅行时间的计算需要把路段时间相加,这个过程看似简单,实际在收费方案评估里很容易漏掉收费对广义成本的影响。把收费金额折算成时间价值,需要先调查出行者时间价值分布,不能拍一个数就输进模型。差值类方案对比里,收费折算权重不一致会让方案的排序反转,这种玄学问题只能靠敏感性分析提前排查。

做交通模型这么多年,最大的教训是,参数设得越随意,结果看起来越精确,反而越危险。希望这些经验帮你在跑下一次UE分配时少走几段弯路。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询