案例 082 带个新人

案例 082 带个新人

摘要:平台"老带新",徒弟跑满 200 单奖 300 元,代价是 6 h 带教。题面把账算成 \(0.8\times 300-90-15=135\) 元,其中 90 元是 6 h 的时间机会成本——这笔成本必须显性化,否则 300 元奖励看起来是纯赚,实际只剩 45%。本案例做三件事。第一,把 135 元拆成可核对的瀑布:期望奖励 240 元、机会成本 90 元、沟通成本 15 元,并补上题面漏算的带教周拥挤损失 34.2 元,净收益落到 100.8 元。第二,把它扩成 4 周、名额 2 个的多期 MILP:\(z_t\) 决定第 \(t\) 周带不带,\(d_{1},d_{2}\le 3\) 保证 6 h 拆成两天,疲劳与拥挤进入目标,题面口径下最优带 2 个(第 2 周、第 4 周),净 176.6 元。第三,给完成率加分布:\(S\sim N(200,60)\) 时拿到奖的概率只有 50.0%,不是题面的 80%,期望奖励掉到 150 元,净收益只剩 10.9 元,最优带徒数回落到 1 个。临界完成率均值 \(194.5\) 单——门槛恰好压在均值上,这是本案例最脆的一环。

关键词:机会成本;老带新;多期 MILP;尾部风险;临界带教时长

1 问题提出

1.1 问题是什么

平台规则很短:老骑手带一个新徒弟,徒弟在考核期内跑满 200 单,师傅拿 300 元奖励;带教要花 6 h,这 6 h 不能跑单。题面给的参数是"6 h 损失约 90 元、被拒概率 20%、沟通成本 15 元",于是

  • 期望奖励 \(0.8\times 300=240\) 元,机会成本 \(6\times 15=90\) 元(15 元/h 的时薪口径);
  • 沟通成本 15 元(电话、示范、答疑),净收益 \(240-90-15=135\) 元。

135 元是题面自己的结论,本案例的第一件事是核实它:把 300 元拆到"每小时带教换多少钱",得 \(135/6=22.5\) 元/h,比跑单的 15 元/h 高 50%。真正的问题不在单价,在于这 6 h 是从 63 h 周工时里硬扣出来的,扣掉之后本周的单量、时段质量、冲单奖励全部受影响。表 1 列出全部参数。

表 1 参数与派生量

量 取值 来源 备注
带教时长 / h 6 题面 拆 2 天,每天 3 h
机会成本 / (元/h) 15 90/6 显性化的核心
周在线工时 / h 63(每天 3 h 上限) 9 h x 7 天 拥挤损失基数
拥挤折损率 0.04 本案假设 剩余工时效率下降
兑现率 / 沟通成本 0.80 / 15 元 题面 点估计,仅一次性
完成单量分布 N(200, 60) 本案假设 截断于 0

1.2 为什么要优化

第一,机会成本不显性化,账就是假的。 只写 \(300z-15z\) 会得到 285 元,把 6 h 当免费的;写成 \(0.8\times300z-90z-15z\) 才是 135 元。同一件事差 150 元,差的正是"时间值多少钱"这一句假设。第二,6 h 与 3 h/天 的组合把决策变成两天期耦合。 每天最多带 3 h,6 h 就必然跨两天;两天里各损失 3 h 的黄金时段,且第二天的体力已经被第一天消耗。要判断"值不值",就得把两天的收益曲线一起看,而不是把 6 h 当成一个可任意摆放的整块。

第三,一次带 1 个和连续带 2 个不是简单的乘 2。 第二个徒弟要和第一个抢同一段休息时间,边际疲劳成本上升;同时带教周越多,自己的单量被挤得越狠。带几个、什么时候带,是个 0-1 规划问题,不是乘法题。第四,200 单的门槛是硬门槛,完成率是随机变量。 题面用 20% 被拒把 300 元折成 240 元,隐含假设"完成率 80%"。若完成单量服从 \(N(200,60)\),均值正好压在门槛上,拿奖概率只有一半,期望奖励 150 元,净收益从 135 元掉到 10.8 元。同一个决策,换个分布就从"值得"变成"几乎不值得"。

1.3 Gurobi 如何求解

模型只有 3 个变量(\(z\)、\(h\) 与 \(d_{1},d_{2}\)),单次求解毫秒级:Gurobi 先做预处理把 \(h=6z\) 代入,\(h\le 3\) 变成 \(6z\le 3\) 的不可行信号,再由我们显式拆成两天;多期版本里 \(z_t\) 是 0-1,配对项 \(u_{st}\) 与连续项 \(y_t\) 用三条线性不等式紧化,分支定界在根节点即证最优。因为快,参数扫描可以做得密:带教时长 12 点、被拒概率 7 点、奖励额 7 点、完成率均值 \(\times\) 时长 4$\times$5 网格、蒙特卡洛 20 万样本,合计 12 次 MIP,墙钟不到 2 s。临界值不靠解析式硬套,而是对 Gurobi 目标值做二分,与闭式解互校。

2 数学模型

2.1 符号说明

\(z\in\{0,1\}\) 是否带教,\(h\ge0\) 带教总时长(h),\(d_{1},d_{2}\) 两天的带教时长,\(z_t\) 第 \(t\) 周是否开始带教,\(u_{st}\) 第 \(s,t\) 周都带教,\(y_t\) 连续两周带教,\(\pi\) 拿奖概率,\(S\) 徒弟完成单量,\(\mu,\sigma\) 其均值与标准差,\(\eta\) 拥挤折损率,\(\phi\) 疲劳成本。

2.2 目标函数

题面的单期模型是一条期望净收益:

\[\max_{z,h}\ \Pi=0.8\cdot 300\,z-15\cdot 6\,z-15\,z\qquad z\in\{0,1\}\tag{1} \]

把 \(15\cdot 6=90\) 写成 \(c_{o}h\)(\(c_{o}=15\) 元/h),机会成本就从"一个数"变成"一条斜率",带教每多 1 h 就多付 15 元:

\[\Pi(h)=240-15h-15-\eta c_{o}(63-h)\tag{2} \]

其中 \(\eta c_{o}(63-h)\) 是带教周里剩余 57 h 的效率折损(注意力被分走、路线被打断)。代入 \(h=6\)、\(\eta=0.04\):\(\Pi(6)=240-90-15-34.2=100.8\) 元。

2.3 约束条件

\[h=6z\tag{3} \]

\[h\le 3\ \Longleftrightarrow\ d_{1}+d_{2}=6z,\quad 0\le d_{1},d_{2}\le 3\tag{4} \]

\[\sum_{t=1}^{4}z_t\le 2,\quad u_{st}\ge z_s+z_t-1,\quad y_t\ge z_t+z_{t-1}-1\tag{5} \]

\[\max\ \sum_{t}\big(A z_t\big)-\phi\sum_{s<t}u_{st}-\phi_c\sum_{t}y_t,\quad A=\pi\cdot 300-c_{o}h-c_{c}-\eta c_{o}(63-h)\tag{6} \]

式 (3) 是题面的等式约束;式 (4) 是它和"每天 3 h"的冲突解——若只有一天,\(6z\le3\) 逼出 \(z=0\),所以必须引入两天变量,\(z=1\) 时两天各 3 h,这就是两天期耦合的来源;式 (5) 的 \(u_{st}\) 让"带两个"付出边际疲劳 \(\phi\),\(y_t\) 让"连着带"再付 \(\phi_c\);式 (6) 是四周期望净收益,\(A\) 是单个徒弟的边际贡献,题面口径下 \(A=100.8\)。

2.4 规模与性质

单期 3 变量 2 约束,多期 4 个 0-1 加 8 个连续变量、10 条线性约束,属"小到不需要 Gurobi、但正好把口径说清楚"的类型。关键性质有三条:其一,\(z=1\) 的最优 \(h\) 是角点,\(\Pi(h)\) 关于 \(h\) 单调递减(斜率 \(-15+0.6=-14.4\)),故有唯一临界 \(h^{\ast}=13.0\) h;其二,\(A>0\) 才带,\(A\) 关于 \(\pi\) 线性,于是临界拿奖概率 \(\pi^{\ast}=0.464\),对应临界被拒概率 \((1-\pi^{\ast})=53.6%\);其三,第二个徒弟只在 \(A>\phi\) 时进入,即期望奖励需超过 \(164.2\) 元,折成题面奖励额 \(205.2\) 元。

3 Gurobi 求解实现

3.1 建模要点

z = m.addVars(T, vtype=GRB.BINARY); d1 = m.addVars(T, ub=3.0); d2 = m.addVars(T, ub=3.0)
m.addConstrs((d1[t] + d2[t] == 6 * z[t] for t in range(T)), "split")   # 6 h 必须两天
u = m.addVars(pairs, vtype=GRB.BINARY)       # 两个徒弟共存
m.addConstr(u[k] >= z[s] + z[t] - 1); m.addConstr(u[k] <= z[s])
A = pi * 300 - 15 * 6 - 15 - eta * 15 * (63 - 6)
m.setObjective(A * z.sum() - phi * u.sum() - phi_c * y.sum(), GRB.MAXIMIZE)

两个细节。一是 \(d_{1}+d_{2}=6z\) 与 \(d\le3\) 同时写,Gurobi 才会在 \(z=1\) 时把 6 h 平均摊到两天;若只写 \(h=6z\) 和 \(h\le3\),预处理直接判不可行,模型会告诉你"这件事一天做不完"。二是 \(u_{st}\) 的三条不等式缺一不可:只写 \(u\ge z_s+z_t-1\) 会让 \(u\) 取 1 而不付代价以外的东西,加上 \(u\le z_s\)、\(u\le z_t\) 才把它钉死在"两个都带"上。

表 2 三种口径下的最优决策

口径 拿奖概率 期望奖励 / 元 单徒净收益 / 元 最优带徒数 最优周次 净收益 / 元
题面(20% 被拒) 0.800 240.0 135.0 1 第 2 周、第 4 周 100.8
题面 + 拥挤 0.800 240.0 100.8 2 第 2 周、第 4 周 176.6
尾部风险 + 拥挤 0.500 150.1 10.9 1 第 1 周 10.9

3.2 求解结果

题面口径下带 2 个更赚:176.6 元对 100.8 元,因为单徒边际 100.8 元仍高于疲劳 25 元,模型把两周排在第 2 周、第 4 周(间隔 2 周)以避开 \(y_t\) 的连续惩罚。换到尾部风险口径,单徒 10.9 元低于疲劳 25 元,第二个徒弟的净贡献变成负数,最优解退回 1 个、第 1 周,净收益 10.9 元。结论对"奖励额"极其敏感:按题面 80% 兑现率,\(B\ge205\) 元第二个就划算;按尾部 50% 兑现率,门槛抬到 \(328\) 元(图 6)。

4 结果分析

4.1 把 135 元拆开看

图 1 从 300 元奖励到 135 元净收益的四步瀑布:机会成本一项吃掉 90 元

图 1 是全部账目。期望奖励 240 元起跳,被拒折损 60 元、机会成本 90 元、沟通成本 15 元,累计落到 135 元。三项扣减里机会成本占 55%,是绝对主项。这也解释了为什么"带个新人"常被高估:奖励是显性的、当天到账,机会成本是隐性的、摊在每一小时里,不做显性化就看不见。 折成时薪,带教 \(135/6=22.5\) 元/h,跑单 15 元/h,溢价 50%——账面上仍划算,但不是 \(300/6=50\) 元/h 那么夸张。

图 2 五种口径的成本分解:拥挤与疲劳是题面没写的两项

图 2 把五项堆叠起来:从"不带"到"题面口径"多出 135.0 元,再计入 34.2 元拥挤损失掉到 100.8 元,换成尾部风险口径再掉到 10.9 元,带第二个时疲劳 25 元把总账压到 -3.3 元。四个台阶说明一件事:题面的 135 元不是终点,而是最乐观的那一端。

4.2 带教时长:临界 13 h,安全垫 7 h

图 3 带教时长每加 1 h 净收益掉 14.4 元,13.0 h 处归零

图 4 四条奖励水平下的净收益前沿,阴影为"不如不带"的区域

图 3 的斜率是 \(-c_{o}+\eta c_{o}=-14.4\) 元/h:每多带 1 h 多付 15 元工资,同时少损失 0.6 元拥挤(剩余工时更少)。零点在 \(h^{\ast}=13.0\) h,本案 6 h 留了 7.0 h 安全垫。气泡是"需要几天"——\(h\le3\) 一天、\(3<h\le6\) 两天、再往上三天,气泡在 6 h 处跳一级,正好是本案的位置。图 4 把奖励水平拉开:300 元线在 13.0 h 归零、240 元线 9.7 h、180 元线 6.3 h、150 元线 4.7 h,四条线的上包络即前沿。若平台把带教要求从 6 h 提到 10 h,只剩 300 元档站得住;提到 13 h,全线亏损。

4.3 被拒概率与奖励额:临界 53.6%

图 5 被拒概率每升 10 个点净收益掉 30 元,临界在 53.6%

图 6 奖励额扫描下最优带徒数的两级阶梯:278 元带 1 个、328 元带 2 个

图 5 的主曲线是线性的:\(\Pi(p)=300(1-p)-139.2\),斜率 \(-300\),即被拒概率每升 1 个百分点净收益掉 3 元。零点 \(p^{\ast}=53.6\%\),远高于题面的 20%,说明在"完成率确定"的假设下,被拒风险根本不是威胁。右轴是保本所需奖励额,20% 时只要 174 元,50% 时要 278 元。图 6 换了自变量:奖励额从 150 扫到 400,最优带徒数先在 \(278\) 元从 0 升到 1、再在 \(328\) 元升到 2,每上一级净收益斜率翻倍;低于 \(278\) 元模型选"不带",因为期望奖励盖不住 139.2 元固定成本。两个图的共同结论:决策的杠杆在"奖励额"和"完成率",不在"被拒概率"。

4.4 尾部风险:门槛压在均值上

图 7 $N(200,60)$ 下有一半徒弟跑不满 200 单,期望奖励只有 150 元

图 8 完成率均值与带教时长的二维净收益,黑线为零等值线

图 7 是本案例的转折点。门槛 200 单恰好等于分布均值,\(P(S\ge200)=0.500\),蒙特卡洛 20 万样本给 0.501,两者一致;红色柱合计 50.0%,对应的奖励期望 150 元,比题面的 240 元少 37.5%。图 8 把均值拉到 170—215 之间:\(\mu=170\) 时全图都是负值(除 \(h=3\) 的边缘),\(\mu=215\) 时整片转正,零等值线从右下穿到左上。临界均值 \(\mu^{\ast}=194.5\) 单,只比 200 低 5.5 单——留给"徒弟质量"的容错几乎为零。 这也解释了为什么老骑手会先观察几天再决定带不带:真正的风险不是被拒,是徒弟跑不满。

4.5 两天期耦合与调度

图 9 六种方案的净收益对比:最后一根为负,尾部口径下"多带一个"是负边际

图 10 带教后 14 天的日收益:前两天各掉 51.8 元,第 14 天奖励到账补回

式 (4) 的耦合在图 10 里看得最清楚:第 1、2 天各带 3 h,日收益从 135.0 元掉到 83.2 元(少 3 h 工时 45 元,再加 6.8 元拥挤),第 3 天起回到 128.2 元,第 14 天奖励 150 元一次性到账,累计曲线才反超。如果把 6 h 硬塞进一天,\(6>3\) 直接不可行;把两天拆开,第二天的体力又要打折——这正是"两天期耦合":不是两个独立的一天,而是一条被拉长、且首日损耗会传导到次日的决策链。 图 9 汇总六种口径:题面 1 个 135.0 元、题面 2 个 270.0 元、含拥挤 100.8 元、尾部 1 个 10.9 元、尾部 2 个 -3.3 元。最后一根为负,说明在风险口径下"多带一个"是负边际。

5 结论

  1. 机会成本必须显性化:300 元奖励的真实净额是 135 元,不是 285 元;90 元的机会成本占全部扣减的 55%,不做这一步,账就是假的。
  2. 题面的 135 元是最乐观的一端:计入带教周拥挤损失 34.2 元后是 100.8 元,再计入尾部风险是 10.9 元,三档相差 124.1 元。
  3. 带几个由边际决定:单徒边际 10.9 元低于疲劳成本 25 元时只带 1 个;奖励额越过 205 元(题面口径)或 328 元(尾部口径),第二个才回到正边际。题面口径下最优带 2 个、排 第 2 周、第 4 周,风险口径下退为 1 个。
  4. 临界值三条线:带教时长 \(h^{\ast}=13.0\) h(安全垫 7.0 h)、被拒概率 \(p^{\ast}=53.6\%\)(远高于 20%)、完成率均值 \(\mu^{\ast}=194.5\) 单(只低 5.5 单)。前两条安全,第三条危险。
  5. 6 h 与 3 h/天 的组合注定跨两天:单日上界把 \(z=1\) 逼出可行域,模型必须引入 \(d_{1},d_{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.


复现方式:python batch_082.py;数据与结果见同目录 .csv / .json,图见 figs/

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