案例 050 定位漂移的幽灵单:照单直送、电话确认与批量核验

案例 050 定位漂移的幽灵单:照单直送、电话确认与批量核验

摘要:手机定位漂移会把同一份餐变成两张单,也会把客户早就出门的地址变成一单白跑。本文用本班 14 张派单记录,把漂移距离换算成幽灵概率 \(p_{i}\),建立“接单—核验”两套 0-1 决策,比较照单直送、先电话确认(每单加 2 min)、批量核验后再规划(每批 5 单加 3 min)三条路线。三者期望净收益分别为 17.0、62.6、67.5 元,批量核验比照单直送高 50.5 元(296.8%)、比逐单电话高 4.9 元。最优解只核验 5 张高漂移单、凑成 1 个批次,把期望空跑率从 0.116 压到 0.032。单均核验成本的临界值是 6.00 min:低于它就该核,高于它就该硬送,核验不是越勤越好。

关键词:定位漂移;幽灵单;0-1 规划;批量核验;期望收益;临界成本


1 问题提出

1.1 问题是什么

午高峰这 14 张单里,漂移最远的一张偏了 92 m:客户在 A 座、定位钉在 B 座,骑手绕到门口才发现地址错了,这一趟就是空跑。漂移还会制造重复单——两个平台把同一份餐各派一次,商家坐标差 40 m、客户坐标差 25 m,合起来仍落在 100 m 判定带内,系统认成两张单。表 1 是原始记录。

表 1 14 张单的定位漂移、幽灵概率与期望净收入(金额单位:元)

订单 平台 漂移 m 幽灵概率 单收入 占用 min 空跑成本 重复组
O01 美团 18 0.052 7.2 16 14.24 -
O02 美团 55 0.133 8.6 18 16.06 G1
O03 饿了么 62 0.148 8.4 19 16.84 G1
O04 美团 12 0.038 6.8 14 12.94 -
O05 饿了么 74 0.175 9.4 22 18.92 -
O06 美团 28 0.074 7.6 17 14.76 -
O07 美团 88 0.206 10.2 25 21.26 G2
O08 饿了么 92 0.214 10.0 24 22.04 G2
O09 美团 8 0.030 6.4 15 12.16 -
O10 饿了么 46 0.113 8.8 20 15.80 -
O11 美团 40 0.100 7.9 18 15.02 G3
O12 饿了么 44 0.109 7.7 19 15.54 G3
O13 美团 66 0.157 9.8 23 19.44 -
O14 饿了么 22 0.060 7.0 16 13.46 -

漂移与幽灵概率取线性关系 \(p_{i}=0.012+0.0022d_{i}\)(式 6),批均值 0.115,全批极差 0.185;空跑成本按 2.6 元/km 再加 8 元超时扣款折算,最贵的一单期望被啃掉近一半。期望净收入从 3.1 元到 6.1 元,同样是跑一趟,含金量差 3.0 元,只看单价永远排不出优先级。

1.2 为什么要优化

第一,漂移是概率不是事实。硬送有 \(p_{i}\) 的概率白跑,花 2 min 打个电话就能把这笔风险清零——要不要打,本质是“拿时间买确定性”的一笔交易,凭感觉算不清。

第二,核验有固定成本,必须成批做。逐单打电话是 2 min 一次,11 单就是 22 min;批量核验 5 单只收 3 min,单均摊到 0.6 min。批量的便宜来自摊薄,摊薄的前提是凑得够多,于是“核几张、凑几批”变成一个真正的整数决策。

第三,接单与核验抢同一段时间。班次只有 240 min,核验花掉的每一分钟都不能用来跑单。三条路线的差别全在这段时间的分配上:直送全给跑单、电话各留 2 min、批量按批留 3 min。

1.3 Gurobi 如何求解

14 个接单变量、14 个核验变量加 1 个批次数变量,共 28 个 0-1 变量与 1 个整数变量、约 45 条约束。Gurobi 的分支定界在 0.05 s 内证到最优(MIPGap \(10^{-9}\)),真正的开销在参数扫描:核验成本 7 点、漂移强度与班次时长 5 乘 4 共 20 点、时间机会成本 7 点、帕累托 30 点,再加 300 个蒙特卡洛情景,全部墙钟 2 s。

2 数学模型

2.1 符号说明

\(w_{i}\) 为单收入,\(t_{i}\) 为单均占用时长,\(p_{i}\) 为幽灵概率,\(e_{i}\) 为空跑成本,\(d_{i}\) 为定位漂移,\(T\) 为班次时长;\(c_{v}\) 为单均核验耗时,\(k_{b}\) 为每批核验耗时,\(k_{c}\) 为批容量,\(\rho\) 为时间机会成本(元/min),\(F\) 为重复接单赔偿。决策变量:\(x_{i}\) 是否接单,\(v_{i}\) 是否核验,\(n_{b}\) 为批次数,三者分别取 0-1、0-1 与非负整数。

2.2 目标函数

\[\max\ Z=\sum_{i\in\mathcal{I}}\Big[(1-p_{i})w_{i}x_{i}-p_{i}e_{i}(x_{i}-v_{i})\Big]-\rho\Big(c_{v}\sum_{i\in\mathcal{I}}v_{i}+k_{b}n_{b}\Big)\tag{1} \]

式 (1) 的四块依次是有效单期望收入、核验后挽回的空跑损失、核验占用的时间成本、批次固定成本。第三、四块都乘了 \(\rho\)——核验花的是分钟不是钱,必须先折成钱才能和收入同框比较。

2.3 约束条件

\[\sum_{i\in\mathcal{I}}t_{i}x_{i}+c_{v}\sum_{i\in\mathcal{I}}v_{i}+k_{b}n_{b}\le T\tag{2} \]

\[v_{i}\le x_{i},\qquad i\in\mathcal{I}\tag{3} \]

式 (3) 是核验与接单的耦合:不接的单不该核验。这条下界配合式 (1) 中 \(p_{i}e_{i}>0\) 的系数,求解器不会白核验——一条不等式顶一个逻辑语句。

\[k_{c}n_{b}\ge\sum_{i\in\mathcal{I}}v_{i},\qquad n_{b}\in\mathbb{Z}_{+}\tag{4} \]

\[x_{i}+x_{j}\le 1,\qquad (i,j)\in\mathcal{E}\tag{5} \]

式 (4) 把“每批最多 \(k_{c}\) 单”写成计数约束,\(n_{b}\) 由求解器自己定;式 (5) 是重复单的冲突约束,漂移小于 100 m 的两单只接一张,否则要付 \(F\) 元赔偿。

\[p_{i}=p_{0}+\beta d_{i},\qquad \beta>0\tag{6} \]

\[c_{v}^{*}=\frac{p_{i}e_{i}}{\rho}\tag{7} \]

式 (7) 是单张单的核验临界:核验的收益是挽回的期望空跑损失 \(p_{i}e_{i}\),成本是 \( ho c_{v}\),两者相等即临界。漂移最小的那张单临界值只有 0.65 min——这张单永远不该核;漂移最大的那张到 8.59 min,才值得为它单独打电话。

2.4 规模与性质

28 个 0-1 变量、1 个 0 到 3 的整数变量、约 45 条约束,可行域是“时间背包”与“冲突图独立集”的交集。这个规模手算也能出结果,但会漏两处:冲突约束让可行集不再是超立方体,批次固定成本又让目标在 \(n_{b}\) 上呈阶梯。两者叠加,最优点必落在“接单集恰好填满时间”与“核验集恰好凑整批次”的双重边界上。

3 Gurobi 求解实现

3.1 建模要点

核心四行与式 (1) 至 (5) 一一对应:

m.setObjective(gp.quicksum((1 - p[i]) * W[i] * x[i] - p[i] * E[i] * (x[i] - v[i])
                           for i in range(N))
               - rho * (cv * gp.quicksum(v[i] for i in range(N)) + kb * nb), GRB.MAXIMIZE)
m.addConstr(gp.quicksum(TI[i] * x[i] for i in range(N))
            + cv * gp.quicksum(v[i] for i in range(N)) + kb * nb <= T)   # 跑单 + 核验 + 批次
m.addConstr(cap * nb >= gp.quicksum(v[i] for i in range(N)))            # 每批最多 cap 单
for i, j in EDGES: m.addConstr(x[i] + x[j] <= 1)                        # 100 m 内视为同一份餐

一个实现细节:核验收益写成 \(p_{i}e_{i}(x_{i}-v_{i})\),而不是 \(p_{i}e_{i}x_{i}(1-v_{i})\)。后者是二次项,虽可大 M 线性化,但式 (3) 的 \(v_{i}\le x_{i}\) 已经保证 \(x_{i}(1-v_{i})=x_{i}-v_{i}\),直接写线性式能省掉 14 个辅助变量和 42 条约束。另一处:批次上界取批容量的向上取整加一,预求解能立刻收紧,不必用大数。

3.2 求解结果

表 2 四种派单策略的接单、核验与收益分解(金额单位:元)

策略 接单 核验 批次 占用 min 有效单收入 空跑损失 核验/赔偿 空跑率 净收益
照单直送 12 0 0 227 86.7 24.7 45.0 0.116 17.02
直送识别 11 0 0 204 79.7 19.7 0.0 0.103 60.03
电话确认 11 11 3 235 79.7 0.0 17.1 0.000 62.63
批量核验 11 5 1 217 79.7 5.0 7.2 0.032 67.54

四行读下来结论很硬:照单直送接满 12 单却只落 17.0 元,其中还含 3 对重复单的 45 元赔偿;直送识别(不核验、只查重)升到 60.0 元;电话确认 62.6 元;批量核验 67.5 元。电话确认只比直送识别高 2.6 元——逐单打 2 min 太贵,11 单吃掉的 22 min 差不多抵消了它挽回的空跑。照单直送之所以只剩 17.0 元,是 3 对重复单的 45 元赔偿一次性砸掉了五成收入。

4 结果分析

图 1 14 张单的定位漂移与幽灵概率(红色为重复组订单)

4.1 漂移的分布 图 1 把 14 张单按漂移降序排开,红色为重复组。漂移从 8 m 到 92 m,单张都没破 100 m 阈值,但三对重复单偏了 40 到 92 m,全部落进判定带。右轴幽灵概率与漂移严格同向,漂移最大的那张是漂移最小那张的 7 倍。风险不是随机撒的,它跟着漂移一条线走,这就给了“按漂移排序核验”的依据。

图 2 占用时长—期望净收入全景(气泡为幽灵空跑成本)

4.2 含金量的分布 图 2 每点一张单,横轴占用时长、纵轴期望净收入、气泡为幽灵空跑成本。点沿一条下斜带散开:左上角是短单高价,右下角是长单被空跑吃掉。最贵 6.1 元与最便宜 3.1 元差 3.0 元,占用时长却只差 8 min。按单价排和按单分钟期望收益排,出来的顺序完全不同,这正是图 4 两条曲线分叉的原因。

图 3 照单直送、先电话确认与批量核验三种策略的期望净收益

4.3 三种策略 图 3 直接对比:照单直送 17.0 元、先电话确认 62.6 元、批量核验 67.5 元。批量比直送多 50.5 元、比电话多 4.9 元。电话确认之所以不划算,是它把 2 min 平均摊到全部接单上,一共吃掉 22 min,等于少跑一整单;批量核验只核 5 张、凑 1 批,时间成本压到 7.2 元。同为核验,批量与逐单的差距不在单价,在摊薄的效率。

图 4 按派单顺序与按单分钟收益顺序推进的累计净收益

4.4 累计视角 图 4 把两条路线摊在时钟上。照单直送按派单顺序硬推,前 100 min 斜率稳定但被两对重复单拖着走;批量核验先挑单分钟收益高的接,前 60 min 斜率明显更陡,中段因为插了 1 个批次出现平台,末段靠核验剔除幽灵单省下的时间把剩下的高价值单接完。两条曲线终点差 50.5 元,差距全部产生在前 150 min 的排序上,后段只是把排序红利兑现。

图 5 单均核验成本灵敏度:最优净收益与核验单数

4.5 主灵敏度:核验成本 图 5 让 \(c_{v}\) 从 0 扫到 7.2 min。曲线从 76.0 元单调下滑到 60.0 元;越过 6.00 min 之后与直送识别的 60.0 元完全重合——核验彻底停做,0 张单一张也不核。核验单数同步从 10 张阶梯式掉到 0 张,每掉一档曲线就陡一下。临界值 6.00 min 是真实电话耗时 2 min 的 3.0 倍:只要核验不像逐单打电话那么贵(批量摊薄后单均不到 1 min),核验就一定划算;一旦退化成逐单打 2 min 电话,优势就被抹平——这正是很多骑手宁可硬送的原因。

图 6 漂移强度 × 班次时长的最优净收益热图

4.6 二维:漂移强度与班次时长 图 6 是 5 行 4 列热图。横向加时间,每多 15 min 净收益涨 1.3 元左右,基本线性;纵向加漂移强度,从 0.6 倍到 1.4 倍净收益由 73.6 掉到 61.5 元,跌 12.0 元。漂移比班次更陡:多跑 45 min 才补 3.9 元,抵不过漂移翻一倍。 本案星标(1.0 倍 / 240 min)落在 67.5 元。

图 7 时间机会成本灵敏度:两种策略的净收益与核验单数

4.7 第三维:时间机会成本 图 7 把 \(\rho\) 从 0.25 拉到 0.85 元/min。核验的时间成本随 \(\rho\) 上升,核验单数从 9 张单调降到 5 张,直送识别因为不核验而保持水平,批量核验的净收益随 \(\rho\) 上升而下滑,但在扫描范围内始终压在上方。\(\rho\) 越大、核验越少,这条单调关系说明核验本质是“用时间换确定性”的投资,时间越贵越不该投。

图 8 核验成本 × 班次时长的帕累托前沿与不可行域

4.8 帕累托前沿 图 8 把 30 个(核验成本 × 班次时长)组合画在“核验单数—净收益”平面上,颜色是单均核验成本,灰带是不如不核验区(净收益低于直送识别的 60.0 元)。多核一单要多花 \(c_{v}\) 分钟,换回的是 \(p_{i}e_{i}\) 的期望空跑;前沿由 5 段组成,从“3 单 / 62.5 元”抬到“10 单 / 76.0 元”。批量核验落在 5 单 / 67.5 元,就贴在前沿下方一点;照单直送 0 单 / 17.0 元落在灰带里——不核验还重复接单,净收益连基线都够不着。核验的边际收益沿前沿递减:前几单每单摊到 7.6 元上下,最后几单只剩几毛,这就是“挑单核验”比“逢单必核”便宜的原因。

图 9 300 个幽灵实现情景下四种策略的累计分布

4.9 实现情景下的分布 图 9 用 300 组真实幽灵实现(每单按 \(p_{i}\) 抽伯努利)重算四种策略。5% 分位:照单直送 -31.0 元、直送识别 8.5 元、电话确认 45.6 元、批量核验 42.0 元。批量核验的均值最高(67.9 元对 14.9 元),整条曲线最靠右;但尾部 42.0 元略低于电话确认的 45.6 元——逐单把 11 张全核了,方差压到最小;批量只核 5 张,用一点尾部换回均值。照单直送的分布拖到 -31.0 元,说明重复接单的赔偿是真正的尾部风险,不是平均值问题。

图 10 四种策略的收入、空跑损失与核验成本分解

4.10 结构分解 图 10 把四种策略拆成有效单收入、幽灵空跑损失、核验与赔偿三块。照单直送收入块最大(接得最多),损失块也最大,还多一块赔偿;批量核验收入块小一点,损失块压到最低。收入最大不等于净收益最大,中间隔着两块成本,这是本案例最想说明的一句话。

5 结论

  1. 批量核验后再规划最优,期望净收益 67.5 元,比照单直送高 50.5 元(296.8%)、比逐单电话确认高 4.9 元(7.8%)、比只查重不核验的直送识别高 7.5 元(12.5%)。关键在只核 5 张高漂移单、凑 1 个批次,而不是逢单必打。

  2. 期望空跑率从 0.116 压到 0.032,降幅过半;核验只占 13 min、折 7.2 元成本。用不到 6% 的班次时间换掉一半空跑,这笔账在各组参数下都算得过来。

  3. 单均核验成本的临界值是 6.00 min。低于它核验划算、高于它硬送更优;单张单的临界值最低只有 0.65 min,所以核验必须挑单,不能平摊。

  4. 漂移强度比班次时长更敏感:漂移翻倍让净收益掉 12.0 元,而多跑 45 min 才补回 3.9 元。与其多跑一小时,不如先把定位校准做好。

  5. 时间机会成本 \(\rho\) 越高,该核验的单越少(图 7 的单调下降)。核验是“用时间买确定性”的投资,高峰 \(\rho\) 高就该少核、平峰 \(\rho\) 低就该多核,策略要随时段切换而不是一刀切。

参考文献

[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.

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