案例 083 小费与打赏能算进收益吗
案例 083 小费与打赏能算进收益吗
摘要:写字楼打赏率 8%、单均 5 元,老小区 2%、单均 3 元,折成期望只有 \(0.40\) 元与 \(0.06\) 元,而配送费均值 7.5 元。本案例用 15 单的 0-1 背包回答"打赏能不能算进收益"。第一,把打赏写成零膨胀分布,算出两类区域的方差为 1.84 与 0.18、变异系数 3.39 与 7.00;按"均值减 \(\lambda\) 倍标准差"折成等效确定性收益,写字楼打赏变成 \(-0.96\) 元、老小区 \(-0.36\) 元,期望口径下正的那点打赏,风险调整后是负的,临界 \(\lambda^{\ast}=0.29\)。第二,在工时 205 min、写字楼不超过 7 单、老小区保供 3 单的约束下比较三种口径:全计打赏 66.65 元、只计五成 65.56 元、只算配送费 64.47 元,最优接单组合完全相同,口径差只落在账面上(2.18 元,占 3.3%)。第三,题面的"打赏占比不超过 15%"在上限意义上形同虚设:实际占比仅 3.27%,临界比例 3.5%,影子价为零;压到 5% 一分不掉,压到 2% 才掉 15.9 元,每压 1 个百分点约 12.3 元。
关键词:零膨胀分布;期望打赏;等效确定性收益;稳健约束;影子价格
1 问题提出
1.1 问题是什么
晚高峰剩 205 min 可售工时,手上 15 单,分布在写字楼(8 单)与老小区(7 单)两类区域。两个区域的小费文化完全不同:写字楼 8% 的客户会给 5 元,老小区只有 2% 会给 3 元。表 1 是原始数据。
表 1 15 单的基础数据(配送费与耗时)
| 订单 | 区域 | 配送费 / 元 | 耗时 / min | 打赏率 | 打赏额 / 元 | 期望打赏 / 元 |
|---|---|---|---|---|---|---|
| O1 | 写字楼 | 8.90 | 24 | 0.08 | 5.0 | 0.40 |
| O2 | 写字楼 | 8.20 | 22 | 0.08 | 5.0 | 0.40 |
| O3 | 写字楼 | 9.50 | 26 | 0.08 | 5.0 | 0.40 |
| O4 | 写字楼 | 7.50 | 20 | 0.08 | 5.0 | 0.40 |
| O5 | 写字楼 | 8.40 | 25 | 0.08 | 5.0 | 0.40 |
| O6 | 写字楼 | 6.90 | 24 | 0.08 | 5.0 | 0.40 |
| O7 | 写字楼 | 9.10 | 28 | 0.08 | 5.0 | 0.40 |
| O8 | 写字楼 | 7.90 | 23 | 0.08 | 5.0 | 0.40 |
| R1 | 老小区 | 6.40 | 32 | 0.02 | 3.0 | 0.06 |
| R2 | 老小区 | 6.10 | 30 | 0.02 | 3.0 | 0.06 |
| R3 | 老小区 | 7.30 | 34 | 0.02 | 3.0 | 0.06 |
| R4 | 老小区 | 6.87 | 23 | 0.02 | 3.0 | 0.06 |
| R5 | 老小区 | 5.80 | 29 | 0.02 | 3.0 | 0.06 |
| R6 | 老小区 | 6.70 | 31 | 0.02 | 3.0 | 0.06 |
| R7 | 老小区 | 7.10 | 27 | 0.02 | 3.0 | 0.06 |
两类的期望打赏见式 (1)。相对配送费均值 7.5 元,它们只占 5.3% 与 0.8%。问题不在"打赏多不多",而在"这 0.40 元能不能当成收益参与排序"——它是以 8% 的概率一次性到账的,跳过它不影响配送费,接错单却要占掉 27 min 工时。
1.2 为什么要优化
第一,打赏不是收入,是彩票。 一单写字楼的账户里最终只会出现两个数:\(8+0\) 或 \(8+5\),不会出现 \(8.4\)。把 \(0.4\) 写进目标函数,等价于假设"跑 100 单必然收回 40 元"——这个假设只在大量重复时成立,而一次晚高峰只有 8—10 单,大数定律根本来不及生效。
第二,口径会改变排序,也可能不改变。 打赏的跨单差异最大只有 \(\mu_{\text{楼}}-\mu_{\text{村}}=0.34\) 元,配送费的跨单差异有 3.7 元。若打赏差异小到无法翻转任何一对候选单,那么"计不计打赏"只是账面问题;若有哪怕一对候选单的价格差落在 \((0.34, 0.40)\) 之间,口径就会直接改变最优解。这件事必须算,不能猜。
第三,题面自己留了一道保险。 "打赏不可预期地影响接单",于是加一条打赏占比不超过 15% 的稳健约束,防止模型为了 0.40 元绕路。这条约束的影子价是多少、真正开始咬人的比例在哪,正是稳健优化要给的两个数。
1.3 Gurobi 如何求解
15 个 0-1 变量、4 条约束,是标准的 0-1 背包加两条基数约束,单次求解在毫秒级,可以放心做扫描:计入比例 7 点、占比上限 9 点加 21 点细网格、风险厌恶 7 点、工时 13 点、二维网格 4$\times$5,合计 107 次 MIP。稳健约束写成 \(\sum_i[(1-\theta)\beta\mu_i-\theta w_i]x_i\le 0\) 的线性形式,右端为 0,\(\theta\) 只进系数不进右端,因此上限一变不用重建模型结构;影子价另建连续松弛取 \(\pi\),与有限差分互校。
2 数学模型
2.1 符号说明
\(x_i\in\{0,1\}\) 是否接第 \(i\) 单;\(w_i\) 配送费;\(t_i\) 耗时;\(p_r\) 区域 \(r\) 的打赏率;\(a_r\) 区域 \(r\) 的打赏额;\(\mu_i=p_{r(i)}a_{r(i)}\) 期望打赏;\(\sigma_i\) 打赏标准差;\(\beta\in[0,1]\) 打赏计入比例;\(\lambda\) 风险厌恶系数;\(\theta\) 打赏占比上限;\(T\) 可售工时。
2.2 目标函数
\(\beta=1\) 是题面口径(期望打赏全额计入),\(\beta=0.5\) 是折半口径,\(\beta=0\) 是只认确定性收入;\(\lambda\sigma_i\) 是风险折价,\(\lambda=0\) 时退化为期望值最大化。三个旋钮把"能不能算"拆成"算多少"与"敢不敢算"两个独立问题。
2.3 约束条件
式 (5) 由 \(\sum_i\beta\mu_ix_i\le\theta\sum_i(w_i+\beta\mu_i)x_i\) 移项得到,左端即"打赏收入减 \(\theta\) 倍总收入",不等式成立等价于打赏占比不超过 \(\theta\)。\(\beta=0\) 时式 (5) 左端恒为 \(-\theta\sum w_ix_i\le 0\),约束自动失效——只认配送费的口径下,这条稳健约束根本不必存在,这是它和题面口径的唯一结构性差别。
2.4 规模与性质
15 个 0-1 变量、4 条约束、107 次求解全部在根节点闭合,属"小模型、大结论"的类型。两条性质决定了全部结论:其一,打赏的跨单极差只有 0.34 元,远小于配送费极差 3.7 元,所以 \(\beta\) 只在"两单几乎等价"的边界上才可能翻转解;其二,打赏占比的表达式里 \(\theta\) 只出现在系数上,最优值是 \(\theta\) 的凹分段线性函数,拐点就在最优解自身的打赏占比处。
3 Gurobi 求解实现
3.1 建模要点
coef = W + beta * MU - lam * SD # 三种口径共用一条目标
m.addConstr(gp.quicksum(TT[i] * x[i] for i in range(15)) <= T, "time")
a_tip = (1 - theta) * beta * MU - theta * W # 打赏占比 <= theta 的线性化
m.addConstr(gp.quicksum(a_tip[i] * x[i] for i in range(15)) <= 0, "tipcap")
m.addConstr(gp.quicksum(x[i] for i in range(15) if IS_O[i]) <= off_cap, "off_cap")
m.setObjective(gp.quicksum(coef[i] * x[i] for i in range(15)), GRB.MAXIMIZE)
一个细节:占比约束若写成"\(\sum\beta\mu_ix_i\le\theta\cdot Z\)、\(Z=\sum(w_i+\beta\mu_i)x_i\)"会引入二次项,必须移项消去 \(Z\) 才能保持线性;移项后右端是常数 0,\(\theta\) 只进系数,扫描时无需重建约束,这也是后面能把 21 点细网格跑完的原因。
3.2 求解结果
表 2 四种口径的最优解与账面值
| 口径 | 目标系数 | 入选单数 | 最优值 / 元 | 配送费收入 | 目标中的打赏项 | 实际期望收入 / 元 |
|---|---|---|---|---|---|---|
| 期望打赏全额 | \(w_i+\mu_i\) | 8 | 66.65 | 64.47 | 2.18 | 66.65 |
| 只计五成 | \(w_i+0.5\mu_i\) | 8 | 65.56 | 64.47 | 1.09 | 66.65 |
| 只算配送费 | \(w_i\) | 8 | 64.47 | 64.47 | 0.00 | 66.65 |
| 等效确定性 | \(w_i+\mu_i-\sigma_i\) | 8 | 58.61 | 64.47 | -5.86 | 66.65 |
期望口径选 8 单:O1、O2、O3、O4、O7、R3、R4、R7;只算配送费选 8 单:O1、O2、O3、O4、O7、R3、R4、R7;只计五成选 8 单:O1、O2、O3、O4、O7、R3、R4、R7。三种口径给出同一个接单组合,差别只在账面。
4 结果分析
4.1 打赏长什么样:两个点、一条长尾

图 1 两类区域的打赏只有 0 元与 5 元(3 元)两个档位,期望值贴在坐标轴附近

图 2 15 单的收入—打赏方差:写字楼的方差是老小区的 10.4 倍
图 1 是全部结构:写字楼单的账户里只有 0 元(92%)与 5 元(8%)两个数,老小区只有 0 元(98%)与 3 元(2%);期望 0.40 元与 0.06 元落在离横轴 5% 高度的地方,与 7.5 元的配送费均线差了一个数量级。这就是"零膨胀":绝大多数时候它根本不出现,出现了也顶不上一单配送费的 67%。 图 2 把方差摆出来:写字楼打赏方差 1.84、标准差 1.36,老小区方差 0.18、标准差 0.42,而配送费方差为 0。零膨胀分布的方差不是"小噪声",它和均值同量级甚至更大——写字楼的变异系数 3.39,老小区 7.00,后者意味着老小区的打赏连"平均"这个概念都不成立。
4.2 三种口径:账面差 2.18 元,决策差 0 单

图 3 四种口径的最优值:全计打赏 66.6 元、五成 65.6 元、纯配送费 64.5 元

图 4 按配送费降序的累计收益:两层阶梯之间的缝就是打赏
图 3 的四根柱子把口径差摊开:全计打赏 66.65 元、五成 65.56 元、纯配送费 64.47 元,最大差额 2.18 元,占 3.3%。这个差额全部来自账面,不是来自决策——三种口径选出的单子一模一样(O1、O2、O3、O4、O7、R3、R4、R7),打赏的跨单差异只有 0.34 元,落不进任何一对候选单的取舍缝隙里。 等效确定性口径(\(\lambda=1\))下最优值掉到 58.61 元,比期望口径少 8.04 元——这正是"把打赏当风险资产"的定价:同样的单子,只因为打赏不确定,就折价 8.04 元。 图 4 把累计曲线拆成两层:虚线是配送费、实线含打赏,两条阶梯之间的缝隙逐单累积到 2.18 元,宽度恒定,说明打赏是"按单加价"而非"按单择时"。
4.3 计入比例与占比上限:约束为什么不咬人

图 5 打赏计入比例从 0 到 1,最优值线性抬升,占比始终低于 15% 上限

图 6 计入比例与占比上限的二维最优值:整片颜色由纵轴方向几乎不变
图 5 的主曲线是直线:\(\beta\) 每升 0.1,最优值升 0.22 元,斜率就是打赏总额 2.18 元的十分之一,与"打赏不改变组合"完全一致。右轴是打赏占比,从 0 升到 3.27%,全程压在 15% 的虚线之下,只到上限的三分之一。图 6 更彻底:横轴 \(\beta\)、纵轴 \(\theta\),颜色只在横方向上加深,纵方向从 0.00 到 0.05 几乎不变,只有最下面一行(\(\theta=1\%\))明显变浅。结论是:题面的 15% 不是约束,是 3 倍安全冗余;把它砍到 5%,最优值一分不掉(66.65 元不变),真正开始咬人的位置是 3.5%。
4.4 临界比例 3.5% 与影子价

图 7 风险厌恶系数每加 1,最优值掉 8.0 元,单均等效打赏在 0.29 处穿零

图 8 工时—最优值前沿:左侧阴影为老小区保供 3 单都排不下的不可行域
图 7 换了一个旋钮。\(\lambda\) 从 0 加到 2,最优值从 66.65 元掉到 50.57 元,掉幅 16.08 元;右轴的"单均等效打赏" \(\mu-\lambda\sigma\) 在 \(\lambda^{\ast}=0.29\) 处穿零,\(\lambda=1\) 时是 \(-0.96\) 元——一个负数的"收入项"。图 8 是工时前沿:\(T\) 从 60 min 拉到 420 min,最优值单调升到 108.99 元后不再动(15 单全接也不过 116.29 元),左侧阴影是"连老小区 3 单保供都排不下"的不可行域,边界在 79 min,本案 205 min 只比它高 126 min,安全垫很薄:工时再压 126 min,模型直接不可行,而不是少接一单。
关于影子价,两件事要分开说。第一,在 \(\theta\ge3.5\%\) 的区域,约束的松弛量是正的,影子价恒为 0,所以从 15% 收紧到 5%,最优值掉 0.00 元;连续松弛在 \(\theta=15\%\) 处的对偶值也是 0.000,两者一致。第二,进入 \(\theta<3.5\%\) 之后约束开始咬:\(\theta=3\%\) 时最优值 63.01 元、\(\theta=2\%\) 时只剩 50.73 元,2%$\to\(3\% 这一段每压 1 个百分点掉 12.3 元。再往下会撞墙:\)\theta$ 低于 0.8% 时模型不可行——老小区 3 单保供逼着接单,而每一单都带正的打赏期望,占比上限把它们全部否掉,可行域被清空。所以"把打赏清零"只能靠改 \(\beta\),不能靠改 \(\theta\)。
4.5 只认确定性收入要付多少钱

图 9 单均收益的零膨胀 CDF:92% 的概率停在配送费上,没有中间态

图 10 入选 8 单的配送费与打赏堆叠:打赏占比最高 4.0%
图 9 是零膨胀的直观形态:写字楼单的 CDF 在 8.0 元处先跳到 0.92,再在 13.0 元处跳到 1,中间没有任何台阶——没有"平均 8.4 元"这种状态,只有"8 元"和"13 元"。均值减一倍标准差为 \(7.04\) 元,比配送费本身还低 0.96 元。图 10 把 8 单逐单拆开:打赏占单均收入的比重在 1.0% 到 4.0% 之间,配送费是主项、打赏是零头。据此回答题面的最后一问:若只认确定性收入(把打赏当 0 计入目标),账面最优值从 66.65 元掉到 64.47 元,少记 2.18 元;但组合没变,实际到手仍是 66.65 元,真实损失 0.00 元。 换个更狠的问法——打赏单整单不接,只跑老小区:最优值只剩 40.83 元,掉 25.82 元(39%)。真正的代价在这里:不是"少算打赏",而是"少接写字楼"。按等效确定性排序(\(\lambda=1\))则介于两者之间,最优值 58.61 元,实际期望收入 66.65 元,风险折价 8.04 元全部记在账上而不落到口袋里。
5 结论
- 打赏可以记进账本,但不能记进决策。 期望 0.40 元只占单均收入的 5.3%,全计的账面值 66.65 元与只算配送费的 64.47 元差 2.18 元(3.3%),三种口径选出同一个组合——口径改的是账本,不是路线。
- 零膨胀让它比看上去更不可靠。 写字楼方差 1.84、变异系数 3.39,老小区方差 0.18、变异系数 7.00,而配送费的方差是 0。同样 0.4 元的均值,配送费是"确定到账",打赏是"92% 的概率为零"。
- 等效确定性把正数变成负数。 按 \(\mu-\lambda\sigma\) 折算,\(\lambda=1\) 时写字楼打赏是 \(-0.96\) 元、老小区 \(-0.36\) 元;临界 \(\lambda^{\ast}=0.29\),只要风险厌恶超过这个数,"期望打赏"就归零。
- 题面的 15% 是 3 倍冗余,不是约束。 实际打赏占比 3.27%,临界比例 3.5%,影子价为 0;从 15% 压到 5% 最优值一分不掉,压到 2% 才掉 15.92 元(每百分点约 12.3 元),压到 0 正好回到纯配送费口径。
- 只认确定性收入的真实代价是 0.00 元,但拒掉打赏单要付 25.82 元。 前者只是少记账(组合不变、钱照到账),后者是实打实少赚 39%。所以正确的做法不是"不算打赏",而是"照接、不指望":把 0.40 元当彩头,排序仍按配送费与工时。打赏能算进收益的唯一前提,是你本来就要跑这一趟。
参考文献
[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.
复现方式:python batch_083.py;数据与结果见同目录 .csv / .json,图见 figs/

浙公网安备 33010602011771号