案例 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\ge t_0+\sum_{k}a_{jk}x_k-M(1-y_{0j}),\qquad t_j\ge t_i+s_i+d_{ij}-M(1-y_{ij}) \tag{1} \]

迟到用线性化:\(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 目标函数

\[\min\ Z=\sum_{(i,j)\in A}\tau_{ij}y_{ij}+\sum_{i}s_i+P\sum_{j}\ell_j \tag{2} \]

2.3 约束条件

通道唯一、隧道禁行:

\[\sum_{k\in K\cup\{4\}x_k=1,\qquad x_4=0 \tag{3} \]

路径(每点一进一出):

\[\sum_{j\ne i}y_{ij}=\sum_{j\ne i}y_{ji}=1,\qquad \forall i\in V \tag{4} \]

时刻递推(大 M 松弛未走的弧):

\[t_j\ge t_0+\sum_{k\in K}a_{jk}x_k-M(1-y_{0j}),\qquad \forall j\ne 0 \tag{5} \]

\[t_j\ge t_i+s_i+d_{ij}-M(1-y_{ij}),\qquad \forall i,j\ne 0,\ i\ne j \tag{6} \]

时间窗与迟到:

\[A_j\le t_j\le D_j+\ell_j,\qquad \ell_j\ge 0 \tag{7} \]

\[y_{ij},\ x_k\in\{0,1\} \tag{8} \]

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 结论

  1. 5 单、三条桥下最优选 广州大桥,纯通行加服务 79.0 min、迟到 9.6 min(1 单),总成本 286.7 min。
  2. 三条桥单独最优分别是 286.7、327.9、594.6 min,最优通道不等于单程最快的桥——时间窗会把它绑架。
  3. 罚系数 \(P\) 超过约 20 后迟到压不动了,只能靠改桥或早出发;早出发 3 min 约等于罚系数加 2。
  4. 送达余量均值 4.5 min、最紧 -9.6 min,全在 0—5 min 的窄带;任何出餐延迟都会直接转成迟到。
  5. 通道只影响"出发点 ↔ 海珠"的弧,所以把 \(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/

posted @ 2026-11-10 08:32  小青蛙电气  阅读(2)  评论(0)    收藏  举报