案例 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 目标函数
式 (1) 的四块依次是有效单期望收入、核验后挽回的空跑损失、核验占用的时间成本、批次固定成本。第三、四块都乘了 \(\rho\)——核验花的是分钟不是钱,必须先折成钱才能和收入同框比较。
2.3 约束条件
式 (3) 是核验与接单的耦合:不接的单不该核验。这条下界配合式 (1) 中 \(p_{i}e_{i}>0\) 的系数,求解器不会白核验——一条不等式顶一个逻辑语句。
式 (4) 把“每批最多 \(k_{c}\) 单”写成计数约束,\(n_{b}\) 由求解器自己定;式 (5) 是重复单的冲突约束,漂移小于 100 m 的两单只接一张,否则要付 \(F\) 元赔偿。
式 (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 结论
-
批量核验后再规划最优,期望净收益 67.5 元,比照单直送高 50.5 元(296.8%)、比逐单电话确认高 4.9 元(7.8%)、比只查重不核验的直送识别高 7.5 元(12.5%)。关键在只核 5 张高漂移单、凑 1 个批次,而不是逢单必打。
-
期望空跑率从 0.116 压到 0.032,降幅过半;核验只占 13 min、折 7.2 元成本。用不到 6% 的班次时间换掉一半空跑,这笔账在各组参数下都算得过来。
-
单均核验成本的临界值是 6.00 min。低于它核验划算、高于它硬送更优;单张单的临界值最低只有 0.65 min,所以核验必须挑单,不能平摊。
-
漂移强度比班次时长更敏感:漂移翻倍让净收益掉 12.0 元,而多跑 45 min 才补回 3.9 元。与其多跑一小时,不如先把定位校准做好。
-
时间机会成本 \(\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.

浙公网安备 33010602011771号