案例 072 电池被偷了
案例 072 电池被偷了
摘要:沥滘村夜间电池被盗率约 1.20%/年,一块电池 780 元,一年期望损失 9.36 元。村里有两件东西可买:120 元的防盗锁把被盗率压到 0.3%,60 元/年的电池险赔 80%。把两件东西写成 0-1 变量,乘积项 \(z_{1}z_{2}\) 用辅助变量 \(w\) 线性化,模型只有 3 个 0-1 变量、5 条约束。四种组合算下来:都不买 9.36 元、只买险 61.87 元、只买锁 122.34 元、两样都买 180.47 元——最优是「什么都不买」,因为 9.36 元的期望损失连保费的零头都不到。真正的结论是三个临界值:险要到被盗率 9.62% 或电池价 6250 元才回本,锁要到 20.51%,本案 1.20%、780 元一条都没碰到;而锁在任何被盗率下都被险严格支配(更贵、削减更少)。两措施叠加只削减 8.89 元,比各自单干之和 14.51 元少 5.62 元——这正是次可加性,也是「都买最安全」在成本口径下站不住的原因。
关键词:0-1 规划;风险削减;乘积线性化;次可加性;保险精算;盈亏平衡
1 问题提出
1.1 问题是什么
外卖小哥的电动车停在沥滘村的巷子里,夜里电池被撬走。村口的经验数字是:一年里被偷的概率 1.20%,一块电池 780 元,折成期望损失 9.36 元/年。物业推销两样东西:
- 防盗锁:120 元一次性投入,把被盗率从 1.2% 压到 0.3%(削减 75%);
- 电池险:60 元/年,被偷后赔 80%(自担 20%)。
预算一年不超过 200 元。问题不是「买哪个」,而是「这套组合里到底有没有值得买的」——因为 9.36 元的期望损失,比任何一件商品的价格都低一个量级。
1.2 为什么要把两件事写进一个模型
第一条目的是避免「越安全越好」的直觉。安全是有效益的,但效益要能和成本放在同一天平上称:锁削减 7.02 元卖 120 元,险削减 7.49 元卖 60 元,两者的性价比差 2.13 倍。不写模型,这笔账很容易算反。
第二条目的是处理交互。两个措施不是简单相加:上了锁,被盗率已经降到 0.3%,此时再买险,险只能赔那 0.3% 里的 20%,边际作用被压扁。目标函数里的乘积项 \((1-0.75z_{1})(1-0.8z_{2})\) 就是用来捕捉这个「重合」的,它让模型自动算出叠加后的真实削减,而不是 75%+80%=155% 这种荒谬结果。
第三条目的是给出可执行的临界值。小哥真正想问的是「什么时候我才该买」。把被盗率和电池价格扫一遍,模型能回答:被盗率超过 9.62% 才该买险,电池涨到 6250 元以上才该买险(表 2)。
1.3 Gurobi 如何求解
模型是 3 个 0-1 变量(\(z_{1}\) 锁、\(z_{2}\) 险、\(w\) 乘积辅助)加 5 条线性约束的纯整数规划。Gurobi 先做系数预处理与界收紧,再由分支定界在 8 个格点上走一遍——实际连根节点都不用展开,因为它只有 4 个可行组合,一次枚举即得。真正的工作量在参数扫描:被盗率 7 点、险价×电池价 20 点、电池价 7 点、预算 6 点,合计 40 次求解,每次都在 0.01 s 量级,总求解墙钟 2 s。
2 数学模型
2.1 符号说明
\(z_{1}\in\{0,1\}\) 表示买锁,\(z_{2}\in\{0,1\}\) 表示买险;\(w\in\{0,1\}\) 是乘积辅助变量;\(V=780\) 元为电池重置价,\(p=0.012\) 为年被盗率;\(c_{1}=120\)、\(c_{2}=60\) 为两件商品的价格;\(r_{1}=0.75\)、\(r_{2}=0.80\) 为削减比例;\(B=200\) 为年预算;\(\lambda=Vp=9.36\) 为基准期望损失。
2.2 目标函数
第一项是锁的钱(一次性,按年摊),第二项是险的钱(年费),第三项是自担的期望损失:概率被打折两次,一次被锁(乘 0.25),一次被险(乘 0.2)。第三项写成乘积,说明两措施的削减不是相加而是相乘——这就是次可加性的来源。
2.3 线性化与约束
Gurobi 支持二次目标,但 \((1-0.75z_{1})(1-0.8z_{2})\) 展开后含 \(z_{1}z_{2}\),非线性项进目标会让模型变成非凸二次整数规划,求解器只能靠空间分支,本题规模小看不出代价,规模一大就崩。标准做法是令 \(w=z_{1}z_{2}\) 并加三条线性约束:
\(w\le z_{1}\) 与 \(w\le z_{2}\) 保证 \(w\) 不会超过两个因子的较小者,\(w\ge z_{1}+z_{2}-1\) 保证两个都买时 \(w\) 至少为 1;三条合起来,\(w\) 在 0-1 格点上恰好等于 \(z_{1}z_{2}\)。注意不能只写前两条:目标里 \(w\) 的系数是正的(\(0.6\lambda\)),最小化会把它压到 0,只写 \(w\le\) 会得到「两个都买但不算交互」的虚假便宜解,必须补下界那条。
预算是硬约束:
2.4 规模与性质
3 个 0-1 变量、5 条约束(3 条线性化 + 1 条预算 + 1 条隐含的 \(w\) 非负),4 个可行组合。这是一个可以手算的模型,它的价值不在求解难度,而在把「削减率」「保费」「预算」三个量放进同一套符号里,让临界值和次可加性都能被算出来,而不是被感觉出来。
3 Gurobi 求解实现
3.1 建模要点
z1 = m.addVar(vtype=GRB.BINARY); z2 = m.addVar(vtype=GRB.BINARY)
w = m.addVar(vtype=GRB.BINARY)
m.addConstr(w <= z1); m.addConstr(w <= z2); m.addConstr(w >= z1 + z2 - 1)
m.addConstr(C_LOCK * z1 + C_INS * z2 <= BUD)
m.setObjective(C_LOCK*z1 + C_INS*z2
+ LAM*(1 - 0.75*z1 - 0.8*z2 + 0.6*w), GRB.MINIMIZE)
一个实现细节:把 \(\lambda\) 提出来做公因子,目标里所有系数都是「元」,量级统一在 1—200 之间,Gurobi 的数值缩放不会报警;如果把 \(780\times 0.012\) 拆开写成三个系数相乘,预处理器要多做一轮化简,虽然本题无感,但换到 170 例里的多期版本就是隐患。
3.2 求解结果
表 1 四种措施组合的年成本分解(电池 780 元、被盗率 1.2%)
| 组合 | \(z_{1}\) 锁 | \(z_{2}\) 险 | 保费 /元 | 期望损失 /元 | 削减额 /元 | 削减率 | 合计 /元 |
|---|---|---|---|---|---|---|---|
| 都不买 | 0 | 0 | 0 | 9.36 | 0.00 | 0% | 9.36 |
| 只买险 | 0 | 1 | 60 | 1.87 | 7.49 | 80% | 61.87 |
| 只买锁 | 1 | 0 | 120 | 2.34 | 7.02 | 75% | 122.34 |
| 锁 + 险 | 1 | 1 | 180 | 0.47 | 8.89 | 95% | 180.47 |
表 1 的四行与手算逐位吻合(Gurobi 目标值 9.36 元,与穷举最小值差 0.0e+00)。模型选中 \(z_{1}=0,z_{2}=0\):9.36 元的期望损失,比最便宜的保险 60 元还低 6 倍多,任何措施都是亏本买卖。第二便宜的是只买险 61.87 元,第三是只买锁 122.34 元——锁比险贵一倍、削减还少 5 个百分点,这是第一个反直觉的结论。
4 结果分析

图 1 四种措施组合的年成本:灰段是期望损失,彩色段是保费,星标为最优
4.1 四组合的成本结构 图 1 把每个组合的「期望损失 + 保费」画成浮动棒棒糖:灰段是自担的风险,彩色段是买保障的钱。四个点依次是 9.36、61.87、122.34、180.47 元,最高与最低差 171.11 元。图形本身就在说:保费那一截远长于损失那一截,风险中性下买保险是净亏。

图 2 削减率—年成本气泡图:气泡面积是投入,越靠左下越划算
4.2 削减率—成本画像 图 2 横轴是削减率、纵轴是年成本、气泡面积是投入。四个点里,原点(9.36 元、0%)在左下,只买险(61.87 元、80%)在右上但气泡很小,两样都买(180.47 元、95.0%)在最右上且气泡最大。从 80% 到 95.0% 这 15 个百分点,要多付 118.60 元——边际上每多削减 1% 风险要花 7.91 元,是险前 80% 平均单价的 10.22 倍。

图 3 四方案成本分项:锁 120、险 60、期望损失随组合递减
4.3 四方案分项对比 图 3 把成本拆成锁、险、损失三块。都不买全是红(损失 9.36 元);只买险是 60 + 1.87;只买锁是 120 + 2.34;都买是 180 + 0.47。注意「都买」那一根柱子:保费 180 元已经占了总成本的 99.7%,再削减损失也只能省下 1.4 元——削减的边际收益被保费的天花板彻底压住。

图 4 十年累计支出四条线,以及不买方案按 5% 贴现的现值
4.4 十年累计 图 4 把账拉长到十年:不买累计 93.6 元、只买险 618.7 元、都买 1804.7 元。按 5% 贴现的不买方案现值只有 72.28 元,比名义值低 22%——贴现只会让「不买」更划算,因为它的支出全在将来,而保费今年就要掏。这也解释了一个常见误判:把「十年总要被偷一次」当成买险的理由,其实十年内至少被偷一次的概率只有 11.3%。

图 5 被盗率主灵敏度:四条成本线与模型选中的方案(双轴)
4.5 被盗率主灵敏度 图 5 左轴是四条成本线、右轴是模型选中的组合。在 1.20% 处,不买线(9.36 元)仍在最下方;随被盗率升到 9.62%,只买险线追上不买线,模型把方案从「都不买」翻到「只买险」——右轴的阶梯在 9.6%—14.4% 之间跳一格(临界 9.62%)。只买锁那条线(橙色)始终在只买险上方,永远没有翻身点:锁的斜率 0.25 大于险的 0.2,截距 120 大于 60,两条线平行且被压住,这就是严格支配的几何形态。两样都买的线(紫色)斜率最平(0.05)但截距最高(180),要到被盗率超过 102.6% 才可能反超,现实中不存在。

图 6 险价 × 电池价值的最优年成本热图,星标为本案参数
4.6 险价 × 电池价值 图 6 是 5×4 热图,行是电池重置价、列是险价。左下角(780 元、30 元)成本 9 元,右上角(12000 元、90 元)119 元,全网格 9—119 元。热图的等值线是斜的:电池越贵、保费越便宜,保险越值得买;沿着 780 元那一行自左向右(9 → 9 元)几乎不动,因为 780 元的电池根本不值得保。星标(60 元、780 元)落在左下角,是「最不该买」的那一格。

图 7 电池重置价(第三维)对最优成本与方案的影响
4.7 电池价值(第三维) 图 7 把电池价格单独拉出来:从 400 元到 9000 元,最优成本从 4.80 元升到 81.60 元,模型选中的方案在临界值之后从「都不买」换成「只买险」(虚线抬升、蓝线走平)。这个临界值就是 60/(0.8×0.012)=6250 元:电池涨到 6250 元时,60 元保费刚好等于它省下的 80% 期望损失。本案 780 元只有临界值的八分之一——不是保险不好,是这块电池太便宜。

图 8 成本—残余风险非支配前沿,灰区为超预算的不可行区
4.8 非支配前沿与不可行区 图 8 横轴残余风险、纵轴年成本,灰区是超过 200 元预算的不可行区。四个点里只有三个是非支配的(都不买、只买险、都买),只买锁被只买险严格支配:险更便宜(61.87 vs 122.34)而且残余更低(1.87 vs 2.34),它在图上落在险的右上方,是个永远不该被选中的点。预算在这里几乎不构成约束:最优解只花 0 元,预算从 200 收到 120、60 都不改变选择。只有把「残余不超过 2 元」当成硬指标时,预算才变成门槛——低于 60 元无解,恰好 60 元只够买险(1.87 元残余),180 元才买得起两样,可那是最贵的一条路。

图 9 十年内被盗次数分布与累计概率,橙点为加锁后的分布
4.9 十年被盗次数分布 图 9 是单车十年内被盗次数的泊松分布(均值 0.12 次):88.69% 的车一次都不会被偷,被偷一次的占 10.64%,两次以上只有 0.66%。加锁后(橙柱,均值 0.03)概率整体向左压,零次被盗的占比从 88.69% 升到 97.04%。十年至少被偷一次:无锁 11.3%、加锁 3.0%——这就是「小概率、大损失」的完整画像,也是保费定价能高于期望赔付 8 倍的市场基础。

图 10 各措施的削减额与保费对比,点线为单干之和
4.10 各措施的净贡献与次可加性 图 10 把削减额(绿)与保费(橙)并排。只买锁削减 7.02 元、付 120 元;只买险削减 7.49 元、付 60 元;两样都买削减 8.89 元、付 180 元。单干之和是 14.51 元,叠加却只有 8.89 元,少掉的 5.62 元(占 39%)就是重合部分:
重合项恰好等于 \(0.6\lambda\)——系数 0.6 就是 \(r_{1}r_{2}=0.75\times 0.8\)。次可加性的代数来源是「削减率相乘而非相加」,经济含义是「两种保护保的是同一块电池的同一笔损失,第二层保护只能保护第一层剩下的那部分」。这也是保险行业「共保条款」和「免赔额」存在的理由:多重保障的边际价值递减,定价必须按边际而非按全额。
4.11 风险厌恶口径下的对照
纯期望成本口径下答案是「不买」,但现实中很多人还是买了。把这种偏好写成约束——比如要求残余期望损失不超过 2 元/年——模型给出的最优是 只买险,61.87 元,残余 1.87 元;两样都买要 180.47 元,只为把残余从 1.87 元压到 0.47 元,多付 118.60 元买 1.4 元的安心。这就是「风险厌恶的定价」:愿意为确定性付多少溢价,是偏好问题,不是优化问题;模型能做的是把这个溢价算清楚,让人知道自己买的是安心而不是收益。
5 结论
- 本案最优是什么都不买,9.36 元/年。 期望损失 9.36 元,低于任何一件商品的售价;四组合里 9.36 < 61.87 < 122.34 < 180.47(表 1、图 1)。这不是「不该防」,而是「这块 780 元的电池不值 60 元的保费」。
- 锁被险严格支配,可以直接从选项里划掉。 险 60 元削减 80%,锁 120 元削减 75%:更便宜、削减更多、残余更低(图 8)。任何被盗率、任何预算下锁都不会被选中——这是本案唯一可以用「支配」而不是「权衡」来下的结论。
- 临界值比结论更有用:险要到被盗率 9.62% 或电池价 6250 元才回本(式 5、图 5、图 7)。 本案 1.20%、780 元,分别只到门槛的 12% 和 12%。把这两个数记住,换城市、换车型都不用重算。
- 两措施叠加是次可加的,重合 5.62 元(式 6、图 10)。 单干之和 14.51 元,叠加只有 8.89 元,差的部分恰是 \(r_{1}r_{2}\lambda\)。「都买最安全」在安全上成立,在成本上不成立;预算 200 元全部买保障,只换来 1.4 元的额外削减。
- 保费是期望赔付的 8.01 倍(险)与 17.09 倍(锁),这是风险中性的必然结果。 保险卖的是「把小概率大损失换成确定的小支出」的效用,不是期望值的套利。风险厌恶者该买,风险中性者不该买;模型算不出你是哪一种,但能算出这个溢价有多贵(4.11 节:118.60 元买 1.4 元安心)。
参考文献
[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_072.py;数据与结果见同目录 .csv / .json,图见 figs/

浙公网安备 33010602011771号