案例 021 桥的选择被后续订单绑架:通道与时间窗的耦合
案例 021 桥的选择被后续订单绑架:通道与时间窗的耦合
摘要:选猎德大桥单程能快 2—4 min,但会把 5 单推到时间窗边缘。本文建立「通道选择 + 路径 + 到达时刻」的三层模型,把通道相关弧与内部弧拆开以避免双线性项,用 Gurobi 求最优。结果表明:最优选 广州大桥,纯通行加服务 79.0 min、迟到 9.6 min、总成本 286.7 min;三条桥单独最优为 286.7/327.9/594.6 min,最优通道并非单程最快的桥。送达余量均值仅 4.5 min。
关键词:外卖配送;过江通道;时间窗;耦合排程;Gurobi
1 问题提出
1.1 问题是什么
选了猎德大桥能快 2—4 min,但会把海珠的 5 单全推到时间窗边缘。5 单分布在珠江南岸,硬截止 40—56 min、窗宽 18—18 min;每单服务 3 min。
在三座桥里选一座(隧道禁行),并排定 5 单的送达顺序,使"通行时间 + 迟到罚"最小。
表 1 海珠五单的时间窗
| 订单 | 坐标 /km | 最早 /min | 最晚 /min | 窗宽 /min |
|---|---|---|---|---|
| H1 | (-1.2, -1.6) | 22 | 40 | 18 |
| H2 | (0.4, -2.2) | 26 | 44 | 18 |
| H3 | (1.9, -1.3) | 30 | 48 | 18 |
| H4 | (2.9, -2.4) | 34 | 52 | 18 |
| H5 | (-0.4, -0.9) | 38 | 56 | 18 |
1.2 为什么要优化
- 桥决定"起点":选哪座桥,等于决定进入海珠的第一个落点,后续顺序全被绑架;
- 窗与桥耦合:单看桥最快的是猎德,但它落点偏东,西边的 H1、H2 会被拖到截止线外;
- 迟到要折成钱:罚系数 20 min/min,即迟到 1 min 等于多骑 1 min 的 20 倍。
1.3 Gurobi 如何求解
三层决策:通道 \(x_k\)、弧 \(y_{ij}\)、到达时刻 \(t_j\)。通道只影响"出发点 ↔ 海珠"的弧,因此把时间写成"通道相关的接驳 + 与通道无关的内部弧":
迟到用线性化:\(t_j\le D_j+\ell_j,\ \ell_j\ge 0\)。大 M 取 180(最大可能时间跨度),模型 46 个变量、55 条约束,0.04 s 求得最优。
2 数学模型
2.1 符号说明
\(V=\{0,1,\dots,5\}\),0 为天河出发点;\(K=\{1,2,3\}\) 为可用通道(隧道 \(x_4=0\));\(a_{jk}\) 为"出发点到客户 \(j\) 经通道 \(k\)"的时间,\(r_{ik}\) 为回程;\(d_{ij}\) 为海珠内部的两点时间;\(s_i=3\) min 为服务时间;\([A_j,D_j]\) 为时间窗;\(P=20\) 为迟到罚系数;\(M=180\)。
2.2 目标函数
2.3 约束条件
通道唯一、隧道禁行:
路径(每点一进一出):
时刻递推(大 M 松弛未走的弧):
时间窗与迟到:
2.4 规模与性质
6 个节点、30 条弧、4 个通道变量,约束 55 条。规模不大,但"通道 × 顺序"是双层的组合结构:4 种桥 × 5! 种顺序 = 480 种,模型在 0.04 s 内枚举完毕。
3 Gurobi 求解实现
3.1 建模要点
m.addConstr(x.sum() == 1); m.addConstr(x[3] == 0) # 通道唯一、隧道禁行
for i in V: # 一进一出
m.addConstr(y.sum(i, "*") == 1); m.addConstr(y.sum("*", i) == 1)
m.addConstr(t[0] == 0)
for j in customers: # 出发弧依赖通道
m.addConstr(t[j] >= t[0] + quicksum(a[j][k] * x[k] for k in range(3))
- 180 * (1 - y[0, j]))
一条实现细节:大 M 取 180(最大可能时间跨度),不要用 \(10^6\)。\(t\) 的上界只有 180,取 \(M=180\) 已足够松弛;大 M 越小,LP 松弛越紧,分支定界少走一半节点。
3.2 求解结果
表 2 最优方案
| 指标 | 数值 |
|---|---|
| 选中通道 | 广州大桥 |
| 送达顺序 | 出发 → H1 → H2 → H3 → H4 → H5 |
| 纯通行 + 服务 | 79.0 min |
| 迟到单数 / 分钟 | 1 单 / 9.6 min |
| 迟到罚 | 192.6 min 当量 |
| 总成本 | 286.7 min |
各通道单独最优的成本为广州大桥 286.7、海印 327.9、猎德 594.6 min;模型选的 广州大桥 与"单程最快"的桥不同——桥的选择被后续 5 单的时间窗绑架了。
4 结果分析
4.1 时间窗与到达时刻
图 1 里每条泳道是一单:浅色条是允许的时间窗,蓝块是"到达 + 服务",红块是迟到。5 单里有 1 单迟到,最紧的是 H5(余量 -9.6 min)。排程明显是"自东向西"倒着排的——东边的截止早,先送。

图 1 五单的到达时刻与时间窗
图 2 把窗宽与截止并列:窗宽只有 18—18 min,而截止时刻从 40 一路排到 56 min——截止时刻是递增的,但窗宽并不递增,所以不能简单地"按截止排序就完事"。

图 2 各单的时间窗宽度与最晚送达时刻
4.2 通道对比与累计
图 3 把三条桥各自重解一遍:广州大桥 286.7、海印 327.9、猎德 594.6 min,全模型最优 286.7 min。最优通道不是"单程最快"的那座——猎德的单程最快,但它把西边的单推到截止线外,罚款吃掉了时间优势。

图 3 三条通道各自最优的成本对比
图 4 用阶梯画出送达进度:5 单在 66 min 内送完,最后两单几乎同时在截止线附近完成。阶梯越到后面越平——因为后两单的窗挨得近,只能排队等。

图 4 最优排程的累计送达进度
4.3 罚系数与出发时刻
图 5 扫迟到罚 \(P\):\(P=0\) 时迟到 53.0 min、总成本 83.6;\(P\) 升到 10 时迟到压到 9.6 min。曲线在 $P\approx$20 之后基本走平——说明此时再加重罚款也压不出更多时间,只能改桥。

图 5 总成本与迟到分钟随罚系数的变化
图 6 同时扫罚系数与出发时刻:左下(罚小、早出发)最浅,右上最深。等值带向右上方倾斜——"早出发 3 min"约等于"罚系数加 2",两者可以互相折算。

图 6 总成本关于罚系数与出发偏移的热图
4.4 出发时刻、前沿与松弛
图 7 单看出发偏移:晚出发 0—18 min,迟到从 9.6 min 涨到 1.9 min,选中的通道序号也从 1 变到 2。晚出发时模型会改走更靠东的桥,用更短的接驳抢回几分钟。

图 7 迟到分钟与选中通道随出发偏移的变化
图 8 把各罚系数下的解画在"纯通行时间—迟到"平面上:想要零迟到,得多花 0.0 min 在路上;想快,就得吃迟到罚。本案的解落在前沿的拐点上。

图 8 通行时间—迟到分钟的前沿
图 9 是 5 单的送达余量分布:均值 4.5 min,最紧 -9.6 min。余量集中在 0—5 min 的窄带里,任何一次出餐延迟都会立刻转成迟到。

图 9 送达余量的分布
图 10 把每单的时间拆成"骑行 + 服务":骑行占比 77%,服务只占 23%。在海珠内部挪一单的成本主要是骑行,所以顺序优化的收益都在骑行上。

图 10 各单的骑行与服务时间构成
5 结论
- 5 单、三条桥下最优选 广州大桥,纯通行加服务 79.0 min、迟到 9.6 min(1 单),总成本 286.7 min。
- 三条桥单独最优分别是 286.7、327.9、594.6 min,最优通道不等于单程最快的桥——时间窗会把它绑架。
- 罚系数 \(P\) 超过约 20 后迟到压不动了,只能靠改桥或早出发;早出发 3 min 约等于罚系数加 2。
- 送达余量均值 4.5 min、最紧 -9.6 min,全在 0—5 min 的窄带;任何出餐延迟都会直接转成迟到。
- 通道只影响"出发点 ↔ 海珠"的弧,所以把 \(a_{jk}\) 拆成通道相关项、内部弧保持常数,可把 \(x_k\times y_{ij}\) 的双线性彻底避开;大 M 取 180 即可。
参考文献
[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号