案例 055 跨江大桥堵了
案例 055 跨江大桥堵了
摘要:珠江把配送区切成北岸商家区与南岸客户区,24 单跨江订单只能靠一座大桥、一条绕行环线或一次水巴接驳完成。桥面通行时间随过桥单量二次上升(自由流 6.0 min,24 单全过桥时 23.3 min),于是"多送一单过桥"会给所有过桥订单加时间——这是典型的拥堵外部性。本文把每单的三选一指派写成 0-1 规划,用 \(s_{i}\ge t^{B}(r)-\sigma_{i}\) 线性化迟到,并在北岸 780、南岸 80 骑手分钟的运力约束下求解;由于 \(t^{B}\) 只依赖整数流量 \(r\),对 \(r\in\{0,\dots,24\}\) 做参数枚举,共 1726 个子问题、其中 1475 个可行且全部证到最优。结果:全部过桥总迟到 201.3 min、运力越界 25 min;全部绕行 122.6 min;按单决策只让 15 单(62.5%)过桥、9 单改派南岸骑手,总迟到压到 2.5 min,准时 21/24 单。最优分流比例不是拍出来的:它出现在"再塞一单过桥的边际延误"刚好等于"改派一单的固定代价"那一点。
关键词:跨江配送;拥堵外部性;绕行;骑手改派;参数化整数规划;时效重算
1 问题提出
1.1 问题是什么
午高峰 12:00—12:40,24 单订单全部从北岸商家取货、送到南岸客户,必须过一次江。三条通道的账完全不同:大桥自由流 6.0 min,但桥面只有一条非机动车道,过桥单量 \(r\) 越多越堵,\(t^{B}(r)=6.0\kappa+0.030r^{2}\);绕行环线多走 7.2 km、按 21.6 km/h 折 20.0 min,但完全不堵;水巴接驳由南岸骑手在码头接货,过江 15 min 含候船,代价是要占南岸的运力。
订单按余量分层见表 1:出餐完成时刻 \(p_{i}\) 在 7—13 min 之间,取餐到桥头 \(a_{i}\) 与桥头到客户 \(b_{i}\) 合计 8.8—11.8 min,承诺 35 min 送达,于是留给"过江段"的余量 \(\sigma_{i}=\bar{T}-p_{i}-a_{i}-b_{i}\) 只有 11.0—17.7 min。过江段时间一旦超过 \(\sigma_{i}\),这一单就开始迟到。
表 1 按过江段余量分层的订单构成(方式为最优方案)
| 余量区间 / min | 单量 | 平均出餐 / min | 平均在途 / min | 平均余量 / min | 过桥/改派/绕行 |
|---|---|---|---|---|---|
| \(\sigma_{i}\in[11,13)\) | 4 | 12.0 | 10.9 | 12.2 | 4/0/0 |
| \(\sigma_{i}\in[13,15)\) | 9 | 10.8 | 10.2 | 14.0 | 9/0/0 |
| \(\sigma_{i}\in[15,18)\) | 11 | 8.3 | 10.1 | 16.6 | 2/9/0 |
余量小于 13 min 的 4 单,即使桥面只有 12.8 min 也已经贴到承诺线,几乎没有腾挪余地;余量 15 min 以上的 11 单留足了缓冲,正是替桥面分流的第一批候选。分层表已经把答案摆在桌面上:能忍桥的忍桥,忍不了的分流。
表 2 三种配送方式的时间与运力占用
| 方式 | 过江时间 / min | 北岸占用 / min | 南岸占用 / min | 适用条件 |
|---|---|---|---|---|
| 过桥 \(B\) | 12.8(本案) | \(a_{i}+b_{i}+t^{B}(r)\) | 0 | 桥面可通行 |
| 绕行 \(D\) | 20.0 | \(a_{i}+b_{i}+T_{D}\) | 0 | 桥面可通行 |
| 改派 \(H\) | 15.0 | \(a_{i}+\delta\) | \(b_{i}+\delta\) | 需南岸骑手 |
1.2 为什么要优化
第一,桥越堵越要多派人过桥,是典型的负反馈。照常过桥时 24 单全挤桥面,\(t^{B}\) 被自己抬到 23.3 min,总迟到 201.3 min,且北岸骑手分钟 805 已经超过 780 的运力上限——这不是"慢一点",是排不出来。
第二,绕行是保底而不是优选。全部绕行把 \(t^{B}\) 的拥堵彻底绕开,总迟到降到 122.6 min,但每单多背 20.0 min 的固定代价,24 单多烧 726 骑手分钟,准时率仍然是 0/24。
第三,对岸骑手是第三种资源。南岸只有 80 骑手分钟能用于接驳,一单只占 \(b_{i}+\delta\),却能省下整段过江时间;把它用在哪里、用几单,直接决定分流比例。
1.3 Gurobi 如何求解
引入三组 0-1 变量 \(x_{i,B},x_{i,D},x_{i,H}\),恰好选一种方式(式 3);迟到 \(s_{i}\) 用大 M 线性化(式 4),大 M 取 60(候选时间的量级,不用 \(10^{6}\));桥面流量 \(r=\sum_i x_{i,B}\) 是整数,\(t^{B}(r)\) 与 \(r\,t^{B}(r)\) 只在 \(r\) 取整时才有意义,于是把 \(r\) 当参数、对 0—24 逐个枚举(式 7),每个子问题都是纯线性 0-1 规划。1726 次子问题求解里 1475 个可行,平均每次 0.01 s,总墙钟 13 s。
2 数学模型
2.1 符号说明
\(I\) 为跨江订单集合(\(|I|=24\));\(x_{i,B},x_{i,D},x_{i,H}\) 为三种方式的 0-1 选择;\(r\) 为过桥单量;\(t^{B}(r)\) 为桥面通行时间;\(T_{D}\) 为绕行过江时间(20.0 min);\(T_{H}\) 为水巴接驳过江时间(15 min);\(\sigma_{i}\) 为过江段余量;\(s_{i}\) 为迟到分钟;\(a_{i},b_{i}\) 为两端的取送时间;\(\delta\) 为接力交接时间(3 min);\(C_{A},C_{B}\) 为两岸可用骑手分钟;\(M\) 为大 M;\(\varepsilon\) 为次目标权重。
2.2 目标函数
主目标是总迟到分钟,次目标是骑手分钟消耗,权重 \(\varepsilon=5\times10^{-4}\):一骑手分钟只值 0.0005 迟到分钟,等价于"先保时效、再省运力"的字典序。写成一个目标而不是两阶段,是因为外层要对 25 个 \(r\) 各解一次,两阶段会把求解次数翻倍。
2.3 约束条件
每单必须选且只选一种方式。三种方式的分工是:\(B\) 走桥、\(D\) 走环线、\(H\) 在北岸码头交给南岸骑手。
迟到按所选方式的过江时间与余量之差计算,未选中的方式用 \(M(1-x)\) 关掉;\(s_{i}\ge 0\) 保证"早到"不计负迟到。
北岸骑手分钟:过桥与绕行的整段在途都要占用北岸骑手,改派只占用取餐到码头的一段 \(a_{i}+\delta\);桥面拥堵时间 \(r\,t^{B}(r)\) 是"每单都变慢"的总代价,必须整体计入,否则模型会忽略自己造成的拥堵。
南岸骑手分钟只被改派占用,\(b_{i}+\delta\) 是码头到客户加交接;\(\sigma_{i}\) 的定义把承诺、出餐、两端在途一次性折成"过江段还剩多少余量"。
外层对整数流量 \(r\) 枚举:\(\Phi(r)\) 是固定 \(r\) 后的线性子问题,\(Z^{\star}\) 是 25 个子问题的最小值。\(\Phi(r)\) 关于 \(r\) 不是凸的(过桥边际延误递增、但改派受南岸运力上限约束),枚举比梯度类方法可靠。
2.4 规模与性质
每个子问题 24 组 0-1 变量(72 个)、24 个连续迟到变量、约 100 条约束,是带容量约束的多选指派问题,LP 松弛已经很紧,单次求解在 0.01 s 量级。真正的难点不在规模,而在拥堵的自指性:\(t^{B}\) 依赖决策者的集体行为,把 \(r\) 提出来做参数,才让它保持线性。
3 Gurobi 求解实现
3.1 建模要点
固定 \(r\) 后桥面时间变成常数,所有约束都是线性的,这是本案例最关键的一步:
for r in range(N + 1): # 桥面流量只有 25 种可能
tt = 6.0 * kappa + 0.030 * r * r # 拥堵时间成为常数
m = gp.Model(); xb = m.addVars(N, vtype=GRB.BINARY)
m.addConstr(gp.quicksum(xb[i] for i in range(N)) == r)
m.addConstrs((s[i] >= tt - SL[i] - 60 * (1 - xb[i]) for i in range(N)))
m.addConstr(gp.quicksum(xb[i]*(a[i]+tt+b[i]) ...) <= CAPA)
MIPGap 设 1e-9、TimeLimit 2 s;实际上每个子问题都在 0.01 s 内证到最优,TimeLimit 从未触发。若改用 PWL 表达 \(t^{B}(r)\),\(\kappa=2.5\) 时 LP 松弛明显变弱,8 s 都收不满 gap——这是本案例放弃 PWL 的直接原因。
3.2 求解结果
表 3 四种情景的时效与运力
| 情景 | 过桥 / 单 | 改派 / 单 | 总迟到 / min | 准时 / 单 | 骑手分钟 / min |
|---|---|---|---|---|---|
| 照常过桥 | 24 | 0 | 201.3 | 0 | 805 |
| 全部绕行 | 0 | 0 | 122.6 | 0 | 726 |
| 按单决策 | 15 | 9 | 2.5 | 21 | 491 |
| 封路重算 | 0 | 9 | 77.6 | 0 | 600 |
按单决策给出 \(r^{\star}=15\)、\(t^{B}=12.8\) min、9 单改派,总迟到 2.5 min,北岸 415 + 南岸 76 = 491 骑手分钟。照常过桥要 805 骑手分钟,比运力多 25;全部绕行 726;封路时只能 9 单改派、其余绕行,总迟到 77.6 min。
4 结果分析

图 1 跨江路网结构:大桥、绕行环线与水巴接驳三条通道
4.1 路网结构 图 1 把三条通道画在同一张示意图上:北岸六个商家、南岸六个客户,中间是可拥堵的大桥、可接驳的水巴和向西绕出的环线。大桥是唯一"越用越慢"的通道,环线是唯一"用多少都不慢、但每单固定贵 20.0 min"的通道,水巴是唯一"不占北岸过江时间、但要占南岸人力"的通道——三条通道的稀缺资源各不相同,这正是需要按单决策而不是按方案决策的原因。

图 2 逐单承诺余量与基础在途:气泡为订单金额,颜色为最优方式
4.2 逐单余量 图 2 横轴是两端的取送时间 \(a_{i}+b_{i}\),纵轴是过江段余量 \(\sigma_{i}\),气泡大小是订单金额,颜色是最优方式。三条水平线分别是过桥 12.8、改派 15、绕行 20.0 min:点落在某条线之上就说明那种方式对这一单不迟到。余量低于 15 min 的单只能靠"哪条通道更快"定方式;余量高于 15 min、三种方式都不迟到的单,颜色由次目标(骑手分钟)决定——改派两岸各占 \(a_{i}+\delta\)、\(b_{i}+\delta\),合计 16.2 min,比过桥的 23.0 min 少。

图 3 四种情景的总迟到与准时率
4.3 四情景对比 图 3 是核心对比。照常过桥总迟到 201.3 min、准时 0/24;全部绕行 122.6 min、准时 0/24;按单决策 2.5 min、准时 21/24;封路重算 77.6 min、准时 0/24。从"全过桥"到"按单决策",迟到少了 199 min,靠的不是多跑路,而是把 9 单从桥上拿下来——桥面少 9 单,剩下的每一单都快了 23.3−12.8 = 10.5 min。

图 4 三种方案的累计送达曲线与承诺时刻
4.4 累计送达 图 4 是累计送达曲线,竖线是承诺 35 min。按单决策的曲线在 35 min 之前就爬完了 21 单,尾巴只剩几单;全部绕行的曲线整体右移约 20.0 min,35 min 时一单都没送出;照常过桥最差,前 35 min 几乎没动——因为桥面被自己堵住了。曲线的斜率就是"每小时能送几单",三条曲线的差距全部产生在 35 min 这条竖线的左侧。

图 5 拥堵倍数对总迟到与最优过桥比例的影响(三条绕行距离)
4.5 主灵敏度:拥堵倍数 图 5 左轴是总迟到,右轴是最优过桥比例,三条实线对应绕行 5.4, 7.2, 9.0 km。\(\kappa\) 从 1.00 涨到 2.50,总迟到从 2.5 涨到 52.9 min,过桥单量从 15 单掉到 7 单。逐点结果见表 4。
表 4 拥堵倍数扫描(绕行 7.2 km)
| 拥堵倍数 \(\kappa\) | 过桥 / 单 | 绕行 / 单 | 改派 / 单 | 总迟到 / min | 准时 / 单 |
|---|---|---|---|---|---|
| 1.00 | 15 | 0 | 9 | 2.5 | 21 |
| 1.25 | 13 | 2 | 9 | 6.9 | 20 |
| 1.50 | 12 | 3 | 9 | 12.9 | 14 |
| 1.75 | 10 | 5 | 9 | 20.4 | 10 |
| 2.00 | 9 | 6 | 9 | 31.5 | 5 |
| 2.25 | 9 | 6 | 9 | 41.4 | 2 |
| 2.50 | 7 | 8 | 9 | 52.9 | 0 |
桥越慢,模型越早把单子往环线和码头赶:过桥比例从 62.5% 一路降到 29%。绕行越短这条下坡越平——绕行 5.4 km 时 \(\kappa\) 每升 0.25 倍只多 3.4 min,绕行 9.0 km 时要多 13.3 min。

图 6 拥堵倍数 × 绕行距离 的总迟到热图
4.6 二维:拥堵 × 绕行距离 图 6 是 4×5 热图,行是 \(\kappa\)、列是绕行距离,格内是总迟到。最轻的一角 0.1 min,最重的一角 82.5 min(2.5 倍 / 9.0 km)。\(\kappa=1.0\) 那一行几乎是一条平线(0—3 min),而 \(\kappa=2.5\) 那一行从 20 一路涨到 83 min——桥顺畅时环线再短也没人用,绕行距离是个闲参数;桥堵起来,绕行距离立刻变成最贵的那一格。热图的"下冷上热、左浅右深"就是这个意思。

图 7 南岸接驳运力对改派单量与总迟到的影响
4.7 第三维:南岸运力 图 7 横轴是南岸可用骑手分钟,左轴总迟到、右轴改派单量。运力从 40 加到 160,改派单量从 5 单涨到 11 单,总迟到从 14.1 降到 0.1 min。运力过 100 骑手分钟后曲线压平:总迟到已经接近 0,再多的对岸骑手也无单可救——此时瓶颈不在南岸人手,而在桥面把剩下 15 单压在同一段 12.8 min 上。加人救不了桥,这是本案例最反直觉的一条。

图 8 改派单量—总迟到 帕累托前沿与南岸运力越界区
4.8 帕累托前沿 图 8 横轴是改派单量(对岸协作成本的代理),纵轴是总迟到,点线是把改派单量固定为 \(k=0,1,\dots,9\) 逐点求解得到的十条"给定分流"最优解。前沿从(9 单、2.5 min)走到(0 单、30.8 min):少改派 9 单,迟到多 28.3 min,平均一单 3.1 min。 右侧灰带是南岸 80 骑手分钟的越界区(超过 9 单就排不出骑手),下方灰带是迟到小于 0 的不可行区。照常过桥(0 改派、201.3 min,已超出纵轴)与全部绕行(三角、0 改派、122.6 min)都落在同一竖线上却高出一大截——在"零改派"这个横坐标上,前沿只值 30.8 min,它们分别贵出 170 与 92 min,说明差的不只是用不用对岸骑手,还有过桥单量本身。

图 9 四种情景送达时长的累计分布
4.9 时长分布 图 9 是四种情景送达时长的累计分布。按单决策的曲线最陡,35 min 处累计概率已达 88%;封路曲线的中位送达比按单决策晚 4.3 min,35 min 处只有 0%;照常过桥的曲线最长尾,最慢的一单要 47 min。分布的形状比均值更能说明问题:按单决策是把长尾砍掉,不是把整体往前挪。

图 10 按单决策方案下逐单送达时长的四段分解
4.10 时长分解 图 10 把按单决策下每单的送达时长拆成四段:出餐等待、取餐到桥头、过江段、到客户。红色过江段的高度在 12.8(过桥)与 15(改派)之间跳变,9 根更长的红条就是改派的单;浅蓝的出餐等待是刚性成本,横线 35 min 之上的部分就是迟到。注意改派单的红段是 15 min,比过桥的 12.8 min 还长:单看一单是亏的。它们之所以被选中,是因为每挪走一单,桥上剩下的 15 单各快一点,合计赚回的比这一单亏的多——这正是拥堵外部性在逐单层面的样子。
5 结论
- 桥面拥堵是内生的:全部过桥时 \(t^{B}\) 被 24 单自己抬到 23.3 min,总迟到 201.3 min,北岸骑手分钟 805 超出运力 25 min,方案在运力上就不可行。
- 全部绕行把总迟到降到 122.6 min,但每单固定多背 20.0 min、多烧 726 骑手分钟,准时率仍只有 0/24;绕行是封路时的保底,不是通畅时的优选。
- 按单决策的最优分流是 15 单过桥(62.5%)+ 9 单改派 + 0 单绕行,总迟到 2.5 min、准时 21/24,骑手分钟 491,全部落在运力内。
- 分流比例随拥堵单调下降:\(\kappa\) 从 1.00 到 2.50,过桥比例从 62.5% 降到 29%,总迟到从 2.5 涨到 52.9 min;南岸运力从 80 继续加,改派单量在 11 单处封顶,瓶颈重新回到桥上。
- 封路情景下只能 9 单改派、其余绕行,总迟到 77.6 min,比按单决策多 75.0 min——这 75.0 min 就是"桥"这个基础设施的年化价值:它不在任何一单的账上,只在封路那一天一次性结算。
参考文献
[1] Gurobi Optimization LLC. Gurobi Optimizer Reference Manual[Z]. 2024.
[2] Kellerer H, Pferschy U, Pisinger D. Knapsack Problems[M]. Berlin: Springer, 2004.
[3] Martello S, Toth P. Knapsack Problems: Algorithms and Computer Implementations[M]. Chichester: John Wiley & Sons, 1990.
[4] 司守奎, 孙玺菁. 数学建模算法与应用[M]. 3 版. 北京: 国防工业出版社, 2021.

浙公网安备 33010602011771号