案例 157 夜里看不见:1.67 元的灯,5.6 元与 18.1 元的账
案例 157 夜里看不见:1.67 元的灯,5.6 元与 18.1 元的账
摘要:夜宵班 22:00—01:00,无路灯路段事故率翻倍。加装尾灯与反光条 60 元、寿命 36 个月,摊到每月 1.67 元;题面给的期望风险增量是 5.6 元/月。按题面口径,装是划算的:净省 3.93 元/月、一年 47 元、回报 3.36 倍。但本案例的价值在第二层:这 5.6 元只算了车辆小碰擦,没算人。补上"被追尾致伤"(年概率 0.5%、单次 3 万元,折 12.5 元/月)后,风险变成 18.1 元/月,回报升到 10.86 倍,回本期从 10.7 个月缩到 3.3 个月。第三层是"看不见"的双向性:反光只让别人看见你,并不让你看见路面;把尾灯 25 元、反光条 20 元、头灯 80 元做成预算 120 元的 0-1 组合选择,最优解是尾灯+头灯(120 元,恰好顶格),三件全上要 140 元、装不下。安全装备的回报不在 3 倍,通常在 3—11 倍之间;倍数高低几乎完全由"损失怎么算"决定。
关键词:0-1 背包;安全装备 ROI;损失口径;期望值与尾部;双向可见性
1 问题提出
1.1 问题是什么
外卖小哥跑夜宵班,22:00 到 01:00,三个小时里路灯时有时无。无路灯路段的事故率是有路灯路段的 2 倍,占全程的 25%。加装尾灯与反光条一共 60 元,能用 36 个月。题面给的算账方式只有一行:
表 1 题面账目核对(元/月)
| 项目 | 算式 | 结果 | 口径 |
|---|---|---|---|
| 装备月摊 | \(60/36\) | 1.67 | 3 年直线摊销,不计残值 |
| 风险增量 | 题面给定 | 5.6 | 只含车辆小碰擦 |
| 净省 | \(5.6-1.67\) | 3.93 | 每月净收益 |
| 年净省 | \(3.93\times12\) | 47.2 | 摊到一年 |
| 投资回报 | \(5.6/1.67\) | 3.36 | 每 1 元换回的风险削减 |
算术没有问题:\(60/36=1.6667\),\(5.6-1.6667=3.9333\),乘 12 得 47.20 元,比值 3.36。问题不在算术,在 5.6 这个数只写了一半。
1.2 为什么要优化
其一,5.6 元/月是"财产损失"口径,把最贵的那一项漏掉了。 夜里无路灯路段最典型的不是刮花车门,是被后车追尾——骑手没有尾灯、没有反光,后车在 40 m 外根本看不见。这一项的期望值把人命折成钱之后,是小碰擦的两倍多。
其二,"看不见"是双向的,题面只算了一个方向。 反光条与尾灯解决的是"别人看见你";骑手自己看不见路面(坑洼、井盖、碎石、临时围挡)导致的自摔,一件也解决不了。这两件事的物理机理不同、装备不同、失效方式也不同,必须分开建模。
其三,预算是一个组合问题,不是"买不买"。 尾灯 25 元、反光条 20 元、头灯 80 元,加 15 元工时,预算 120 元。三件全上 140 元,超 20 元——买哪几件、放弃哪一件,是要算的。
1.3 Gurobi 如何求解
四个模型,全部毫秒级:M1 题面单决策(1 个 0-1 变量,5.6 元口径);M2 换成含人身的 18.1 元口径,看结论会不会翻转;M3 三件装备的 0-1 组合选择(8 个候选组合 + 预算约束);M4 对无路灯占比、事故损失、装备寿命、预算做参数扫描。全部 15 次求解在 2 s 内跑完。
2 数学模型
2.1 符号说明
| 符号 | 含义 | 取值 |
|---|---|---|
| \(z\) | 是否加装反光装备 | \(\{0,1\}\) |
| \(c,\ T\) | 套装价格、寿命(月) | 60 元、36 月 |
| \(r_1\) | 小碰擦期望成本(题面) | 5.6 元/月 |
| \(r_2\) | 自摔期望成本(看不见路面) | 8.0 元/月 |
| \(r_3\) | 被追尾致伤期望成本 | 12.5 元/月 |
| \(\pi,\ L\) | 年致伤概率、单次损失 | 0.5%、3 万元 |
| \(\sigma\) | 无路灯路段占比 | 25% |
| \(y_i\) | 是否购买第 \(i\) 件装备 | \(\{0,1\}\) |
| \(p_i\) | 第 \(i\) 件单价 | 25/20/80 元 |
| \(e_{ik}\) | 第 \(i\) 件对第 \(k\) 通道的覆盖率 | 见 4.10 与图 10 |
| \(B\) | 装备预算 | 120 元 |
2.2 目标函数
题面模型只有一项成本、一项风险:
代入 \(c=60\)、\(T=36\)、\(r_1=5.6\),得 \(Z(1)=1.67\)、\(Z(0)=5.6\),差值 3.93 元/月。二阶结论立刻可见:只要 \(r_1>c/T\),即风险超过 1.67 元/月,\(z^{*}=1\);临界风险只有 1.67 元,而本案是它的 3.36 倍。
把致伤尾部并进来,风险项变成两项之和:
于是 \(Z'(0)=18.1\)、回报 \(\mathrm{ROI}=(r_1+r_3)T/c=10.86\)。同一件 60 元的装备,换个损失口径,回报从 3.36 跳到 10.86——这就是本案例真正的结论。 注意式 (2) 里 \(\pi L/12\) 与"每月出一次事的概率"无关:它是把"每年 0.5% 概率赔 3 万"这个两点分布压成一个平均数,均值 12.5 元,而单次冲击是它的 2400 倍。
2.3 约束条件
组合选择的预算是硬约束,工时只在"至少买一件"时收一次:
三个通道的残余风险按独立失效叠加,装备覆盖率取 \(1-\prod_{i}(1-e_{ik})\):
式 (4) 的乘法结构是本题的关键:两件装备在同一通道上互相冗余——反光条已经覆盖 85% 的"被看见",再加尾灯只补剩下的 14%。这就是为什么"单件回报 12.4 倍"不能线性外推到"两件 24.8 倍"。
2.4 规模与性质
M1、M2 各 1 个 0-1 变量、1 条预算约束,根节点闭合;M3 是 3 件装备的 0-1 背包,8 个候选组合、1 条预算约束,等价于 8 项枚举,Gurobi 同样在根节点给出最优;M4 的参数扫描共 15 次独立求解。模型虽小,但式 (4) 的非线性覆盖率使"逐件加总"失效,必须靠组合枚举或辅助 0-1 变量才能精确求解。
3 Gurobi 求解实现
3.1 建模要点
z = m.addVar(vtype=GRB.BINARY, name="z") # 装 / 不装
m.addConstr(cost * z <= budget, name="bud") # 预算约束
m.setObjective(cost * z + risk * (1 - z), GRB.MINIMIZE)
# 组合选择:8 个候选组合上选一个,Gurobi 只在可行组合里挑
lam = m.addVars(8, vtype=GRB.BINARY)
m.addConstr(gp.quicksum(lam[s] for s in range(8)) == 1)
m.addConstr(gp.quicksum(COST[s] * lam[s] for s in range(8)) <= budget)
m.setObjective(gp.quicksum((COST[s] / LIFE + risk_total - RED[s]) * lam[s]
for s in range(8)), GRB.MINIMIZE)
一个实现细节:\((1-z)\) 与 \(z\) 的系数一个正一个负,模型的目标只是在两个端点里挑小的,任何求解器都会在预处理阶段把它化成"比较两个常数"。这不是缺点——它的价值恰恰在于把"直觉"和"算账"放在同一个框架里,再把 \(r_1\) 换成 \(r_1+r_3\) 重跑一次,让结论的翻转自己显形。
3.2 求解结果
表 2 三种损失口径下的最优解与回报
| 口径 | 风险 / (元/月) | 装备 | 月成本 | 净省 | 回报倍数 | 回本期 |
|---|---|---|---|---|---|---|
| A 只算小碰擦(题面) | 5.6 | 60 元套装 | 1.67 | 3.93 | 3.36 | 10.7 月 |
| B 加被追尾致伤 | 18.1 | 60 元套装 | 1.67 | 16.43 | 10.86 | 3.3 月 |
| C 再加看不见路面 | 26.1 | 尾灯+头灯 120 元 | 3.33 | 17.72 | 6.31 | 5.7 月 |
口径 A、B 沿用题面"装上就全效"的假设,口径 C 改用分项覆盖率(实测 81%),所以它的成本基准也换成了 120 元的最优组合——三个数不能直接横比倍数,要看"净省"那一列。
4 结果分析
4.1 结构:风险是装备成本的 8 倍

图 1 三类风险成本与三件装备的月摊成本
图 1 把两条账放在同一根横轴上。红色的三根是"不装"的月成本:小碰擦 5.6、自摔 8.0、致伤尾部 12.5,合计 26.1 元;蓝色的是装备摊薄:尾灯 0.69、反光条 0.56、头灯 2.22、工时 0.42,三件全上 3.89 元。**最便宜的一件装备(反光条 0.56 元/月)与最贵的一项风险(致伤 12.5 元/月)相差 22 倍**——这个量级差就是"安全装备 ROI 被低估"的全部来源。 ### 4.2 散点:风险随占比线性,装备成本是一条水平线
图 2 无路灯占比与风险成本(气泡=回报倍数),横线为装备月成本
图 2 三条曲线对应三种损失口径,全部过原点、斜率正比于占比:占比翻倍,风险翻倍。装备成本线 1.67 元是水平的一条——**与占比无关**。两者的交点就是临界占比:3 万元口径下约 2.3%,10 万元口径下只 0.9%。本案 25%,落在 1.67 元线的 10.9 倍高处,气泡面积也是三档里最大的。 ### 4.3 方案对比:尾灯+头灯 顶格 120 元
图 3 六种方案的每月总成本(装备摊薄 + 残余风险)
图 3 每根柱子都是"月摊 + 残余风险"。单装尾灯 13.42 元、单装反光条 17.94 元、单装头灯 19.85 元——**头灯单装最差,因为它解决的自摔通道最便宜,而它自己最贵**。60 元套装降到 12.19 元,尾灯+头灯再降到 8.38 元。三件全装能把总成本压到 7.35 元,但 140 元超预算 20 元,图 3 里没有它的位置:**预算不是"能花多少",是"必须放弃哪一件"。** ### 4.4 累计:第 4 个月回本
图 4 36 个月累计支出与回本点
图 4 三条线:不装每月赔 18.1 元,36 个月累计 652 元;60 元套装每月 1.67 元,累计 60 元;最优组合每月 3.33 元,累计 120 元。**两条装备线在第 4 个月与红线交叉**(60/18.1=3.3 月),之后全是净赚。阴影面积 592 元就是三年省下的钱,相当于 60 元本金的 9.9 倍。按题面 5.6 元口径,回本期是 10.7 个月,仍不到寿命的三分之一。 ### 4.5 主灵敏度:占比每翻一倍,回报翻一倍
图 5 无路灯占比对风险成本与回报倍数的影响
图 5 的横轴是无路灯占比,左轴是对数刻度的风险成本,三条线对应 1/3/10 万元口径,右轴是 3 万元口径下的回报阶梯。**回报对占比是线性的**:5% 时 2.2 倍,25% 时 10.86 倍,50% 时 21.7 倍。曲线与 1.67 元成本线的交点出现在 2.3%——**只要路线里有一成路段没灯、且损失按 3 万元算,这笔投资就已经回本。** 反过来,若占比低到 2.3% 以下且只算小碰擦,装不装确实无所谓,而这正是很多人"觉得没必要"的真实原因。 ### 4.6 二维分区:最悲观的格点也有 2.3 倍
图 6 无路灯占比 × 事故损失的回报倍数分区
图 6 是 5×3 的回报分区。左上角(占比 10%、损失 1 万元)最冷:2.3 倍;右下角(50%、10 万元)最热:56.7 倍,跨度 24 倍。**整张图没有一个格子低于 1.5 倍,最低也有 2.3 倍。** 也就是说,"要不要装"这一层根本不需要讨论;真正需要讨论的是"按哪个口径算"——同一件装备在格子里能读出 2.3 到 56.7 倍、跨度 24 倍的差别。蓝框是本案(25%、3 万元、10.9 倍),落在图的中间偏上。 ### 4.7 第三维:寿命越短,口径的差别越致命
图 7 装备寿命对回报倍数的影响(三条口径)
图 7 把寿命从 12 个月拉到 60 个月。三条线都过 $\mathrm{ROI}=1$ 的回本点,但位置差得远:只算小碰擦时回本期 10.7 个月,含人身时只 3.3 个月。**寿命 36 个月是题面假设;若买到的是 12 个月就坏的劣质品,口径 A 的回报掉到 1.12 倍——这时"装不装"真的成了一个需要犹豫的问题。** 而口径 B 在同样寿命下还有 3.6 倍。右轴的净收益(36 个月、3 万元口径)随寿命线性上升到 1026 元。 ### 4.8 前沿:120 元是预算与削减的夹角
图 8 投入—风险削减的帕累托前沿与超预算阴影
图 8 把 8 种组合画在"一次性投入—风险削减"平面上。**前沿是一条台阶**:35 元买反光条削 9.13 元/月,40 元买尾灯削 13.79,60 元两件削 15.58,120 元尾灯+头灯削 21.05。**三件 140 元能削到 22.63,但落在红色阴影里**(超预算 20 元),只能看不能买。图中每个点的斜率就是边际回报:反光条 9.4 倍、尾灯 12.4 倍、头灯 3.4 倍——**头灯斜率最平,但它是唯一能治"自摔"的那一件**,这就是预算约束下必须做的取舍。 ### 4.9 分布:39% 的年份一分钱不赔
图 9 年小事故次数的分布与累计概率(不装 vs 最优组合)
图 9 用泊松计数模拟 40 万个骑手年(期望 0.34 次小碰擦 + 0.60 次自摔):不装时 39% 的年份一次都不出事,37% 出一次、17% 两次;装尾灯+头灯后零事故年份升到 89%。**期望值把这条分布压成了一个数**:18.1 元/月听上去不痛不痒,可现实里没有人每月赔 18.1 元——人是 39% 的概率赔 0、0.5% 的概率赔 3 万。两条阶梯是累计概率:在 0 次处绿线已经到 89%、红线只有 39%,**差的这 50 个百分点就是 60 元买到的"没事"**。 ### 4.10 分解:三件装备各治一个通道
图 10 三件装备的风险削减按通道分解与单件回报
图 10 把每件装备的削减拆成三段。尾灯 13.79 元里 5.04 治"被看见"、8.75 治"被追尾"、治不了路面;反光条 9.13 元结构相同但更弱;头灯 8.89 元里 6.80 治"看见路面",另外两段很薄。**单件回报(右轴菱形)排序是尾灯 12.4 > 反光条 9.4 > 头灯 3.4,但最优组合偏偏选了头灯而不是反光条**——因为尾灯已经覆盖了 90% 的"被看见",再加反光条只剩 8% 的增量,而头灯那条通道是 6.80 元的空白。**边际回报排序与单件回报排序不是一回事,这是背包和"逐件看 ROI"的分水岭。** ## 5 结论 1. 题面核对通过:$60/36=1.67$ 元/月,对 5.6 元/月,净省 3.93 元/月、一年 47 元、回报 **3.36 倍**。**只要无路灯占比超过 7.4%,这笔钱就该花。** 2. 加上"被追尾致伤"(0.5%/年 × 3 万元 = 12.5 元/月)后,风险变 18.1 元/月,回报升到 **10.86 倍**,回本期从 10.7 个月压到 3.3 个月。**同一件装备、同一笔钱,只是把"人"算进去,回报翻了 3.2 倍。** 3. 回报高度依赖损失口径:图 6 的 15 个格点从 2.3 倍到 56.7 倍,**最悲观的情形也有 2.3 倍,高于 1.5 倍的下限**。所以"安全装备值不值"这个问题本身没有唯一答案,只有"按哪个口径算"的答案。 4. "看不见"是双向的:反光条与尾灯让别人看见你,头灯让你看见路面,两者不能互相替代。预算 120 元下的最优解是 **尾灯+头灯(120 元)**,削 21.05 元/月、总成本从 26.10 降到 8.38 元;三件全上 140 元超预算 20 元,多花 20 元只多削 1.59 元/月,边际回报 2.9 倍——**不是不值,是这一格预算买不到。** 5. 落到动作:60 元的尾灯加反光条先装(题面口径 3.36 倍、分项全通道 9.3 倍),有余钱再加头灯补照明;**别用"我骑得慢"替代这笔账,也别用"只算小碰擦"的 3 倍低估它**。真正的数字在 3—11 倍之间,而它之所以被低估,是因为算账的人从来没把"被追尾"这一行写进去。 ## 参考文献[1] Gurobi Optimization LLC. Gurobi Optimizer Reference Manual[Z]. 2024.
[2] Kellerer H, Pferschy U, Pisinger D. Knapsack Problems[M]. Berlin: Springer, 2004.
[3] 司守奎, 孙玺菁. 数学建模算法与应用[M]. 3 版. 北京: 国防工业出版社, 2021.
[4] 姜启源, 谢金星, 叶俊. 数学模型[M]. 5 版. 北京: 高等教育出版社, 2018.
复现方式:python batch_157.py;数据与结果见同目录 data_157.csv / results_157.json,图见 figs/

浙公网安备 33010602011771号