案例 024 放外卖柜还是送上楼:交付方式选择与路由的耦合
案例 024 放外卖柜还是送上楼:交付方式选择与路由的耦合
摘要:珠江新城三栋写字楼各有一个外卖柜,15 单可送上楼(等电梯 3 min + 每层 0.3 min、差评率 2%)或放柜(2 min、差评率 8%)。本文把「骑行 + 服务时间 + 差评期望」折成统一成本,建立交付方式选择与路由的耦合模型,并用辅助流消子回路。结果表明:最优为 5 单上楼、10 单放柜,总成本 33.63 元,比全送上楼省 1.70 元(4.8%);最优从不是「全送上楼」,楼层导致的上楼时间差异(3.9—9.9 min)是「混着来」的根本原因。
关键词:外卖配送;外卖柜;交付方式选择;差评期望;Gurobi
1 问题提出
1.1 问题是什么
珠江新城三栋写字楼各有一个外卖柜,15 单落在三个楼群附近,到最近的柜 0.03—0.27 km、楼层 3—23 层。两种交付方式:
- 送上楼:等电梯 3 min 加上每层 0.3 min(3.9—9.9 min),差评概率 2%;
- 放柜:走到柜 + 投放 2 min,差评概率 8%。
一次差评折价 20 元,时间折 0.2 元/min,骑行 0.6 元/km。
决定每单"上楼"还是"放柜",并排一条骑行回路(只经过上楼的点和被用到的柜),使总成本最小。
表 1 订单(按到柜距离排序,节选)
| 订单 | 坐标 /km | 楼层 | 份数 | 到最近柜 /km | 上楼 /min |
|---|---|---|---|---|---|
| C05 | (1.26, 0.98) | 17 | 2 | 0.06 | 8.1 |
| C07 | (2.32, -0.33) | 9 | 2 | 0.11 | 5.7 |
| C12 | (0.71, -1.90) | 12 | 2 | 0.15 | 6.6 |
| C02 | (0.99, 0.99) | 16 | 2 | 0.21 | 7.8 |
| C09 | (2.63, -0.32) | 22 | 2 | 0.24 | 9.6 |
1.2 为什么要优化
- 楼层把"上楼"变成差异化成本:3.9—9.9 min 的差距足够改变决策;
1.3 Gurobi 如何求解
\(x_i=1\) 送上门、\(z_{il}=1\) 放柜 \(l\)、\(y_{ij}\) 走弧。目标把"骑行 + 服务时间 + 差评期望"三类成本相加:
节点激活:上楼的订单点、被用到的柜点才进回路:
模型 717 个变量、429 条约束,0.30 s 求得最优。
2 数学模型
2.1 符号说明
\(V=\{0\}\cup L\cup C\),0 为出发点、\(L=\{L1,L2,L3\}\) 为柜点、\(C\) 为 15 个客户;\(\tau^u_i=3+0.3\times\)楼层 为上楼时间、\(\tau_l=2\) min 为放柜;\(p_u=2%\)、\(p_l=8%\) 为差评概率;\(C=20\) 元为一次差评的期望成本;\(c_d=0.6\) 元/km、\(c_t=0.2\) 元/min。
2.2 目标函数
2.3 约束条件
一单一处交付:
节点激活(上楼点、被用到的柜点进回路):
子回路消除(辅助流 \(f_{ij}\),比 MTZ 紧):
2.4 规模与性质
19 个节点、342 条弧、15 个交付方式变量、15 个柜点指派变量,约束 429 条。这是"交付方式选择 + 路由"的耦合模型,属 NP-难;注意用辅助流而不是 MTZ 消子回路,同一个模型 MTZ 版本跑 30 s 还没收敛,流量版本 0.30 s 就到最优。
3 Gurobi 求解实现
3.1 建模要点
for i in CN:
m.addConstr(z.sum(i, "*") == 1 - x[i]) # 放柜的订单必须指派柜点
m.addConstr(y.sum(i, "*") == x[i]) # 上楼的订单才进回路
m.addConstr(y.sum("*", i) == x[i])
for l in avail[i]:
m.addConstr(z[i, l] <= w[l]) # 没启用的柜不能收单
for i, j in A: # 辅助流消子回路
m.addConstr(f[i, j] <= NN * y[i, j])
一条实现细节:"可放柜"的候选集要按距离预筛(≤ 0.40 km),而不是让 \(z_{il}\) 在全 3 个柜上自由取值。不筛会允许"跨楼放柜",模型给出的是数学上可行、现实中没人愿意走 1 km 去取餐的解。
3.2 求解结果
表 2 最优方案
| 指标 | 全送上楼 | 最优混合 |
|---|---|---|
| 上楼 / 放柜单数 | 15 / 0 | 5 / 10 |
| 骑行里程 / km | 8.99 | 8.99 |
| 服务时间 / min | 120 | 51 |
| 总成本 / 元 | 35.33 | 33.63 |
最优方案启用 L1、L2、L3 共 3 个柜,10 单放柜、5 单上楼,比全送上楼省 1.70 元(4.8%);总时长 81.2 min。
4 结果分析
4.1 空间结构与交付方式
图 1 里三个楼群各自有柜:放柜的点(绿)全部贴着柜点,上楼点(橙)散在楼群外围。柜把"分散的上楼"改成了"集中的投放",回路因此少绕进了楼栋之间。

图 1 柜点与逐单交付方式
图 2 把 15 单放进"到柜距离—楼层"平面:放柜的单几乎都在 0.40 km 以内、且楼层偏高;上楼的多在低楼层。距离决定"能不能放",楼层决定"值不值得放"——这正是 3.9—9.9 min 的上楼时间差异造成的。

图 2 到柜距离与楼层(气泡为份数)
4.2 成本分解与累计

图 3 全送上楼到最优混合的成本分解
图 4 用累计曲线看进度:柜点的交付"一次跳好几单",上楼点"一单一级"。阶梯的粗细直接反映"这一站交付了几单",最粗的一跳是 4 单。

图 4 最优方案的累计完成单数
4.3 差评成本与电梯等待
图 5 扫差评成本:6 元时放柜 15 单、总成本 18.43 元;39 元时放柜 0 单、成本 41.51 元。差评越贵,放柜越少,曲线在 20 元附近由"几乎全放柜"过渡到"几乎全上楼"。

图 5 总成本与放柜单数随差评成本的变化
图 6 同时扫差评成本与等电梯时间:左下(差评便宜、电梯快)最浅,右上最深,等值带向右上倾斜——"电梯多等 2 min"约等于"差评贵几元",两者可互相折算。

图 6 总成本关于差评成本与电梯等待的热图
4.4 电梯、前沿与分布
图 7 单看等电梯时间:0 min 时放柜 0 单、成本 26.81 元;10 min 时放柜 15 单、成本 35.23 元。电梯越慢,放柜越划算,这是"最后一公里"里最直接的一条杠杆。

图 7 总成本与放柜单数随电梯等待的变化
图 8 把各差评成本下的解画在"服务时间—差评期望"平面上:点沿一条下降的折线移动——想省服务时间,就得多担差评。顶部灰区是"差评期望更高"的方向,本案(星)落在折线中段。

图 8 服务时间—差评期望的方案前沿
图 9 是 15 单到最近柜的距离分布:均值 0.17 km,0 单超过 0.40 km 的"可放柜上限",这些单只能送上楼。

图 9 到最近外卖柜的距离分布
图 10 把时间按"柜点 / 上楼"分组堆叠:3 个启用柜各承担一段服务时间,上楼那组是 5 单的 31 min。柜点的服务时间是"一次投放、多单结算",这是它省时间的机理。

图 10 各柜点与上楼的时间构成
5 结论
- 15 单、3 个外卖柜下,最优方案为 5 单送上楼、10 单放柜,启用 3 个柜,总成本 33.63 元,比全送上楼的 35.33 元省 1.70 元(4.8%)。
- 上楼时间随楼层从 3.9 涨到 9.9 min,这一差异才是"混着来"的原因;若上楼统一 6 min,最优就会退化成"全上楼"或"全放柜"。
- 差评成本从 6 涨到 39 元,放柜单数由 15 变到 0,过渡带很窄——决策对差评定价非常敏感。
- 电梯越慢放柜越划算;等电梯从 0 加到 10 min,放柜单数由 0 增到 15。
- 消子回路要用辅助流而不是 MTZ:同一个模型 MTZ 跑 30 s 未收敛,流量版本 0.30 s 到最优——"节点激活 + 路由"这类模型对松弛强度极其敏感。
参考文献
[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号