案例 152 头盔与检查点:15% 的抽查率,撑不起"不戴"的账
案例 152 头盔与检查点:15% 的抽查率,撑不起"不戴"的账
摘要:客村立交设点查头盔,未戴罚 50 元、覆盖率 15%/天,戴头盔闷热折 1.0 元/天,题面给事故风险增量 3.2 元/天。0-1 模型只有一档变量 \(z\),法规约束 \(z=1\) 先把可行域钉死,目标函数只做事后解释。核对全部通过:不戴的日成本 \(0.15\times 50+3.2=10.7\) 元/天,戴 1.0 元/天,不戴亏 9.7 元/天、年亏 2522 元(260 个出勤日)。但题面的 3.2 元/天需要重算:按 127 的重伤口径(\(576\) 元/年),日均只有 1.58 元,题面值是它的 2.03 倍,差额只能来自"头部轻伤 + 误工 + 差评"这些 127 没算的项。换成 127 口径,不戴 9.08 元/天、年亏 2100 元,结论不变。真正的增量在检查点的博弈性:覆盖率从 15% 提到 30%、50%,罚款期望从 7.5 翻到 15、25 元,但即使罚款为 0,事故风险 1.58 元/天 仍高于闷热成本 1.0 元/天——合规的安全理由独立于执法强度。闷热成本要涨到 10.7 元/天才可能出现"账面不戴",而那个区间的结论不可采纳。
关键词:0-1 合规决策;执法概率;期望成本;口径复核;安全优先
1 问题提出
1.1 问题是什么
交警在客村立交设点查头盔:不戴当场罚 50 元,但不是每天都查,覆盖率 15%;戴头盔闷热、压发型,折算 1.0 元/天。骑手要在"每天花 1 元忍着"和"每天赌 15% 被罚 50 元"之间做选择,另外还要算上不戴时的事故风险增量。
表 1 题面参数与三项核对(元/天;算术无误,问题在 3.2 的口径)
| 项目 | 算式 | 结果 | 性质 |
|---|---|---|---|
| 罚款期望 | \(0.15\times 50\) | 7.5 | 转移支付,不消灭价值 |
| 事故风险增量(题面) | 直接给定 | 3.2 | 真实社会成本 |
| 事故风险增量(127 口径) | \(576/365\) | 1.58 | 只含头部重伤 |
| 闷热成本(戴) | 直接给定 | 1.0 | 真实个人成本 |
| 不戴合计 | \(7.5+3.2\) | 10.7 | vs 戴 1.0 |
1.2 为什么这值得建模
第一,罚款与风险不是一类东西。罚款是从骑手口袋到财政口袋的转移,社会总福利不变;事故风险是真实的血肉成本,谁也不想要。两者在个人账本上加得起来,但只有后者能决定"该不该戴"——这正是检查点博弈性的要害:交警提高覆盖率,改变的是转移支付的大小,不是安全需求的大小。
第二,"算完账再决定"的顺序是错的。把这个问题交给只认目标函数的求解器,它会在参数被抽空时翻脸:罚款 0、风险 0,它立刻选 \(z=0\)(见 3.2 节)。一个随参数翻转的结论,不能用来决定要不要戴头盔,所以模型里先写 \(z=1\)。
第三,口径必须复核。同一件事,127 算出 576 元/年(1.58 元/天),题面写 3.2 元/天,差 2.0 倍。差在哪、结论会不会变,必须算清楚。
1.3 Gurobi 如何求解
模型只有一个 0-1 变量、一条约束(\(z=1\)),目标是一条两点直线,求解是常数时间。真正的计算量在反复解:基准 1 次、口径对照 4 次、覆盖率扫描 9 次、闷热扫描 3 次、决策网格 42 次、罚款档 3 次,共 135 次 MIP,每次都在毫秒级,总求解时间不到 1 秒。扫描点全部重新建模,不套解析式——这样"换一个参数就换一个模型",避免手推公式和代码走岔。
2 数学模型
2.1 符号说明
| 符号 | 含义 | 本案取值 |
|---|---|---|
| \(z\) | 是否佩戴头盔,0-1 | 决策变量 |
| \(p\) | 检查点覆盖概率(每天被查) | 0.15 |
| \(F\) | 未戴单次罚款 / 元 | 50 |
| \(h\) | 头盔闷热成本 / (元/天) | 1.0 |
| \(r\) | 事故风险增量 / (元/天) | 3.2(127 口径 1.58) |
| \(D\) | 年出勤日 / 天 | 260 |
2.2 目标函数
不戴的日成本是罚款期望与事故风险之和,戴的日成本只有闷热一项:
模型求 \(\min c(z)\)。把 \(z\) 取 0 与 1 代进去,两条直线只差一个截距:
2.3 约束条件
法规约束把可行域砍成一个点:
为了看"只算钱"会走到哪里,另设一个无约束对照模型(不加式 (3)),它的解只用于解释,不用于决策:
账面翻转的两个临界值由 \(\Delta=0\) 解出:
年化把日成本乘出勤天数,两种口径的年账差就是口径差乘天数:
2.4 规模与性质
1 个 0-1 变量、1 条约束、1 个目标项。这个模型小到不需要求解器,它演示的是"约束先于目标"这件事:式 (3) 一旦写入,\(z=1\) 与参数取什么值无关;目标函数只负责回答"如果只算钱,会怎样"。案例 127 已经用同一个结构讲过一遍(\(z=1\) 管合规、目标管解释),本案把同一结构推到"执法概率"这一维上。
3 Gurobi 求解实现
3.1 建模要点
z = m.addVar(vtype=GRB.BINARY, name="z")
if legal: m.addConstr(z == 1) # (3) 法规
m.setObjective(z * heat + (1 - z) * (p * fine + risk), GRB.MINIMIZE)
实现细节:legal 开关只控制那一条约束,其余全部复用。同一个函数被调用 135 次,参数换、模型换、代码不换;这样"127 口径"和"题面口径"跑的是同一个模型,只是 \(r\) 不同,比较才干净。二维热图用解析式铺色(\(\Delta\) 是 \(p\)、\(h\) 的线性函数),网格点再用 Gurobi 逐个复核,两者一致。
3.2 求解结果
表 2 六个模型的解与成本(元/天)
| 模型 | 约束 | 参数 | 最优 \(z\) | 最优成本 | 合规 | 可否采纳 |
|---|---|---|---|---|---|---|
| 基准 | \(z=1\) | 题面 | 1 | 1.00 | 是 | 采纳 |
| 只算钱 | 无 | 题面 | 1 | 1.00 | 是 | 佐证 |
| 只算钱 | 无 | 127 口径 | 1 | 1.00 | 是 | 佐证 |
| 只算钱 | 无 | 罚款 0、风险 1.58 | 1 | 1.00 | 是 | 佐证 |
| 口径抽空 | 无 | 罚款 0、风险 0 | 0 | 0.00 | 否 | 不可采纳 |
前四行都选 \(z=1\):题面口径省 9.7 元/天,127 口径省 8.08 元/天,罚款归零、只留 127 口径风险仍省 0.58 元/天,题面口径则省 2.2 元/天。只有最后一行——把罚款和风险同时抹成 0——求解器才选 \(z^{\mathrm{money}}=0\)。那不是"可以不戴"的证据,是"模型里没有安全"的证据:参数被抽空后它当然只看见 1 元的闷热。所以式 (3) 必须在,且必须在目标之前。
4 结果分析
4.1 结构:1 元与 10.7 元

图 1 戴与不戴的日成本构成(闷热、罚款期望、事故风险)
戴的成本是一根 1.00 元的短棒;不戴是三根棒:罚款期望 7.5、事故风险 3.2,合计 10.7。10.7 对 1.0,差 9.7 元/天,一年(260 天)2522 元。注意三根棒里最长的那根是罚款期望——但它是转移支付,真正沉没的是 3.2 元那根。
4.2 数据全景:覆盖率是斜率,安全是截距

图 2 检查覆盖率与不戴日成本(气泡为年化成本,横线为戴的 1 元)
覆盖率每加 10 个百分点,不戴的日成本涨 \(0.1\times 50=5\) 元,年化涨 1300 元;但这条线的截距(覆盖率 0 处)不是 0,是 3.2 元。图 2 里两条线(题面 3.2 与 127 口径 1.58)都比 1 元线高,一条高出 2.2,一条高出 0.58。斜率是执法强度,截距是安全需求,后者不随前者变。
4.3 方案对比:翻倍的罚款,翻不出结论

图 3 不戴、戴、覆盖率 30%、罚款 0 四种情形的日成本
覆盖率 30% 时不戴 18.2 元/天(罚款期望 15 元,是本案的两倍),覆盖率 50% 是 28.2 元。但把所有罚款拿掉,不戴仍然 3.2 元/天(题面口径)或 1.58 元/天(127 口径),都高于 1 元。罚得越狠只是把"亏"放大,罚得不狠也不改变方向——方向由截距决定,不由斜率决定。
4.4 时序:一年下来差多少

图 4 365 天累计成本:不戴与戴两条直线
两条直线从原点分叉,260 个出勤日差 2522 元,365 个日历日差 3540 元。直线之所以这么"干净",是因为期望值把"某天被查"抹成了均匀斜率;真实账本是一条阶梯——大部分天贴着 1 元走,某天突然跳 50 元。这个平滑同样是期望制造的幻觉,第 4.9 节把它还原成分布。
4.5 主灵敏度:闷热涨到 10.7 元才翻脸

图 5 闷热成本与罚款额对「是否戴」的影响
把闷热成本从 0.5 拉到 12 元:只要 \(h<10.7\),戴就一直便宜;越过 10.7 元/天(相当于"闷到愿意每天掏 10.7 元买凉快"),账面才翻。罚款档越低,这条临界线越低:罚款 20 元时临界 6.2,罚款 200 元时临界 33.2。本案 \(h=1\),离临界还差 9.7 元,安全垫很厚。
4.6 二维分区:什么参数组合才会算出不戴

图 6 闷热成本 × 检查覆盖率的决策分区(圆圈为 Gurobi 判定的不戴格点)
分界线是 \(h=pF+r\):题面口径(黑实线)从 \((0,\,3.2)\) 出发,127 口径(红虚线)从 \((0,\,1.58)\) 出发。"账面不戴"只出现在左上角——闷热极高、执法极松。本案 \((0.15,\,1.0)\) 的星标落在分界线右下(色块转浅红,意为不戴更贵),离分界线 9.7 元的垂直距离。这块左上角区域即便出现"不戴"的算账结论,也不可采纳:它成立的前提是把安全成本压到零或把闷热成本夸到不真实。
4.7 第三维:执法强度只改斜率

图 7 不同罚款额下,不戴比戴多花的年化金额随覆盖率的变化
三条线在 \(p=0\) 处交于 150 元/年——这是"交警一个都不查"时的净损失,来自纯事故风险(127 口径 1.58 元/天减 1 元)。覆盖率越高线越陡,罚款 200 元在 15% 覆盖下已是 7950 元/年(该曲线后段出界)。这个截距为正,才是我要的结论:合规的安全理由独立于执法强度。 交警撤点,账还是这么算。
4.8 前沿:唯一的零风险端点,也是最低成本

图 8 年化成本—年化风险暴露平面上的可行点与被支配区
横轴年化成本、纵轴年化风险:戴是 \((260,\,0)\),不戴含罚款是 \((1950,\,410)\),覆盖率 30% 时更贵。前沿不是点,是一条权衡线——α(合规比例)每降一点,省下的闷热钱都换成风险,斜率是 \(410/1690\),即"每省 1 元换 0.24 元风险"。两个"不戴"点落在线右侧(阴影区),同风险下更贵,被支配。但这不是"部分戴更优"的论据:α 由法规决定,可行域只有 α=1 这一个端点,线上的中间解对本案不可达;更何况"看情况戴"在事故面前等于没戴——风险不打折,闷热却一天都没省。
4.9 分布:最幸运的一年也不划算

图 9 一年被罚次数随机时的年成本分布与累计曲线
一年 260 天、每天 15% 被查,被罚次数 \(K\sim B(260,\,0.15)\),均值 39.0 次、P90 46 次。年成本 \(50K+410\) 的均值 2359 元、P10 2010、P90 2710。关键一行:\(P(\text{不戴年成本}<260)=0%\)——即使一次都没被查(概率 \(0.85^{260}\),小于万分之一),不戴也要 410 元,仍高于戴的 260 元。尾部风险不是"被罚",是"没被罚也亏"。
4.10 分解:3.2 与 1.58 差在哪

图 10 三种口径下的日成本分解(闷热 / 罚款期望 / 事故风险)
127 的 576 元/年只算了头部重伤:\(0.008\times 0.6\times 120000\),折 1.58 元/天。题面 3.2 是它的 2.03 倍,多出的 1.62 元/天只能来自 127 没建模的项:头部轻伤(缝针、牙、脑震荡观察)、误工(一天不跑就少一天收入)、差评与超时扣款。三项目前没有独立标定,所以"3.2 是含轻伤与误工的口径、1.58 是只含重伤口径"是目前最省事的解释,它意味着 3.2 更接近骑手的真实账,1.58 是保守下界。取保守下界,不戴仍是 9.08 元/天,年亏 2100 元——结论对口径不敏感。
5 结论
- 核对通过:不戴 10.7 元/天、戴 1.0 元/天,不戴亏 9.7 元/天,年亏 2522 元(260 个出勤日;按 365 天是 3540 元)。题面的 7.5 + 3.2 = 10.7 实算无误。
- 口径必须复核:3.2 与 127 的 1.58 差 2.03 倍。 127 只含头部重伤(576 元/年),3.2 应含轻伤、误工、差评。换成 127 口径,不戴 9.08 元/天、年亏 2100 元,仍应戴。
- 执法强度不是理由。 覆盖率 15%/30%/50% 对应罚款期望 7.5/15/25 元/天,只改变"亏多少";罚款为 0 时事故风险 1.58 元/天 仍高于闷热 1.0 元/天,年化多花 150 元。合规的安全理由独立于检查点。
- 账面翻转需要极端参数。 临界闷热成本 10.7 元/天(题面)、9.08 元/天(127 口径),是本案 1 元的 11 倍;临界覆盖率 \(p^{*}=-0.044<0\),即任何覆盖率下都不该不戴。闷热 0.5/1/3 元、罚款 20/50/200 元全部实测,决策全是"戴"。
- 必须戴,且是法规与安全的双重要求。 式 (3) 让 \(z=1\) 与参数无关;目标函数在 135 次求解里也几乎总是同意它(例外只有"罚款与风险同时归零"的空模型,那个解不可采纳)。规则与算账同向是最理想的情形,但同向是结果,不是依据——依据是 \(z=1\) 本身。
检查点会撤,风险不会撤,所以头盔不能摘:不戴 10.7 元/天,戴 1.0 元/天,一年差 2522 元;罚款全部拿掉、只用最保守口径,一年仍差 150 元。
参考文献
[1] Gurobi Optimization LLC. Gurobi Optimizer Reference Manual[Z]. 2024.
[2] Kahneman D, Tversky A. Prospect Theory: An Analysis of Decision under Risk[J]. Econometrica, 1979, 47(2): 263-291.
[3] 司守奎, 孙玺菁. 数学建模算法与应用[M]. 3 版. 北京: 国防工业出版社, 2021.
复现方式:python batch_152.py;数据与结果见同目录 data_152.csv / results_152.json,图见 figs/

浙公网安备 33010602011771号