案例 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

\[\mu_{\text{楼}}=0.08\times 5=0.40,\qquad \mu_{\text{村}}=0.02\times 3=0.06\tag{1} \]

两类的期望打赏见式 (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 目标函数

\[\max\ \sum_{i=1}^{15}\big(w_i+\beta\mu_i-\lambda\sigma_i\big)x_i\tag{2} \]

\(\beta=1\) 是题面口径(期望打赏全额计入),\(\beta=0.5\) 是折半口径,\(\beta=0\) 是只认确定性收入;\(\lambda\sigma_i\) 是风险折价,\(\lambda=0\) 时退化为期望值最大化。三个旋钮把"能不能算"拆成"算多少"与"敢不敢算"两个独立问题。

2.3 约束条件

\[\sum_{i}t_ix_i\le T=205\tag{3} \]

\[\sum_{i\in\text{楼}}x_i\le 7,\qquad \sum_{i\in\text{村}}x_i\ge 3\tag{4} \]

\[\sum_{i}\big[(1-\theta)\beta\mu_i-\theta w_i\big]x_i\le 0\tag{5} \]

式 (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 结论

  1. 打赏可以记进账本,但不能记进决策。 期望 0.40 元只占单均收入的 5.3%,全计的账面值 66.65 元与只算配送费的 64.47 元差 2.18 元(3.3%),三种口径选出同一个组合——口径改的是账本,不是路线。
  2. 零膨胀让它比看上去更不可靠。 写字楼方差 1.84、变异系数 3.39,老小区方差 0.18、变异系数 7.00,而配送费的方差是 0。同样 0.4 元的均值,配送费是"确定到账",打赏是"92% 的概率为零"。
  3. 等效确定性把正数变成负数。 按 \(\mu-\lambda\sigma\) 折算,\(\lambda=1\) 时写字楼打赏是 \(-0.96\) 元、老小区 \(-0.36\) 元;临界 \(\lambda^{\ast}=0.29\),只要风险厌恶超过这个数,"期望打赏"就归零。
  4. 题面的 15% 是 3 倍冗余,不是约束。 实际打赏占比 3.27%,临界比例 3.5%,影子价为 0;从 15% 压到 5% 最优值一分不掉,压到 2% 才掉 15.92 元(每百分点约 12.3 元),压到 0 正好回到纯配送费口径。
  5. 只认确定性收入的真实代价是 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/

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