案例 049 冲单奖在 A,高单价在 B:冲量还是冲额
案例 049 冲单奖在 A,高单价在 B:冲量还是冲额
摘要:晚高峰 3 h,A 区挂着"满 8 单奖 30 元"的冲单奖、单价 8.0 元、单均 11 min;B 区单价 10.0 元(高 2.0 元)、单均 13 min、无奖励。本文把"两区各跑几单、要不要够档"写成 3 个变量的整数规划,用 0-1 变量 \(z\) 刻画达标与否,并用 \(x_{A}\ge m z\) 把阶跃奖励线性化。四种方案实测:全 A 冲奖 158 元、全 B 高价 130 元、按单价挑活的混合方案 138 元、混合达档 164 元。最优解是"8 单 A 换 30 元奖励、剩下 7 单全给 B",比全 B 高 34 元(26.2%)、比不冲档的混合方案高 26 元。冲单奖的临界额度只有 4 元,临界门槛是 15 单;本案的奖励额度是临界额度的 7.5 倍,所以"够档"几乎是无风险动作——真正的取舍不在要不要冲,而在冲完 8 单之后还剩几分钟给 B。
关键词:冲单奖;阶梯激励;0-1 规划;临界单量;区域选择;整数规划
1 问题提出
1.1 问题是什么
班次 3 h、共 180 min,骑手面前摆着两张价目表:A 区(冲量区)单价 8.0 元、单均 11 min,另有"满 8 单奖 30 元"的冲单奖;B 区(高单价区)单价 10.0 元、单均 13 min,没有任何奖励。两区的单都接不完,唯一稀缺的是这 180 min。
表 1 两个区域的单价、单均耗时与班次内的单量上限(班次 180 min)
| 区域 | 单价 元/单 | 单均耗时 min | 每小时收入 元/h | 冲单奖 | 满班单量 |
|---|---|---|---|---|---|
| A 区(冲单奖) | 8.0 | 11 | 43.64 | 满 8 单奖 30 | 16 |
| B 区(高单价) | 10.0 | 13 | 46.15 | 无 | 13 |
表 1 里"每小时收入"一列是纯单价账:A 区 43.64 元/h、B 区 46.15 元/h,B 高出一截。只按这一列决策,答案就是全跑 B——这正是本案例要推翻的结论。按单均耗时算,A 区一整个班次最多 16 单、B 区最多 13 单,两个上限都不是整数除尽的,尾巴上会剩下 4—11 min 的白板时间。
1.2 为什么要优化
第一,单价高的区不一定赚得多。B 区每小时多赚 46.15 减 43.64 的一小截,但冲单奖是一次性 30 元的阶跃:8 单 A 的单均收益因此从 8.0 元抬到 8.0 加 3.75 元。阶跃不看时长、只看有没有跨过门槛,单价账根本算不出这一块。
第二,奖励是"尾巴效应"。第 8 单的边际收益是 8.0 元加 30 元,第 8 加 1 单又跌回 8.0 元。同一条 A 区路线上,第 8 单和第 9 单的价值差 30 元——边际收益在门槛处跳一次,之后一路走平,这是纯线性模型永远给不出的形状。
第三,混合不是折中,是最优。两区不必二选一:先把 A 区的档打满、拿钱走人,剩下的时间全部投给单价更高的 B 区。本题要回答的就是"先冲多少单、冲到哪一档为止"。
1.3 Gurobi 如何求解
3 个变量(\(x_{A},x_{B}\) 整数、\(z\) 为 0-1),2 条约束,规模小到可以画图。Gurobi 的分支定界在 0.02 s 内证到最优(MIPGap \(10^{-9}\)),真正的价值在参数扫描:奖励额度 7 点、门槛与额度 7 乘 5 共 35 点、班次时长 7 点,另有 130 组可行组合的全枚举和 130 组情景的扰动重算,全部墙钟 1 s。
2 数学模型
2.1 符号说明
\(p_{A},p_{B}\) 为两区单价,\(t_{A},t_{B}\) 为单均占用时长,\(T\) 为班次可用时长,\(m\) 为冲单门槛,\(R\) 为冲单奖额度。决策变量:\(x_{A},x_{B}\in\mathbb{Z}_{+}\) 为两区单量,\(z\in\{0,1\}\) 表示是否达档。
2.2 目标函数
式 (1) 的前两项是线性的"按单计价",第三项是阶跃的"按档计价"。二者量纲相同(元 / 班次),但结构完全不同:前者随单量线性增长,后者只在 \(z\) 从 0 翻到 1 时整块跳出。
2.3 约束条件
班次时间是唯一的硬约束:
达标与单量的耦合是本模型的核心。用一条不等式把"\(z=1\) 必须以拿到 \(m\) 单为前提"写清楚:
式 (3) 只给了下界,没有给上界——因为式 (1) 中 \(R>0\),求解器绝不会在 \(x_{A}<m\) 时把 \(z\) 白放到 1;反之若 \(x_{A}\ge m\),把 \(z\) 顶到 1 一定更优。一条不等式加一个正系数,就够刻画整个阶跃,这是阶梯激励最省事的写法:
达档的相对代价可以解析地写出来。令 \(\bar n_{B}=\lfloor (T-t_{A}m)/t_{B}\rfloor\) 为冲完 \(m\) 单后还能跑几单 B,则"够档"的临界奖励额度为
式 (5) 的右端第一项是不冲档的最优收入(全给 B),括号内是够档方案在"零奖励"下的收入,两者之差就是够档要付的机会成本。反过来,给定 \(R\) 与单价差,临界门槛为
式 (6) 是纯单价账:每把一单 B 换成 A 就少赚 \(p_{B}-p_{A}\) 元,够档要换 \(m\) 单,摊到每单的奖励必须盖过这个价差。
2.4 规模与性质
2 个整数变量、1 个二进制、2 条约束,搜索空间不到 300 个格点,属于"可以手算、但手算会漏"的规模。漏在哪里:\(x_{A}\) 与 \(x_{B}\) 的可行域不是矩形,时间约束把右上角切掉一条斜边;而目标里的阶跃又让等值线在 \(x_{A}=m\) 处断开。可行域是斜切的,目标是断开的,两个性质叠在一起,最优点必然落在阶跃线或时间边的交点上——本例恰好两条都占。
3 Gurobi 求解实现
3.1 建模要点
三个变量、两条约束,代码与公式一一对应:
xA = m.addVar(vtype=GRB.INTEGER, lb=0, ub=int(T / tA) + 2)
xB = m.addVar(vtype=GRB.INTEGER, lb=0, ub=int(T / tB) + 2)
z = m.addVar(vtype=GRB.BINARY)
m.setObjective(pA * xA + pB * xB + R * z, GRB.MAXIMIZE)
m.addConstr(tA * xA + tB * xB <= T) # 班次时间
m.addConstr(xA >= mth * z) # 达档:z=1 必须先凑够 m 单
一个实现细节:\(x_{B}\) 的上界不能省。若把 \(x_{B}\) 设成无界整数,时间约束虽然仍能拦住它,但分支定界的初始域会被撑到 \(10^{30}\) 量级,LP 松弛的数值尺度变差;写成 \(\lfloor T/t_{B}\rfloor+2\) 之后,预求解直接把域收敛到 15 以内。另一处:\(z\) 与 \(x_{A}\) 若同时用来做"分段收益"的其他写法(如大 \(M\) 松弛),\(M\) 必须取 \(\lfloor T/t_{A}\rfloor\) 而不是 \(10^{6}\)。
3.2 求解结果
表 2 四种派单方案的单量、时间占用与收入构成(金额单位:元)
| 方案 | A 单+B 单 | 占用 min | A 区收入 | B 区收入 | 达档 z | 总收入 |
|---|---|---|---|---|---|---|
| 全 A 冲奖 | 16+0 | 176 | 128 | 30 | 1 | 158 |
| 全 B 高价 | 0+13 | 169 | 0 | 130 | 0 | 130 |
| 混合不冲档 | 1+13 | 180 | 8 | 130 | 0 | 138 |
| 混合达档(最优) | 8+7 | 179 | 64 | 70 | 1 | 164 |
四个方案里,全 A 与全 B 的差距只有 158 减 130 等于 28 元,而混合达档比全 B 高 34 元。真正的分水岭是第三、四行:同样跑混合,够档 164 元、不够档 138 元,差 26 元——这 26 元就是 8 单 A 换来的,平均每单 3.25 元,正好等于奖励摊到门槛上的单价。
4 结果分析

图 1 单量—累计收入:A 区的 30 元台阶与两条路线的交叉
4.1 两条路线的形状 图 1 把两区的"单量—累计收入"画在同一坐标里。B 区是一条斜率 10 的直线,A 区是斜率 8 的折线加一个 30 元的台阶:第 1—7 单每单只值 8 元,第 8 单一口气值 38 元,之后又跌回 8 元。台阶之前 A 一直输,台阶之后 A 一路赢:第 9 单时 A 累计 102 元、B 是 90 元;第 13 单时 A 累计 134 元、B 是 130 元,A 反超 4 元。这条交叉正是"要不要冲奖"的几何解释——在台阶之前 B 赢,在台阶之后 A 赢,最优点就长在台阶上。

图 2 130 组可行组合的耗时—收入全景(气泡为单量)
4.2 可行域是斜切的 图 2 把 130 组可行组合全部画出来,横轴占用时长、纵轴总收入、气泡大小是单量。点云左侧贴着 45 度斜带(时间用满的组合),右侧被 180 min 的竖线截断。灰点是未达档组合、蓝点是达档组合,两团在 \(x_{A}=8\) 处上下错开一整块——同一段时间,达档与不达档的收入差就是那 30 元,与单量多少无关。这也解释了为什么最优点总落在蓝色团的上边界。

图 3 全 A、全 B 与混合达档三种方案的总收入
4.3 三种方案 图 3 是三个方案的直接对比:全 A 158 元、全 B 130 元、混合达档 164 元;虚线是"混合但不冲档"的 138 元。注意全 A 与全 B 只差 28 元——A 区单价低 2 元、但跑得快 2 min,一进一出几乎打平;而混合达档比两者都高 6 与 34 元。单价、耗时的差异会互相抵消,唯有阶跃奖励不会。

图 4 按时钟推进的累计收入阶梯
4.4 累计视角 图 4 把三种方案摊在时钟上。全 A 在 176 min 收工,第 88 min 那一步就是 30 元的垂直跳升;全 B 一路匀速爬,169 min 收在 130 元;混合达档前 88 min 与全 A 完全重合(含那次跳升),之后切到 B 区,用更陡的斜率冲到 179 min。两条曲线的斜率差就是单价差,那次垂直跳升就是奖励——混合方案把两段的优点各取了一半。

图 5 奖励额度灵敏度:最优收入与达档决策
4.5 主灵敏度:奖励额度 图 5 让 \(R\) 从 0 元扫到 40 元。\(R\) 小于 4 元时曲线是水平的 138 元(最优解退回"全 B 加零头",\(z=0\));越过 4 元后曲线以斜率 1 上升,\(z\) 的阶梯也从 0 翻到 1。这个临界值 4 元低得反直觉:够档本来要放弃 8 单、每单 2 元共 16 元的价差,但 A 区每单快 2 min,省下的 16 min 又能多跑一单多 B,把代价抵到只剩 4 元。所以"奖励够不够"从来不是跟单价差比,而是跟净机会成本比。

图 6 冲单门槛 × 奖励额度的最优收入热图
4.6 二维:门槛与额度 图 6 是 4 行 5 列的最优收入热图,横向是奖励额度、纵向是门槛。整张图有三条台阶:\(m\le 8\) 的三行完全重合(\(R=30\) 时都是 164 元),\(m=10\sim14\) 整齐地低 2 元,\(m=16\) 再低 4 元到 158 元。\(R=0\) 那一列全部是 138 元——没有奖励时,门槛形同虚设,纵轴整列被拉平。额度方向每加 10 元涨 10 元,门槛方向每加 2 单掉 2—4 元:额度是主导变量,门槛只在跨过时间表能容纳的整数台阶时才起作用。本案的星标(8 单 / 30 元)落在第二条台阶上沿。

图 7 班次时长灵敏度:最优收入与 A 区单量
4.7 第三维:班次时长 图 7 把 \(T\) 从 120 min 拉到 240 min。\(T=120\) min 时最优收入 114 元、一共 10 单;\(T=240\) min 时 210 元、20 单。右轴的单量阶梯几乎是一条直线(每 20 min 多 1—2 单),左轴的收入也近似线性(约 0.8 元/min)。真正有意思的是右轴背后的构成:A 区单量在 8 与 11 之间来回摆——多出来的 20 min 既可以添一单 A 也可以添一单 B,谁刚好把时间填满谁就赢。所以"班次变长"并不会让策略单调地向某一区倾斜,只是在整数凑整的边界上反复切换。

图 8 130 组组合的帕累托前沿与不可行域
4.8 帕累托前沿 图 8 把 130 组可行组合画在"耗时—收入"平面上,灰区是超过 180 min 的部分。前沿只有 58 个点,从原点到 164 元一路抬升;全 B(方块)落在前沿下方——它在 169 min 上只拿到 130 元,属于被支配点;全 A(三角)贴着前沿但没到头;最优解(五角星)落在前沿末端 179 min 处。前沿的斜率就是"这一分钟的边际收入":末段每多投 1 min 只值 7 元出头,正是 A 区单位时间收益偏低的那一段。

图 9 300 个扰动情景下四种方案的累计分布
4.9 扰动下的稳健性 图 9 给两区单价各加正负 12%、奖励加正负 10% 的扰动,跑 300 个情景画累计分布。四条曲线的 5% 分位:混合达档 153 元、全 A 144 元、全 B 115 元、不冲档 123 元。达档方案在最差的 5% 情景里仍然领先,说明结论不是靠奖励刚好发得高——只要奖励落在 27—33 元区间,排序就不会翻。

图 10 四种方案的收入结构分解
4.10 结构分解 图 10 把四个方案拆成"A 区收入 + B 区收入 + 冲单奖"。全 A 的柱子全是蓝的,冲单奖那一小块只占 19%;全 B 全是红的,没有黄块;混合不冲档是 1 单 A 加 13 单 B 的拼接,一根黄块都没有;混合达档的蓝块与黄块同时出现,总收入最高。冲单奖在总收入里只占 30 除以 164 不到 19%,却决定了整张图的形状——这就是阶跃项的地位:金额不大,杠杆极大。
5 结论
-
最优方案是"8 单 A 换奖励、7 单 B 赚单价",总收入 164 元,比全 B 高 34 元(26.2%)、比全 A 高 6 元(3.8%)、比同样混合但不冲档的方案高 26 元。冲量区与高单价区不是竞争关系,是先后关系。
-
够档的临界奖励额度只有 4 元。名义上够档要放弃 8 单、每单 2.0 元共 16 元的价差,但 A 区单均快 2 min,省下的时间又能多跑一单多 B,净机会成本被压到 4 元。算冲奖值不值,要算净成本,不能只拿奖励跟单价差比。
-
临界门槛为 15 单,公式是 \(m^{*}=\lfloor R/(p_{B}-p_{A})\rfloor\)。本案门槛 8 单只到临界值 15 单的 53%,够档的净代价只有 4 元,所以"够档"是无风险动作;即便门槛抬到 16 单(整班全给 A),热图上的收入仍有 158 元,只是那时候已经没有余量分给 B 了。
-
单价差与耗时差会互相抵消:全 A 158 元与全 B 130 元只差 28 元,而单位时间收益 A 是 43.64 元/h、B 是 46.15 元/h,差距明显却抵不过 A 区跑得多。单价高的区未必赚得多,得看一小时能落几单。
-
门槛是次要变量、额度是主导变量:二维热图上额度每加 10 元抬 10 元、门槛每抬 2 单只掉 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号