案例 051 雨天加价,接还是不接
案例 051 雨天加价,接还是不接
摘要:雨天平台把单价抬上去,同时把车速压下来、把超时与事故概率抬上去,补贴到底是补偿还是诱饵,不能只看账面单价。本文用一场 200 min 的雨夜班次、18 张派单,把降雨强度 \(\theta\) 同时写进耗时、超时概率与事故概率,建立 0-1 接单模型,并用情景法把 CVaR 写成线性约束,与期望收益组成双口径目标。照常接单期望净收益 68.35 元,但 90% CVaR 只有 -12.92 元;只接高价单期望 52.98 元、CVaR -14.13 元;停摆为 0。期望口径下该接,风险调整口径下要补贴到 4.62 元/单才该接,而平台当天只给 3.0 元——差 1.62 元,这就是骑手在雨里犹豫的全部理由。
关键词:雨天补贴;CVaR;风险调整收益;0-1 背包;临界补贴;外卖派单
1 问题提出
1.1 问题是什么
雨夜 18:30—21:50,18 张派单在手机里排队,平台每单加 3.0 元雨天补贴。代价写在另一面:车速从 24 km/h 掉到 16.3 km/h,单均耗时被拉到 29.5 min,最远一张要 45 min;超时概率 0.103 至 0.154,事故概率按里程与降雨强度放大,单均事故风险成本 0.49 至 2.22 元。表 1 是这 18 张单的完整档案。
表 1 18 张雨天派单的距离、耗时、风险与单均期望净贡献(金额单位:元)
| 订单 | 距离 km | 耗时 min | 配送费 | 超时概率 | 事故概率 | 事故风险 | 单均期望 | 单分钟 |
|---|---|---|---|---|---|---|---|---|
| R01 | 1.4 | 13.0 | 5.20 | 0.103 | 0.0019 | 0.49 | 7.46 | 0.574 |
| R02 | 1.8 | 18.3 | 5.80 | 0.103 | 0.0024 | 0.62 | 7.92 | 0.433 |
| R03 | 2.2 | 18.6 | 5.40 | 0.103 | 0.0029 | 0.76 | 7.38 | 0.398 |
| R04 | 2.5 | 24.3 | 6.80 | 0.103 | 0.0033 | 0.87 | 8.68 | 0.358 |
| R05 | 2.8 | 20.0 | 5.60 | 0.103 | 0.0037 | 0.97 | 7.37 | 0.369 |
| R06 | 3.0 | 23.1 | 5.10 | 0.103 | 0.0040 | 1.04 | 6.80 | 0.294 |
| R07 | 3.2 | 28.3 | 6.67 | 0.106 | 0.0043 | 1.11 | 8.30 | 0.294 |
| R08 | 3.5 | 27.0 | 6.17 | 0.111 | 0.0047 | 1.21 | 7.69 | 0.285 |
| R09 | 3.8 | 28.7 | 7.08 | 0.115 | 0.0051 | 1.32 | 8.48 | 0.296 |
| R10 | 4.0 | 32.8 | 8.35 | 0.118 | 0.0053 | 1.39 | 9.67 | 0.295 |
| R11 | 4.2 | 29.0 | 7.32 | 0.121 | 0.0056 | 1.46 | 8.56 | 0.296 |
| R12 | 4.5 | 31.7 | 7.33 | 0.126 | 0.0060 | 1.56 | 8.45 | 0.267 |
| R13 | 4.8 | 36.4 | 9.03 | 0.130 | 0.0064 | 1.66 | 10.04 | 0.276 |
| R14 | 5.0 | 34.5 | 8.90 | 0.133 | 0.0067 | 1.73 | 9.84 | 0.285 |
| R15 | 5.3 | 37.2 | 8.51 | 0.138 | 0.0071 | 1.84 | 9.32 | 0.250 |
| R16 | 5.6 | 43.0 | 10.41 | 0.142 | 0.0075 | 1.94 | 11.11 | 0.259 |
| R17 | 6.0 | 41.2 | 9.95 | 0.148 | 0.0080 | 2.08 | 10.50 | 0.255 |
| R18 | 6.4 | 44.5 | 11.09 | 0.154 | 0.0085 | 2.22 | 11.49 | 0.258 |
单均期望净贡献从 6.8 元到 11.5 元,耗时却只差 32 min,跑一趟的含金量与风险完全不是一回事。全部接完要 531 min,班次只有 200 min,只能挑约 7 张——接哪几张,本身就是一道题。
1.2 为什么要优化
第一,补贴是单价、风险是尾部,两个东西不在一个量纲上。多接一单多拿 3.0 元是确定的,多接一单多担一次事故是概率的,只有把后者折成 CVaR 才能和前者同框比较。
第二,三策略不是拍脑袋选的。照常接单把时间用满、只接高价单把风险筛掉、停摆把收益归零,三者各有各的理,必须放到同一张表里比。
第三,临界补贴是唯一能拿去谈判的数。平台问“加到多少你们才愿意跑”,答案不该是情绪,而是一条曲线与零线的交点。
1.3 Gurobi 如何求解
18 个 0-1 接单变量、1 条时间约束,期望口径下就是标准 0-1 背包,毫秒级出解。风险口径要难一点:把 \(S=200\) 个情景的损失写进约束,引入 \(\eta\) 与 \(u_{s}\) 共 201 个连续变量,用 Rockafellar-Uryasev 形式把 CVaR 线性化,仍是 MILP。参数扫描共 14+ 次求解,每次限时 4 s,全部墙钟 11 s。
2 数学模型
2.1 符号说明
\(w_{i}\) 为不含补贴的配送费,\(s\) 为雨天补贴,\(d_{i}\) 为距离,\(t_{i}\) 为雨天耗时,\(q_{i}\) 为超时概率,\(f\) 为超时扣款,\(a_{i}\) 为事故概率,\(L\) 为事故自付额,\(T\) 为班次时长,\(\theta\) 为降雨强度,\(\beta_{r}\) 为 CVaR 置信水平,\(\lambda\) 为期望与风险的权重。决策变量:\(x_{i}\in\{0,1\}\) 是否接单。
2.2 目标函数
式 (1) 把每张单拆成四项:配送费、补贴、超时扣款的期望、事故成本的期望。第四项是本案例的重心——它不进目标,账面上每单都是赚的;它一进目标,长距离单立刻掉队。
2.3 约束条件
式 (2) 是班次时间约束,耗时随降雨强度变,所以雨天不是“少跑一点”,而是“每一单都变长”。式 (3) 定义“只接高价单”这一策略:把配送费低于 \(\bar{w}=7.5\) 元的单直接禁掉,模型其余部分不变——三种策略共用一套约束,只换可行域,比较才干净。
式 (4) 的速度线性下降是雨天最直接的物理事实,1.55 倍系数含空驶回程;式 (5) 让超时与事故都随 \(\theta\) 单调上升,事故还额外随距离放大,与雨天远单最容易出事的一线经验一致。
式 (6)(7) 是 CVaR 的线性化:\(\xi^{Q}_{i,s}\)、\(\xi^{A}_{i,s}\) 是情景 \(s\) 下超时与事故是否发生的 0-1 实现,\(u_{s}\) 是情景 \(s\) 相对 VaR 的亏空。\(\eta\) 就是 VaR,求解器自己定。这样“最坏 10% 的平均”变成一个线性目标,可以直接和式 (1) 拼在一起:
\(\lambda=1\) 是纯期望,\(\lambda=0\) 是纯 CVaR,中间是两者的折中。画前沿时用它的等价约束形式:在 \(\mathrm{CVaR}_{\beta_{r}}\ge\tau\) 下最大化式 (1),扫 \(\tau\) 就扫出一条前沿——离散问题的 \(\lambda\) 加权只会塌成几个点,约束形式才扫得动。
式 (9) 是临界补贴:CVaR 对 \(s\) 的偏导恰好等于接单数,所以补贴每加 1 元,CVaR 就抬 \(\sum_i x_{i}\) 元,曲线是一族斜率为接单数的折线,过零点即临界值。
2.4 规模与性质
18 个 0-1 变量、1 条时间约束;风险口径再加 1 个自由变量与 200 个非负连续变量、200 条约束。可行域是 0-1 背包,本身极简单;复杂度全在目标上——期望目标下所有单的系数都是正的,贪心按性价比排序就近似最优;CVaR 目标下系数变成情景相关的,同一张单在不同情景里贡献不同,排序失效,必须交给分支定界。
3 Gurobi 求解实现
3.1 建模要点
核心五行与式 (1)(2)(6)(7) 一一对应:
eexp = gp.quicksum((rev[i] - q[i] * FQ - a[i] * L) * x[i] for i in range(N))
m.addConstr(gp.quicksum(t[i] * x[i] for i in range(N)) <= T)
eta = m.addVar(lb=-1e4, ub=1e4)
u = m.addVars(NS, lb=0)
for k in range(NS):
m.addConstr(u[k] - eta + gp.quicksum((rev[i] - LS[k, i]) * x[i] for i in keep) >= 0)
m.setObjective(lam * eexp + (1 - lam) * (eta - quicksum(u) / ((1 - beta) * NS)), GRB.MAXIMIZE)
一个实现细节:\(\eta\) 必须给上下界。它无界时目标在 \(\lambda=1\) 的边界上会退化,预求解能过但数值上不干净;给 \(\pm10^4\) 后一次求解稳定在 0.1 s 内。另一处:三种策略不另建模型,只把不该接的单 \(x_{i}\) 上界设 0,预求解会把它们直接消掉,比较的是同一套约束下的三个可行域,不是三个不同的模型。
3.2 求解结果
表 2 三种策略在期望与 CVaR 两种口径下的班次收益(金额单位:元)
| 策略 | 接单数 | 期望收益 | CVaR 90% | 期望最低实现 | 风险折价 |
|---|---|---|---|---|---|
| 照常接单 | 8 | 68.35 | -12.92 | 71.6 | 81.27 |
| 只接高价单 | 5 | 52.98 | -14.13 | 56.9 | 67.11 |
| 停摆待命 | 0 | 0.00 | 0.00 | 0.0 | 0.00 |
期望口径下最优是 照常接单,CVaR 口径下最优是 停摆待命。照常接单期望 68.35 元、CVaR -12.92 元,两者相差 81.3 元——这段差额就是雨夜事故的“风险折价”,账面上看不见,出事时一次性兑现。只接高价单接 5 单,期望比照常少 15.37 元,CVaR 比照常低 1.21 元——用 15.37 元期望换 1.21 元尾部,这笔交换在图 8 的前沿上看得最清楚。
4 结果分析

图 1 18 张单的单均期望净贡献与事故风险成本(红色为高价单)
4.1 单均含金量 图 1 按单均期望净贡献降序排开,红色是 7 张高价单。最高的 11.5 元、最低的 6.8 元,差距接近两倍,而耗时只差 32 min。右轴事故风险成本与柱高并不总同向:远单柱高、风险也高,短单柱低、风险几乎贴地。含金量最高的那几张恰好是“高单价 + 中距离”,不是最远的那几张。

图 2 雨天单均耗时—期望净贡献散点(气泡为事故风险成本)
4.2 耗时—含金量分布 图 2 横轴雨天耗时、纵轴期望净贡献、气泡为事故风险。点沿右上斜带散开,高价单(方块)集中在右上,普通单(圆点)压在左下。气泡最大的是 6 km 以上的长单,它们的柱高靠距离堆出来,扣掉风险后并不占优。只看单价接单,会系统性挑中气泡最大的那几张。

图 3 照常接单、只接高价单与停摆三种策略的双口径收益
4.3 三策略双口径 图 3 是本文的核心对比。期望口径:照常 68.35 元、高价 52.98 元、停摆 0 元,接单完胜。CVaR 口径:照常 -12.92 元、高价 -14.13 元、停摆 0 元,排名变了。同一批数据、同一套约束,只换一个风险度量,两个口径指向不同策略——这正是“接还是不接”吵不出结果的原因。

图 4 照常接单与只接高价单按单分钟收益排序的累计净收益
4.4 累计过程 图 4 把两条路线摊在时钟上。两条曲线前 60 min 几乎重合,因为最优质的那几张单双方都会接;分叉出现在中段,照常接单继续收中价短单,只接高价单则宁可空着等下一张。到 200 min 两条线分别停在 68.35 与 52.98 元。差距不在“接得快”,在“愿不愿意为空档买单”。

图 5 雨天补贴灵敏度:两种口径的最优净收益与接单数
4.5 主灵敏度:补贴额 图 5 让 \(s\) 从 0 扫到 9 元/单。期望口径近似直线,斜率 8.00 元/元,因为补贴对每张入选单都是确定的 3.0 元级别加成;CVaR 口径斜率略缓(6.47 元/元)但起点为负,随补贴上升逐级抬升,在 4.62 元处穿过零线。这条零线就是临界补贴:低于它,风险调整后停摆更划算;高于它,接单才真正“值”。 接单数呈阶梯式跳变(右轴,从 3 单直跳 8 单),补贴一过某条线,模型才敢把时间用满——时间是真约束。

图 6 补贴额 × 降雨强度的 CVaR 净收益热图
4.6 二维:补贴 × 降雨强度 图 6 是 5 行 4 列热图。沿补贴方向(行内向右)每一格都抬升;沿降雨方向(列内向下)从 -10.2 元掉到 -28.4 元。一边补一边漏:在 0.7 的雨里把补贴从 0 加到 6 元只补回 34.2 元,而把雨从 0.3 加到 1.0 就漏掉 61.3 元——补贴永远追不上雨势。 本案星标(3.0 元 / 0.70)的 CVaR 实际是 -12.9 元,落在零线之下——这解释了为什么雨天骑手群里总有人说“这价不跑”。

图 7 事故自付额灵敏度:两种口径净收益与接单数
4.7 第三维:事故自付额 图 7 换一个维度,让事故自付额 \(L\) 从 60 元扫到 420 元(相当于有无保险、保险赔付比例不同的情形)。CVaR 口径从 53.6 元一路掉到 -27.0 元,期望口径只从 74.9 元缓降。保险越好,两个口径越接近;自付越高,两个口径劈得越开——这把“买不买保险”和“接不接单”变成了同一个问题的两个面。接单数从 8 张掉到 2 张,风险越高,模型自己会往回收。

图 8 期望收益—CVaR 前沿与风险不可接受区
4.8 风险—收益平面 图 8 把 14 个候选解(不同权重、不同策略下解出的接单方案)在样本外重算后投到“CVaR—期望”平面上,气泡大小是接单数,灰区是 CVaR 小于零的风险不可接受区。所有候选解都落在灰区里:在 3.0 元补贴下,无论怎么挑单,最坏 10% 的平均收益都是负的——这就是“该停摆”最直接的证据,也是临界补贴 4.62 元的由来。非支配解只有 1 个,说明在这个参数下“多接单”与“压尾部”之间几乎没有可交换的空间。

图 9 4000 个实现情景下四种方案的净收益累计分布
4.9 实现情景分布 图 9 用 4000 组伯努利实现重算四种方案。5% 分位:照常 71.6 元、CVaR 最优 70.3 元、停摆 0 元;均值 68.2 元对 67.1 元。照常接单的曲线右端最远、左尾也最长,一条曲线横跨近 300 元——这就是“平均值不错、但一年总有几次白干”的分布形态。CVaR 最优解把左尾收窄,代价是右端也削掉一截。

图 10 照常接单入选订单的收入、补贴与两项风险成本分解
4.10 逐单结构分解 图 10 把照常接单的 8 张单拆成配送费、补贴、超时扣款与事故成本四段。补贴合计 24.0 元,超时期望吃掉 2.2 元,事故期望吃掉 8.5 元,事故一项就占配送费的 15.4%。补贴看着是加价,其实先被风险吃掉了大半——这才是“雨天加价接还是不接”的真实账本。
5 结论
-
期望口径下应当接单:照常接单 68.35 元 > 只接高价单 52.98 元 > 停摆 0 元,接单比停摆多 68.35 元。只看平均值,雨天出工是对的。
-
风险调整口径下答案翻转:CVaR 90% 上照常接单只有 -12.92 元、只接高价单 -14.13 元,最优策略是 停摆待命。期望与 CVaR 之间 81.3 元的差额,就是雨夜事故的风险折价。
-
临界补贴为 4.62 元/单,是平台当天实际 3.0 元的 1.5 倍,缺口 1.62 元。这个数是可谈判的:补贴补到这个位置,风险调整后的接单才不亏。
-
降雨强度比补贴更敏感:\(\theta\) 从 0.3 升到 1.0 净收益掉 61.3 元,而补贴从 0 加到 6 元只抬 34.2 元。同样的钱,用来补雨势不如用来补时长或补安全装备。
-
事故自付额是隐藏开关:\(L\) 从 60 元到 420 元,CVaR 掉 80.6 元、接单数从 8 张降到 2 张。一份几十元的意外险,抵得上每单加价一两元——风险成本降下去,临界补贴自然跟着降。
参考文献
[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号