案例 020 过江走哪座桥:带限流的多通道指派
案例 020 过江走哪座桥:带限流的多通道指派
摘要:天河送海珠,三条可走非机动车的桥、一条禁行的隧道,20 趟过江且每桥每波限流 8 趟。本文建立 0-1 指派模型,把'接驳 + 桥面 + 出口 + 红绿灯'合成单趟成本,再加入限流约束,用 Gurobi 求得最优分配。结果表明:广州大桥 8 趟、海印 8 趟、猎德 4 趟,总时间 464.8 min;不限流的下限是 462.9 min,限流多花 0.4%。全走单一桥要 512 min 以上且违反限流,混合分配才既快又可行。
关键词:外卖配送;过江通道;指派模型;限流;Gurobi
1 问题提出
1.1 问题是什么
天河送海珠,珠江横在中间。三条能走非机动车的通道——广州大桥(1.2 km 桥面、6 个红绿灯)、海印桥(0.9 km、8 个)、猎德大桥(1.4 km、4 个);珠江隧道禁行非机动车。一批 20 趟过江,起点在天河(y>0.3)、终点在海珠(y<0)。
每趟必须选一座桥;高峰期为安全起见每座桥每波最多放 8 趟。求总通行时间最小的分配。
表 1 三条可用通道
| 通道 | 桥位 /km | 桥面长度 /km | 红绿灯 /个 | 单趟桥面时间 /min |
|---|---|---|---|---|
| 广州大桥 | -1.50 | 1.2 | 6 | 4.00 |
| 海印桥 | 0.60 | 0.9 | 8 | 3.00 |
| 猎德大桥 | 2.40 | 1.4 | 4 | 4.67 |
1.2 为什么要优化
- 绕行差异大:广州大桥在西、猎德在东,起点偏东时走猎德能省 2—3 min,反之亦然;
- 红绿灯折算:每个灯按 0.4 min 计,灯多的桥在短途上反而更慢;
- 限流是硬约束:不限流时"全挤猎德",第 9 趟就得排队。
1.3 Gurobi 如何求解
0-1 指派模型:\(x_{tk}=1\) 表示第 \(t\) 趟走通道 \(k\)。
其中 \(c_{tk}\) 由"接驳 + 桥面 + 出口 + 灯"四段合成:
模型 80 个 0-1 变量、43 条约束,0.003 s 求得最优;再对限流水位 \(N\) 与桥面风速折减 \(\lambda\) 做扫描。
2 数学模型
2.1 符号说明
\(T=\{1,\dots,20\}\) 为行程集,\(K=\{1,2,3\}\) 为可用通道,隧道 \(k=4\) 固定 \(x_{t4}=0\);\(x^o_t,y^o_t\) 为取餐点,\(x^d_t,y^d_t\) 为送达点;\(x_k\) 为桥梁东西向位置,\(L_k\) 为桥面长度,\(n_k\) 为红绿灯数;\(v=18\) km/h,\(\lambda_g=0.4\) min/灯,\(\lambda\) 为桥面风速折减,\(N=8\) 为限流水位。
2.2 目标函数
2.3 约束条件
每趟恰选一座桥、隧道禁行:
限流(每桥每波不超过 \(N\) 趟):
2.4 规模与性质
20×4=80 个 0-1 变量(其中一列固定为 0)、43 条约束。去掉限流后是纯指派问题(LP 即整数),加限流后仍保持全单模结构,Gurobi 在根节点即得整数解。
3 Gurobi 求解实现
3.1 建模要点
for t in range(n):
m.addConstr(x.sum(t, "*") == 1)
m.addConstr(x[t, 3] == 0) # 隧道禁行
for k in range(3):
m.addConstr(x.sum("*", k) <= N) # 每桥限流
一条实现细节:禁行通道要显式建 \(x_{t4}=0\) 而不是从变量表里删掉。保留它可以让"为什么不能走隧道"写进模型(也便于把 \(\lambda\) 之类的参数扫到隧道上做敏感性对比);若删除,模型规模小一点,但解释性差、报错时不好定位。
3.2 求解结果
表 2 最优分配与情景对比
| 方案 | 总通行时间 / min | 广州 / 海印 / 猎德 | 是否满足限流 |
|---|---|---|---|
| 全走广州大桥 | 511.8 | 20/0/0 | 否(20>8) |
| 全走海印桥 | 515.9 | 0/20/0 | 否(20>8) |
| 全走猎德大桥 | 682.6 | 0/0/20 | 否(20>8) |
| 限流下最优 | 464.8 | 8/8/4 | 是 |
不限流时的理论下限是 462.9 min,限流后多花 1.9 min(0.4%)——这就是"排队"的价格。
4 结果分析
4.1 过江结构与分配
图 1 把 20 趟画成从北岸到南岸的连线:西侧的行程走广州大桥(蓝),中部的走海印桥(橙),东侧的走猎德大桥(绿)。三条桥各承担 8、8、4 趟,没有任何一趟跨到对侧去过江——因为横穿一次至少多 2 km。

图 1 过江通道与各趟的选桥结果
图 2 逐趟看时间:柱高是该趟的通行时间,红线是选定通道的序号。第 18 趟最慢(31.9 min),因为它离三座桥都远;而像第 4 趟只要 16.7 min,几乎贴着海印桥。

图 2 逐趟通行时间与选定通道
4.2 情景对比与累计
图 3 把"全走一座桥"与"限流下最优"摆在一起:全走广州大桥 512 min、海印 516 min、猎德 683 min,最优分配 465 min。最优值比最好的单桥方案还低 47 min——把 20 趟按位置分流,比"统一走一座桥"省得更多。

图 3 四种过江策略的总时间对比
图 4 用累计曲线比较"每单独立挑最快"与"限流下的最优":前者在 463 min 收尾,后者要 465 min。两条阶梯的差距不是均匀拉开的,而是在第 14 单附近突然变大——那正是限流开始生效的位置。

图 4 贪心与限流最优的累计时间
4.3 限流与风速的灵敏度
图 5 把每桥限流从 4 加到 14:总时间由 nan min 单调降到 462.9 min,被迫改道的趟数从 nan 降到 0。限流在 \(N<8\) 时明显抬价,$N\ge$8 后曲线走平——再放宽也没人愿意跨江。

图 5 最优总时间与改道趟数随限流上限的变化
图 6 同时扫限流与风速折减:横带随 \(N\) 增大变浅,纵带随风速增大变深,等值线大致是"水平 + 竖直"的网格——两个参数的主效应可分离,没有明显的交互项。

图 6 最优总时间关于限流上限与风速折减的热图
4.4 风速、前沿与分布
图 7 单看风速:\(\lambda\) 从 0 加到 40%,总时间从 464.8 升到 514.6 min,而猎德大桥(桥面最长)的使用次数从 4 单降到 4 单。风越大,桥面越长的桥越吃亏——这就是"长桥在恶劣天气下的惩罚"。

图 7 总时间与猎德大桥使用次数随风速折减的变化
图 8 把各限流水位的解画在"总时间—单桥最大负荷"平面上:\(N\) 越小,点越靠右上(时间长、负荷被压得低);\(N\) 大到一定程度后点全部贴在同一条竖线上。右侧灰色区是不可达的部分——限流的边际收益在 \(N=8\) 之后归零。

图 8 总时间—单桥负荷的方案前沿
图 9 是"改走次优桥"的代价分布:均值 3.7 min、最大 10.9 min。大多数趟改道的代价只有 1—2 min,所以限流带来的额外时间并不多;只有少数"卡在两桥中间"的趟才会被坑。

图 9 改走次优通道的时间代价分布
图 10 把三座桥的承担量与时间贡献并列:广州大桥 8 趟 / 156 min、海印 8 趟 / 193 min、猎德 4 趟 / 116 min。单均时间最省的是海印桥(24.1 min/单),它在三座桥里位置最居中。

图 10 各桥承担的行程数与通行时间
5 结论
- 20 趟过江、每桥限流 8 趟下,最优分配为广州大桥 8 趟、海印桥 8 趟、猎德大桥 4 趟,总时间 464.8 min。
- 不限流的理论下限是 462.9 min,限流多花 1.9 min(0.4%);这就是排队的价格。
- 全走单一桥要 512—683 min,比混合分配差 47 min 以上,且直接违反限流。
- 限流在 \(N<8\) 时明显抬价,$N\ge$8 后归零;桥面风速折减每加 10%,总时间约增 2.2%。
- 隧道应显式建 \(x_{t4}=0\) 而不是删变量,既保留解释性,也方便把参数扫描到禁行通道上做对比。
参考文献
[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.
复现方式:python batch.py;数据与结果见同目录 .csv / .json,图见 figs/

浙公网安备 33010602011771号