案例 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 目标函数

题面模型只有一项成本、一项风险:

\[\min\ Z=\frac{c}{T}z+r_1(1-z) \tag{1} \]

代入 \(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 倍。

把致伤尾部并进来,风险项变成两项之和:

\[r_1+r_3=r_1+\frac{12\pi L}{12}=\frac{\pi L}{12},\qquad r_3=\frac{0.005\times30000}{12}=12.50 \tag{2} \]

于是 \(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 约束条件

组合选择的预算是硬约束,工时只在"至少买一件"时收一次:

\[\sum_{i\in I}p_{i}y_{i}+15\,u\le B,\qquad y_{i}\le u,\quad \forall i \tag{3} \]

三个通道的残余风险按独立失效叠加,装备覆盖率取 \(1-\prod_{i}(1-e_{ik})\):

\[R_{k}^{\text{res}}=r_{k}\prod_{i\in I}(1-e_{ik})^{y_{i}},\qquad e_{ik}\in[0,1] \tag{4} \]

式 (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/

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