案例091 无接触配送的丢餐
案例091 无接触配送的丢餐
摘要:无接触配送把餐放在门口,丢餐率 1.5%,丢一单赔 32 元。骑手可以拍照留证把自赔概率从 100% 压到 30%,代价是每单多花 20 秒(折 0.33 元)。单变量 LP 的目标对覆盖率 线性,最优必在端点:全拍 0.474 元/单、不拍 0.480 元/单,只差 0.27 元/天,因为 1.5% 恰好压在临界丢餐率 1.47% 上方一线。把客户分成高风险与普通两类做分类覆盖 MILP,只拍高风险单,单位成本降到 0.397 元,比全拍省 3.47 元/天。再把「留证减少 30% 差评、每条 20 元」折进目标,单位斜率的绝对值放大 7 倍,最优 被推到 1。
关键词:端点解;临界丢餐率;分类覆盖;0-1 线性化;纠纷价值
1 问题提出
1.1 问题是什么
无接触配送的规矩是:餐放门口、拍照、走人。省下的是上楼和等待的几分钟,赔上的是「门口那袋餐还在不在」的不确定性。本案的数字来自一天的实盘:日均 45 单,丢餐率 1.5%,也就是平均一天丢 0.67 单;丢一单骑手自己掏 32 元。留证是另一条路——把餐放下、拍一张带门牌号的照片,责任就从「骑手没送到」变成「客户取走或被人拿走」,自赔概率从 100% 降到 30%,代价是每单多花 20 秒,按 0.0165 元/秒折成 0.33 元。一天 45 单里,高风险单(无电梯老楼、夜宵时段、楼道无人)18 单、丢餐率 2.4%;普通单 27 单、丢餐率 0.9%。两者加权正好是 1.5%——平均值是两类单平均出来的,这一点决定了后面全部结论。
表 1 两类客户的丢餐数据与留证判定
| 客户类 | 单量 / 单 | 丢餐率 | 留证判据 0.7Fp | 拍照成本 | 决策 | 单位成本 / 元 |
|---|---|---|---|---|---|---|
| H 高风险(夜宵/老楼) | 18 | 2.4% | 0.538 | 0.33 | 拍 | 0.560 |
| L 普通 | 27 | 0.9% | 0.202 | 0.33 | 不拍 | 0.288 |
1.2 为什么要优化
三条理由。其一,这是一个「算术上几乎打平」的决策:全拍 0.474 元/单、不拍 0.480 元/单,差 0.006 元/单——凭感觉判断必然出错,只能算。其二,平均值掩盖了结构:1.5% 是两类单混出来的,用统一覆盖率决策,等于让低风险单陪着高风险单一起付拍照费,或者让高风险单裸奔。其三,模型外的收益没有定价:留证避免的不只是赔款,还有扯皮、差评、平台判责,这部分不进目标函数就会被系统性忽略。
1.3 Gurobi 如何求解
三个模型串起来。模型一是单变量 LP,用来看端点解与对偶价;模型二是分类覆盖 MILP,45 个接单 0-1 变量加 2 个拍摄 0-1 变量,乘积项用大 M 线性化;模型三在模型一上追加纠纷项,看最优 是否翻转。参数扫描在赔偿额、丢餐率、拍照耗时三个维度上做,共 103 次求解,全部 LP/MILP 秒级收敛。
2 数学模型
2.1 符号说明
日均单量 \(n=45\);一次丢餐赔偿 \(f=32\) 元;基准丢餐率 \(p=0.015\);留证后自赔概率 \(\beta=0.3\);每单拍照时间成本 \(c=0.33\) 元;客户类 \(k\in\{H,L\}\) 的单量 \(n_k\)、丢餐率 \(p_k\);接单变量 \(x_i\)、拍摄变量 \(z_k\);覆盖率 \(r\in[0,1]\)。
2.2 目标函数
统一覆盖率下,单均成本与一天 \(n\) 单的总成本分别是 \(r\) 的一次函数:
代入 \(f=32\)、\(p=0.015\)、\(\beta=0.3\)、\(c=0.33\):\(u(r)=0.480-0.006\,r\)。斜率是负的但极小,\(r\) 从 0 走到 1 只降 0.006 元/单。
2.3 约束条件
式 (2) 对 \(r\) 线性、可行域是一维区间,最优解必在端点,比较两端即得:
\(p^{*}=0.33/(0.7\times32)=1.47\%\)。本案 \(p=1.5\%\) 只比它高 0.03 个百分点,缺口 \(fp(1-\beta)-c=0.006\) 元/单——这就是「几乎无差」的量化解释。
2.4 分类覆盖与纠纷价值
两类客户各自决定拍不拍,\(z_k\in\{0,1\}\),\(S_k=\sum_{i\in k}x_i\),乘积 \(g_k=S_kz_k\) 用大 M(\(M=n_k\))线性化:
式 (6) 的方括号就是「这一类单拍一张值不值」的单价:\(H\) 类 \(0.2076\)、\(L\) 类 \(-0.1284\),一正一负,分类的意义全在这两个数上。式 (7) 加入纠纷价值 \(\gamma qv\)(\(\gamma\) 为差评减少比例、\(q\) 为差评率、\(v\) 为每条折算损失),括号随之变成 \((1-\beta)fp_k-c+\gamma qv\),端点门槛改写为 \(p>(c-\gamma vq)/((1-\beta)f)=1.31\%\)。
3 Gurobi 求解实现
3.1 建模要点
gH = m.addVar(lb=0.0, ub=NH); zH = m.addVar(vtype=GRB.BINARY)
m.addConstr(gH <= NH * zH); m.addConstr(gH <= SH)
m.addConstr(gH >= SH - NH * (1 - zH))
obj = quicksum(W[i]*x[i] for i in range(N)) - F*PH*SH - F*PL*SL \
+ (0.7*F*PH - c + bonus) * gH + (0.7*F*PL - c + bonus) * gL
m.setObjective(obj, GRB.MAXIMIZE)
大 M 取 \(n_k\)(18 与 27),不用 \(10^6\)。目标里 \(g_k\) 的系数就是式 (6) 的方括号,符号决定 \(z_k\)——不需要额外的「拍不拍」逻辑约束,线性化本身就替模型做了判断。LP 端点上界约束的影子价格为 0.2700 元/天(年化 98.5 元),含义是「允许覆盖率再涨一点值多少钱」,也是全拍的边际价值。
3.2 求解结果
表 2 四种方案的单均成本与日成本(45 单口径)
| 方案 | 覆盖率 | 赔偿期望 | 拍照成本 | 纠纷抵扣 | 单均成本 | 日成本 / 元 |
|---|---|---|---|---|---|---|
| 不拍 | 0.00 | 0.480 | 0.000 | 0.000 | 0.480 | 21.60 |
| 全拍 | 1.00 | 0.144 | 0.330 | 0.000 | 0.474 | 21.33 |
| 分类拍 | 0.40 | 0.265 | 0.132 | 0.000 | 0.397 | 17.86 |
| 全拍+纠纷 | 1.00 | 0.144 | 0.330 | -0.036 | 0.438 | 19.71 |
模型二在根节点收敛:\(z_H=1\)、\(z_L=0\)、45 单全接,日成本 17.86 元。模型三把纠纷项加进去,最优 仍是端点 1,但优势从 0.27 元/天放大到 1.89 元/天。同一个端点,两种理由,量级差 7.0 倍。
4 结果分析
4.1 结构:一条几乎水平的直线

图 1 单均成本随拍照覆盖率的变化(棒棒糖为 0.1 步长的取值,右轴为自赔概率)
图 1 的棒棒糖是式 (1) 的逐点取值。柱子高度从 0.480 降到 0.474,全图几乎是平的;右轴的自赔概率却从 100% 掉到 30%。两条线讲的是同一件事的两面:赔偿期望降了 0.336 元,拍照成本涨了 0.330 元,净赚 0.006 元。图的平不是画错,是本案最核心的事实。

图 2 丢餐率与最优覆盖率的关系(气泡面积=该点全年节省,虚线为临界丢餐率)
图 2 把横轴换成丢餐率。虚线 1.47% 左边全是 \(r^{*}=0\),右边全是 \(r^{*}=1\),台阶一步跨完——没有中间状态,这是线性目标的必然。气泡面积是全年节省 \(365n[(1-\beta)fp-c]\),丢餐率越高省得越多:3.0% 处一年省 5617 元,而本案 1.5% 处只有 99 元。星标紧贴虚线右侧,说明本案站在门槛上,风一吹就翻。
4.2 方案对比:从 0.480 到 0.397

图 3 四种方案的单均成本对比(柱为赔偿期望与拍照成本,点划线为纠纷抵扣后的水平)
图 3 是全案的结论图,四个柱子按单均成本排:不拍 0.480、全拍 0.474、分类拍 0.397、全拍加纠纷 0.438。前两根柱子差 0.006 元,肉眼几乎看不出;后两根才是真正的差距。端点解打赢了,但赢得极其勉强——这正是「模型说拍、但拍不拍都行」的来源。
式 (6) 的两个方括号把话说尽了:\(H\) 类每拍一单赚 0.2076 元,\(L\) 类每拍一单亏 0.1284 元。Gurobi 的选择是 \(z_H=1\)、\(z_L=0\),只覆盖 40% 的单,日成本 17.86 元,比全拍省 3.47 元/天(1265 元/年),比不拍省 3.74 元/天。这里有个反直觉的地方:分类拍的等效覆盖率 0.40,若真按统一覆盖率 0.40 去拍,成本是 0.478 元/单,比分类拍贵 0.081 元——同样的「拍四成」,挑着拍比摊着拍便宜,因为摊着拍时 18 单高风险单只被保护了 40%,而 27 单普通单白白付了钱。

图 4 30 天累计节省:统一覆盖的三条线几乎重叠,纠纷价值使斜率放大一个量级
图 4 是 30 天累计节省。三条统一覆盖的线几乎重合,30 天全拍只比不拍省 8.1 元——一个月省一顿早餐钱,这就是纯赔款口径下留证的全部价值。按式 (7),纠纷项每单给 \(\gamma vq=0.036\) 元的抵扣,计入后斜率陡增:全拍+纠纷 30 天省 56.7 元、分类拍+纠纷省 131.5 元,同一动作在两种口径下差 7.0 倍。纠纷项还把临界丢餐率从 1.47% 压到 1.31%(降低 11%),本案从「勉强过线」变成「明显过线」。但 \(L\) 类的方括号从 -0.1284 变成 -0.0924,仍是负的:纠纷价值改变力度,不改变结构。
4.3 主灵敏度:赔偿额与临界线

图 5 赔偿额对临界丢餐率(左轴)与盈亏平衡拍照耗时(右轴)的影响
图 5 的左轴是临界丢餐率对赔偿额的曲线 \(p^{*}=c/(0.7f)\):赔偿从 32 涨到 50 元,20 秒口径的门槛从 1.47% 降到 0.94%;40 秒口径整条曲线上移一倍。赔偿越贵越该拍,拍照越慢门槛越高,两个方向在图上分得很清楚。右轴是盈亏平衡拍照耗时 \(t^{*}=0.7fp/c_s\),32 元时只有 20.4 秒,50 元时放宽到 31.8 秒——赔偿翻倍,允许的拍照时间几乎也翻倍。

图 6 赔偿额 × 丢餐率 的最优拍摄分区(星号为本案参数,虚线为临界线)
图 6 是二维分区:横轴赔偿额、纵轴丢餐率,虚线是临界线,左上是「拍」、右下是「不拍」。赔偿涨,拍的区域向上扩;丢餐率涨,也向上扩。星标 (32, 1.5%) 紧贴虚线,只要赔偿降到 31.4 元以下,本案就翻到「不拍」一侧。
4.4 第三维与前沿

图 7 拍照耗时对单均成本(左轴)与临界丢餐率(右轴)的影响
图 7 换一个横轴:拍照耗时 10→40 秒。全拍的成本从 0.309 涨到 0.804,与不拍的 0.480 在第 20.4 秒相交。本案 20 秒只比平衡点快 0.4 秒——拍照动作再慢一点点,全拍立刻变成亏本买卖。这也解释了为什么很多骑手「拍半张就走」:他们在用降低留证有效性的方式压这 20 秒。

图 8 统一覆盖的线性前沿与不可达区(星号为分类覆盖,落入阴影即优于任何统一比例)
图 8 把统一覆盖率画成前沿:只能在 (0, 0.480) 到 (1, 0.474) 那条直线上走,线下那块阴影是「统一比例做不到的区域」。分类拍那颗星落在阴影里(0.397 < 0.474),它突破了直线前沿——因为阴影的边界只在「所有单同一概率」的假设下成立。假设一破,阴影就不成立了。
4.5 分布与分解

图 9 一天 45 单需要自赔次数的分布(柱)与累计概率(点线,右轴)
图 9 是分布的视角。不拍时一天平均自赔 0.66 次、全拍 0.21 次,期望差 0.46 次 = 0.27 元,与前面的账一致。「一次都不出事」的概率差别更大:不拍 51%、全拍 81%;「至少两次」的概率 14% 对 2%。骑手怕的不是均值,是那 14% 的月份——这是模型外价值的另一个可量化侧面。

图 10 单均成本的两项分解:赔偿期望随覆盖率下降,拍照成本线性上升
图 10 是分解视图:赔偿期望从 0.480 线性降到 0.144,拍照成本从 0 线性升到 0.330,两条线斜率分别是 0.336 与 0.330,后者的绝对值大 0.98 倍,所以总成本几乎不动。分类覆盖做的不是改变斜率,而是把拍照成本只花在斜率占优的那一段。
5 结论
(1)端点解是模型的必然,不是数据巧合。目标对 线性、可行域是一维区间,最优只能落在 0 或 1;本案落在 1,理由是 \(fp(1-\beta)-c=0.006>0\),只赢 0.006 元/单。(2)临界丢餐率是全案的主参数:\(p^{*}=c/(0.7f)=1.47\%\)。低于它拍照不划算,高于它才划算;本案 1.5% 刚过线 0.03 个百分点,「几乎无差」由此得到精确解释;赔偿涨到 50 元,门槛降到 0.94%,结论会更硬。
(3)分类覆盖比任何统一比例都便宜:只拍高风险单(40% 覆盖),单均 0.397 元,比全拍省 3.47 元/天、1265 元/年,且落在「统一覆盖不可达区」之内;判据就是临界丢餐率本身——\(p_k>1.47\%\) 的单拍,其余不拍。
(4)纠纷价值把最优 推到 1,门槛压低 11%(1.47% → 1.31%),30 天累计从 8.1 元放大到 56.7 元;但它只改力度不改结构,\(L\) 类拍与不拍仍差 0.0924 元,全拍仍不如分类拍。(5)拍照耗时是隐藏的杠杆:本案 20 秒距平衡点 20.4 秒只剩 0.4 秒余量,耗时涨到 40 秒全拍立刻亏 0.324 元/单。留证的价值不在「拍」而在「拍得快且拍得清」,压时长比压概率更划算——这是模型之外、但下一次建模可以收进来的部分。
参考文献
[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.

浙公网安备 33010602011771号