案例085 9000 元到底能不能挣到

案例085 9000 元到底能不能挣到

摘要:把时间、体力、单量密度、罚款期望全部放进一个弹性模型,只问一句:9000 元可不可行。日均在线 10.5 h × 密度 3.1 单/h 给出单量天花板 32.55 单,满格日净额 111.68 元,对 26 天折出的日目标 346.15 元欠 234.47 元/天、6096 元/月。弹性模型最优值 \(z^* = 234.47 > 0\) 即目标不可行;computeIIS() 的极小不可行集只有目标约束与单量天花板两条。逐约束松弛定出四条临界线:单量 74.42 单、密度 7.09 单/h、在线 24.0 h、均单净收益 12.80 元——在线时长这条路物理上走不通,密度才是真正的卡点。给定不可行,用一个 4 变量小 MILP 求最省补救:投入 121.4 元/天买回 234.8 元/天(1.93 倍),补救后日净额 388.5 元;边际性价比排序为降固定 > 减罚款 > 延时长 > 提密度,但容量排序相反,缺口 75% 只能由密度承担。蒙特卡洛显示:贴着临界值做方案,达标率只有 50%。

关键词:可行性诊断;弹性模型;不可行子系统;影子价;最小代价补救;蒙特卡洛

1 问题提出

「一个月挣 9000」这句话,上一集(案例 073)已把它拆成 26 天、每天 346.15 元。那一集追问缺口该怎么分摊;这一集只问一句更硬的话:这个缺口存不存在,9000 元到底挣不挣得到。

把全部约束一次放进来:日均在线 10.5 h、有效单量密度 3.1 单/h,日单量就有一个物理天花板 \(n \le \rho T_0 = 3.1\times 10.5 = 32.55\),日净额 \(\pi_0 = b n - p - F\)。均单净收益 5.6 元、日均罚款 8.0 元、日均固定支出 62.6 元(租金 850/26 + 换电 199/26 + 餐费杂项),三项一算,满格日净额只有 111.68 元,离 346.15 元差 234.47 元,折月 6096 元。这不是排班问题,是先要判定目标是否成立的问题。

表 1 参数、派生量与临界值

项目 符号 取值
日均在线 \(T_0\) 10.5 h
单量密度 \(\rho\) 3.1 单/h
单量天花板 \(\rho T_0\) 32.55 单
均单净收益 \(b\) 5.6 元
日均罚款 \(p\) 8.0 元
日均固定支出 \(F\) 62.6 元
日目标 \(T\) 346.15 元
满格日净额 \(\pi_0\) 111.68 元
日缺口 \(s^-\) 234.47 元
月缺口 \(26s^-\) 6096 元

弹性模型的价值就在这里:它不假设目标可达,而是让「差多少」变成一个带单位的数。

2 数学模型

2.1 弹性(目标规划)模型

设日单量 \(n\),一对非负偏差 \(s^+\)(超达成)与 \(s^-\)(欠达成),把目标写成约束、由偏差吸收差额:

\[\begin{aligned} & b\,n - p - F + s^- - s^+ = T \\ & \min\; s^+ + s^- \quad \text{s.t.}\quad 0 \le n \le \rho T_0,\; s^\pm \ge 0 \end{aligned} \tag{1} \]

由式 (1) 得 \(s^- - s^+ = T - (bn - p - F)\):欠达成时取 \(s^+ = 0\)、\(s^- = T - bn + p + F\),反之取 \(s^- = 0\)。两个偏差不会同时为正——同减一个正数仍可行且目标更小,与最优性矛盾——互补性是内生的,不需要 0-1 变量。目标值因此有直接读法:\(z^* = 0\) 表示可达,\(z^* > 0\) 表示不可达且 \(z^*\) 就是缺口本身。

2.2 不可行判定与 IIS

弹性模型的 \(s^-\) 可以无限大,永远可行,所以「不可行」只体现在目标值上。为了拿到 Gurobi 的诊断信息,另建无弹性模型:\(b n - p - F \ge T\) 且 \(0 \le n \le \rho T_0\)。它返回 INFEASIBLE 时调用 computeIIS() 得到极小不可行约束集;若 IIS 只有两条约束,说明目标与天花板直接对撞,中间没有任何可调空间。

2.3 临界值与影子价

把式 (1) 的上限松开一单,目标值下降 \(b\),故单量约束的影子价 \(|\pi| = b = 5.6\) 元/单,等价于每小时在线值 \(\rho b = 17.36\) 元。令 \(s^- = 0\) 解出四条临界线:

\[n^* = \frac{T + p + F}{b},\quad \rho^* = \frac{n^*}{T_0},\quad h^* = \frac{n^*}{\rho},\quad b^* = \frac{T + p + F}{\rho T_0} \tag{2} \]

2.4 最小代价补救 MILP

不可行不是终点。设四类补救的档数 \(y_k \in \mathbb{Z}_{+}\)、单档效果 \(e_k\)、单档代价 \(c_k\):

\[\min \sum_{k=1}^{4} c_k y_k \quad \text{s.t.}\quad \sum_{k=1}^{4} e_k y_k \ge s^-,\; 0 \le y_k \le u_k \tag{3} \]

档数取整使式 (3) 成为小整数规划(4 变量、档数上限之和 43),灵敏度比 \(e_k/c_k\) 就是「每花一元买回多少净额」,可直接排序。

2.5 与案例 073 的分工

073 问「偏差怎么摊到 26 天」,前提是偏差已知;本案问「偏差存不存在」,输出是一个数 \(s^-\)。分工是:085 定缺口的量,073 定缺口的位置。085 给出 \(s^- > 0\) 时,073 的最优解只是在分摊一个注定填不满的坑。

3 Gurobi 求解实现

三个模型共用一套参数,Gurobi 默认设置即可,单次求解均在 0.1 s 内(共 95 次求解、总耗时 1.5 s,含绘图)。

def elastic(ncap):                       # 弹性模型
    n, sp, sm = (m.addVar(lb=0) for _ in range(3))
    m.addConstr(b*n - p - F + sm - sp == T, "goal")
    m.addConstr(n <= ncap, "cap")
    m.setObjective(sm + sp, GRB.MINIMIZE)

m2 = hard_model(); m2.optimize()         # 无弹性:只判可行
if m2.Status == GRB.INFEASIBLE: m2.computeIIS()

computeIIS() 给出的约束名直接进入结果文件(results_085.json 的 iis 字段)。逐约束松弛扫描则把 cap 右端从 24 单抬到 81 单、每次重解弹性模型,看 \(s^-\) 何时归零——两条路径互为验证。

4 结果分析

4.1 缺口有多大


图 1 日收支瀑布与缺口棒棒糖(毛收入 → 罚款 → 固定支出 → 日净额 → 目标)

图 1 把一天的钱走了一遍:32.55 单 × 5.6 元 = 182.3 元毛收入,扣罚款 8.0、扣固定 62.6,落到 111.68 元;目标线在 346.15 元,棒棒糖的杆长 234.47 元。缺口率 67.7%——不是差一点,是差一半以上。


图 2 单量—日净额关系与目标线(气泡=所需在线时长,颜色=所需密度)

图 2 的直线是 \(\pi = 5.6n - 70.6\),斜率 5.6。它穿过 346.2 元需要 \(n^* = 74.42\) 单,现状上限只有 32.55 单,中间空着 41.87 单;气泡沿直线变大,越往右所需在线时长越离谱(74.4 单 ÷ 3.1 单/h = 24.0 h/天,一天只有 24 h)。

4.2 IIS:卡住目标的是哪条约束

无弹性模型返回 INFEASIBLE,computeIIS() 给出的极小不可行集是 goal、cap,只有两条:目标约束与单量天花板。意即除这两条之外,其他约束全部删掉模型仍然不可行——缺口不是「哪个参数没调好」,而是 \(b\rho T_0 < T + p + F\) 这个结构事实。逐约束松弛扫描给出同一结论的另一侧面:上限从 32.55 单逐单放宽,\(s^-\) 在 \(n = 75.0\) 单处归零(扫描按 1 单取整,与式 (2) 的 74.42 单一致);在线时长每 0.5 h 抬高一次,要到 24.5 h 才归零。

表 2 单变量临界值(单动一个、其余不变)

杠杆 现状 临界值 差距 能否单独救
单量密度 3.1 单/h 7.09 单/h +129% 理论可行、现实罕见
在线时长 10.5 h 24.0 h +13.5 h 一天没这么多小时
固定支出 62.6 元/天 小于 0(不可达) 差 171.9 元 否(降到 0 仍差)
均单净收益 5.6 元/单 12.80 元/单 +129% 需换品类/平台

这张表是本案的核心证据:题面说卡点是单量密度而非在线时长,实验证实了——但只对了一半。时长这条路要 24.0 h,物理上死;密度这条路要 7.09 单/h,虽也只有旺季核心商圈摸得到,至少在同一量级。固定支出与罚款更惨,单独走永远走不通:把 62.6 元固定支出全砍光,日净额也只到 174.28 元,仍差 171.87 元。


图 3 现状 / 延时至 13 h / 提密度 / 组合补救 的日净额

图 3 把四条路径的量级摆平:只延到 13 h 补 43.4 元/天(\(2.5 \times 3.1 \times 5.6\),正是影子价 × 增量,仅占缺口的 19%),只把密度提到 6.1 补 176.4 元,两者都单独不够,组合补救才越过目标线。

4.3 26 天怎么烂掉的


图 4 26 天累计净额 vs 累计目标:缺口线性扩大

图 4 是缺口的另一种看法:两条直线从原点出发,斜率差 234.47 元/天,26 天后张开 6096 元。线性扩大本身就是结论——它不来自某几天的意外,而是每天重复的结构。补救方案的斜率(点划线)在 388.5 元/天处越过目标线,26 天累计 10100 元,超出 1100 元。

4.4 灵敏度:密度与时长谁更值钱


图 5 单量密度 → 月净额(左轴)与达标所需在线时长(右轴)

图 5 左轴是直线:每 +0.1 单/h 值 5.88 元/天、153 元/月;右轴是双曲线:密度 3.1 需 24.0 h,密度 4.0 需 18.6 h,密度 5.0 需 14.9 h。密度的杠杆是乘性的(同时乘进每小时单量与每单收益),延时的杠杆是线性的(每小时 17.36 元)——救急该先提密度。


图 6 密度 × 时长 的月净额热图(红线为 9000 元等值线)

图 6 把两个杠杆放进同一张网格。9000 元等值线是一条反双曲线:(7.09, 10.5)、(4.0, 18.6)、(5.0, 14.9) 都在线上。本案的星号落在左下深色区,离红线极远;单纯向上加时长最多爬到 14 h,仍在深色区里——竖直方向的空间不够,必须向右。


图 7 第三维:罚款期望对临界密度的影响(三条在线时长曲线)

图 7 加进第三个参数。罚款每多 1 元/天,临界密度抬 \(1/(5.6\times 10.5) = 0.017\) 单/h;在线 10.5 h 时罚款从 8 元涨到 20 元,临界密度从 7.09 抬到 7.29。三条曲线几乎平行,说明罚款与密度近似线性可替换:多罚 12 元/天约等于多要 0.20 单/h。

4.5 最小代价补救


图 8 补救的帕累托前沿与缺口未补齐区(红底)

图 8 的阶跃线是「按性价比从高到低买」的前沿:横轴累计投入,纵轴累计补上的净额,红底是缺口未补齐区,前沿穿过 234.5 元水平线的最右点就是 MILP 的解。MILP 的组合是:密度 +3.0 单/h(30 档)、时长 +2.5 h(5 档)、固定支出 −12 元(4 档)、罚款 −3.0 元(2 档),投入 121.44 元/天买回 234.80 元/天,回报 1.93 倍;逐项严格核算(含密度 × 时长的乘积效应)后日净额 388.48 元,超出目标 42.3 元。


图 9 罚款期望波动下的月净额分布与可行性概率(4000 次抽样)

图 9 把罚款的日间波动(标准差 2 元)与市场密度波动(标准差 0.15 单/h)叠进来。临界密度方案的月净额均值为 9000 元,恰好压在目标线上,达标率只有 50%——参数刚好卡在门槛上时,可行性是一枚硬币;补救方案均值 10100 元,达标率 100%。贴着临界值做方案等于赌博,必须留安全余量。


图 10 补救效果分解:现状净额 + 四类措施堆叠(下排数字为性价比)

图 10 是补救的结构。四类措施的性价比(元效果/元投入)排序为 2.86(降固定)> 2.42(减罚款)> 2.17(延时长)> 1.84(提密度),可容量恰好相反:固定与罚款买满也只贡献 18 元/天,密度一档就值 5.88 元、买满 176.4 元。所以最省的组合一定是「先捡便宜的小钱,再用密度填大坑」:2 档罚款 + 4 档固定只花 5.44 元却贡献 15.0 元,剩下 176.4 元(占 75%)只能靠密度。性价比决定先做什么,容量决定最后靠什么。

4.6 与 073 的分工

073 的日缺口 61.55 元来自 62 单的体力上限,可以用「跑得更快」压缩;本案的 234.47 元来自 32.55 单的密度上限,而它是 10.5 h × 3.1 单/h 的乘积——两个因子都要动,所以更硬。顺序不能颠倒:先跑 085 判可行性,再跑 073 分偏差;反过来只会得到一份「分摊得很漂亮但根本填不满」的方案。

5 结论

(1)不可行:缺口 234.47 元/天、6096 元/月。 弹性模型最优值 \(z^* = 234.47\)(\(s^+ = 0.0\)、\(s^- = 234.47\)),\(s^- > 0\) 即目标不可达;相当于每天还要多跑 41.9 单。
(2)卡住目标的是单量约束,不是在线时长。 computeIIS() 的极小不可行集只有目标约束与单量天花板;逐约束松弛定出临界值:单量 74.4 单/天(= 密度 7.09 单/h),或在线 24.0 h/天。在线从 10.5 提到 13 h 只补 43.4 元/天(占缺口 19%)。按影子价,每多 1 单值 5.6 元,每多 1 h 在线值 17.36 元。
(3)最省的补救组合:密度 +3.0 单/h、时长 +2.5 h、固定 −12 元、罚款 −3.0 元,投入 121.4 元/天换回 234.8 元/天(1.93 倍),补救后日净额 388.5 元。边际效果排序为降固定 > 减罚款 > 延时长 > 提密度,容量排序相反,缺口 75% 必须靠密度补。
(4)可行性是概率而非事实:临界密度方案达标率 50%,补救方案 100%。9000 元不是一条线而是一个分布,贴着线跑等于赌罚款不超支。
(5)与 073 的分工:085 定缺口的量(234.47 元/天),073 定缺口的位置(26 天怎么摊)。先判可行性、再分摊偏差;顺序颠倒会得到一份精致但无用的日程表。


参考文献

[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_085.py;数据与结果见同目录 .csv / .json,图见 figs/

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