案例 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}\) 走弧。目标把"骑行 + 服务时间 + 差评期望"三类成本相加:

\[\min\ Z=c_d\sum_{i,j}d_{ij}y_{ij}+c_t\Big(\sum_i \tau^u_i x_i+\tau_l\sum_i(1-x_i)\Big)+C\Big(p_u\sum_i x_i+p_l\sum_i(1-x_i)\Big) \tag{1} \]

节点激活:上楼的订单点、被用到的柜点才进回路:

\[\sum_{j\ne i}y_{ij}=x_i,\qquad \sum_{j\ne l}y_{lj}=w_l,\qquad \sum_{l}z_{il}=1-x_i \tag{2} \]

模型 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 目标函数

\[\min\ Z=c_d\sum_{(i,j)\in A}d_{ij}y_{ij}+c_t\Big(\sum_{i\in C}\tau^u_i x_i+\tau_l\sum_{i\in C}(1-x_i)\Big)+C\Big(p_u\sum_{i\in C}x_i+p_l\sum_{i\in C}(1-x_i)\Big) \tag{3} \]

2.3 约束条件

一单一处交付:

\[\sum_{l\in L_i}z_{il}=1-x_i,\qquad z_{il}\le w_l,\qquad \forall i\in C \tag{4} \]

节点激活(上楼点、被用到的柜点进回路):

\[\sum_{j\ne i}y_{ij}=\sum_{j\ne i}y_{ji}=x_i,\qquad \sum_{j\ne l}y_{lj}=w_l \tag{5} \]

\[\sum_{j\ne 0}y_{0j}=\sum_{j\ne 0}y_{j0}=1 \tag{6} \]

子回路消除(辅助流 \(f_{ij}\),比 MTZ 紧):

\[0\le f_{ij}\le |V|\,y_{ij},\qquad \sum_{j}f_{ji}-\sum_{j}f_{ij}=v_i,\qquad \forall i\ne 0 \tag{7} \]

\[y_{ij},\ x_i,\ z_{il},\ w_l\in\{0,1\} \tag{8} \]

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

  1. 15 单、3 个外卖柜下,最优方案为 5 单送上楼、10 单放柜,启用 3 个柜,总成本 33.63 元,比全送上楼的 35.33 元省 1.70 元(4.8%)。
  2. 上楼时间随楼层从 3.9 涨到 9.9 min,这一差异才是"混着来"的原因;若上楼统一 6 min,最优就会退化成"全上楼"或"全放柜"。
  3. 差评成本从 6 涨到 39 元,放柜单数由 15 变到 0,过渡带很窄——决策对差评定价非常敏感。
  4. 电梯越慢放柜越划算;等电梯从 0 加到 10 min,放柜单数由 0 增到 15。
  5. 消子回路要用辅助流而不是 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/

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