案例089 快 3 分钟值不值一条命

案例089 快 3 分钟值不值一条命

摘要:路口抢行省 2.4 min(按 0.2 元/min 折 0.48 元),事故概率由万分之一升到万分之三,一次事故期望损失 18000 元,每次抢行的期望增量成本 3.60 元,净成本 3.12 元。以 6 个路口的 0-1 变量 \(z_j\) 建 \(\min\sum\Delta c_j z_j\)、\(\sum z_j\le2\) 的模型,系数全正,最优解为全不抢、\(Z^{*}=0\)。穿透测算:临界事故损失 \(L^{*}=0.48/2\times10^{-4}=2400\) 元,只有当一条命只值 2400 元时抢行才划算。若"必须省 4 分钟"(\(\sum s_jz_j\ge4\)),最优改为风险最低的 J5、J6,总风险成本 4.68 元、净成本 3.88 元,仍高于认超时的 3.00 元;只盯省时则要 9.72 元。时间价值从 0.2 涨到 2.0 元/min,临界线从 2400 抬到 24000 元,临界时间价值 1.5 元/min(时薪 90 元)。

关键词:风险定价;临界事故损失;0-1 选择;时间价值;抢行

1 问题提出

1.1 问题是什么

晚高峰,一单还剩 4 分钟时限,前面 6 个路口。红灯 90 秒,逆行穿插过去能省两三分钟——"就这一次,不会那么巧"。这句话每个骑手每天要说几十遍,它的潜台词是:省下的 2.4 分钟是确定的,出事是"不会发生"的。

把这两件事放到同一把尺子上:一次抢行省 2.4 min,按 0.2 元/min 折 0.48 元;抢行使该路口的事故概率从万分之一升到万分之三,增量每万次多 2 次,一次事故的期望损失 18000 元(医疗、伤残、误工、车辆,按行业均值口径),于是每次抢行的期望增量成本是 3.60 元。0.48 元的确定收益,对 3.60 元的期望成本——收益不到成本的七分之一。

这个案例要算的不是"该不该快",而是"快"的市场价格是多少:要让你觉得抢行划算,一条命得便宜到多少钱?答案是 2400 元。全篇的结论只有一句:2400 元,约等于一台二手电动车的价钱;事故损失一旦按 1.8 万元计,抢行在经济上就不成立。

1.2 为什么要优化

三条理由。其一,"不会那么巧"不是概率判断:万分之三听上去很小,但一年 21600 次抢行就变成 4.32 次事故,小概率只有放到次数上才有意义。其二,收益与风险不同量纲:分钟折成角、事故折成万,不做同一把尺子就没法比,而人的直觉天然按"这次省了几分钟"记账。其三,赶时间是有价格的:临界损失 2400 元把"值不值"变成一个可以查、可以争论、也可以被推翻的数——只要你能证明事故损失低于这个数。

1.3 Gurobi 如何求解

建模为 6 个 0-1 变量、2 条约束的整数规划;无硬需求时系数全正,根节点即证 \(z\equiv0\);加覆盖约束后由分支定界在 0.00 s 内给出最优对;另用 \(2^{6}\) 个子集穷举复核(0.00 与 3.88)。二维分区(时间价值 × 事故损失)用解析判据 \(\Delta c_j<0\) 直接生成,与 Gurobi 逐点结果一致。

2 数学模型

2.1 符号说明

符号:路口 \(j=1,\dots,6\);抢行省时 \(s_j\)(1.8—2.8 min);时间价值 \(v=0.2\) 元/min;基线事故率 \(p_{0j}\)(0.6—1.2 次/万次)、抢行事故率 \(p_{1j}\);一次事故期望损失 \(L=18000\) 元;0-1 变量 \(z_j\);单趟最多抢行数 2;必须赶上所需省时 4 min;超时成本 3 元。

2.2 目标函数与约束条件

设第 \(j\) 个路口抢行省时 \(s_j\) 分钟,时间价值 \(v\) 元/min,基线事故率 \(p_{0j}\)、抢行事故率 \(p_{1j}\),一次事故期望损失 \(L\) 元;\(z_j\in\{0,1\}\) 表示该路口是否抢行。抢行的净成本(风险减收益)为

\[\Delta c_j=L\,(p_{1j}-p_{0j})-v\,s_j\tag{1} \]

基准口径下 \(p_{1j}-p_{0j}=2\times10^{-4}\)、\(s_j=2.4\)、\(L=18000\)、\(v=0.2\),得 \(3.60-0.48=3.12\) 元——正数。模型是

\[\min\ Z=\sum_{j=1}^{6}\Delta c_j z_j\quad \mathrm{s.t.}\ \sum_{j=1}^{6} z_j\le 2\tag{2} \]

目标系数全为正、约束是上界,故 \(z_j\equiv 0\) 是唯一最优解,\(Z^{*}=0\)。这不是模型没用,恰恰是它的用处:它把"大概不会出事"翻译成了 3.12 元/次的确定数字,让"全不抢"从一个道德结论变成一个可以复核的算术结论。

穿透测算。 令式 (1) 为零,得到临界事故损失

\[L^{*}=\frac{v\,s_j}{p_{1j}-p_{0j}}=\frac{0.48}{2\times10^{-4}}=2400\ \text{元}\tag{3} \]

即"只有当一次事故的期望损失低于 2400 元时,抢行才划算"。反过来解 \(v\),临界时间价值 \(v^{*}=L(p_{1j}-p_{0j})/s_j=1.5\) 元/min,折时薪 90 元/h——只有当你的 1 分钟值 1.5 元以上,抢行才在期望值上站得住。

若业务上必须抢。 一趟只剩 4 分钟余量时,"赶上"变成硬需求:

\[\min\ \sum_{j}\Delta c_j z_j\quad \mathrm{s.t.}\ \sum_{j} s_j z_j\ge 4,\ \ \sum_{j} z_j\le 2\tag{4} \]

单路口最多省 2.8 min,故约束逼出恰好 2 个路口;在 15 种组合里挑 \(\sum\Delta c_j\) 最小的那一对,就是"风险最低的两个"而不是"省时最多的两个"。

2.3 规模与性质

6 个 0-1 变量、2 条约束(上界与覆盖),无连续决策,属最简的 0-1 背包型问题。正因为小,它才能被完整复核:\(2^{6}=64\) 个子集穷举与 Gurobi 结果相差 0(数值零),说明全部结论都落在系数上而不是算法上。

3 Gurobi 求解实现

3.1 建模要点

6 个 0-1 变量、2 条约束、纯整数规划,单次求解 0.00 s 以内,根节点即收敛。

m.addConstr(gp.quicksum(z[i] for i in range(n)) <= 2, name="kmax")
m.addConstr(gp.quicksum(S_J[i] * z[i] for i in range(n)) >= sreq, name="cover")
m.setObjective(gp.quicksum(cost[i] * z[i] for i in range(n)), GRB.MINIMIZE)

代码里没有任何技巧,全部工作量在系数怎么来:18000 元是含伤残与误工的期望值,不是"赔个餐费";\(p_{1j}-p_{0j}\) 是同一路口抢行前后的差,不是全市平均;\(v\) 用的是 0.2 元/min(时薪 12 元)而不是"时间无价"。三个数各错一处,结论就会翻。

校验。 子集只有 \(2^{6}=64\) 个(含超过 2 个的),穷举可得两个场景的最优值 0.00 与 3.88,与 Gurobi 相差 0(数值零)。表 1 是逐路口明细。

表 1 六个路口的抢行参数与净成本(时间价值 0.2 元/min,损失 1.8 万元)

路口 名称 省时 / min 基线率 / 万次 抢行率 / 万次 风险成本 / 元 省时收益 / 元 净成本 / 元 必抢 2 个时
J1 体育东路 2.4 1.0 3.6 4.68 0.48 4.20 —
J2 棠下 BRT 2.0 0.8 2.6 3.24 0.40 2.84 —
J3 科韵路 2.6 1.1 3.9 5.04 0.52 4.52 —
J4 客村立交 2.8 1.2 4.4 5.76 0.56 5.20 —
J5 昌岗 1.8 0.6 1.8 2.16 0.36 1.80 选中
J6 区庄 2.2 0.7 2.1 2.52 0.44 2.08 选中

表 1 已经能读出全部结构:净成本从 1.80 到 5.20 元全为正,最"便宜"的昌岗也要 1.80 元——省 1.8 min 换 2.16 元风险,仍然亏。

3.2 求解结果

无硬需求:\(z_j\equiv0\),\(Z^{*}=0.00\) 元,0.00 s。加覆盖约束:\(z=[0 0 0 0 1 1]\),\(Z^{*}=3.88\) 元,省时 4.0 min、总风险 4.68 元。两个解都不是"求解器挑的",而是系数决定的——把任何一路口的 \(\Delta c_j\) 改到负,最优解立刻翻,这正是后文灵敏度要回答的问题:什么条件下它会翻。

4 结果分析

4.1 结构:收益是零头,风险是整头

图 1 六个路口"抢行收益(上方绿)vs 事故期望成本(下方红)"棒棒糖,风险处处压过收益

图 1 把两个量画在同一根竖线上:向上的绿棒是省时收益(0.48 元级),向下的红棒是事故期望成本(3.60 元级)。红棒长度是绿棒的 7 倍,六个路口无一例外。这张图是本案例的"体检报告":不是某个路口特别危险,而是收益与风险量级不同——用分钟计价的东西,去对赌用万元计价的东西。

图 2 节省时间—事故期望增量成本散点(气泡大小为增量事故率,两虚线为不同时间价值下的等收益线)

图 2 换个切法:横轴省时、纵轴风险,气泡大小是增量事故率。两条虚线是不同时间价值下的"等收益线"(\(y=v s\)),点落在线上方就意味着风险高于收益。本案 6 个点全在 0.2 元/min 线之上,高出 6—10 倍;即便把时间价值抬到 1.5 元/min(最陡的那条),也只有区庄、昌岗两个点落到线下方,其余四个仍在线上。"我很急"这个理由,要在 1.5 元/min 以上才开始有一点算术支撑。

4.2 决策:三个方案与一趟的账

图 3 三种方案的净成本对比:认超时、只盯省时抢 2 个、模型选风险最低 2 个

图 3 是决策图。全不抢付 3 元超时成本(扣半程配送费 2.5 元 + 差评折算 0.5 元),风险为 0,净成本 3.00 元;只盯省时抢 2 个(客村 + 科韵,省 5.4 min 最多)净成本 9.72 元;模型选风险最低 2 个(J5、J6,省 4.0 min)净成本 3.88 元。三个数字的排序说明两件事:其一,抢行本身是亏的——只要抢,最低也要 3.88 元,比认超时贵 0.88 元;其二,真要抢,选哪两个差 5.84 元(9.72 对 3.88),这就是模型在硬约束下仍然值钱的地方。

表 2 三种方案的净成本(一趟配送,需省 4 分钟才算赶上)

方案 抢行路口 省时 / min 省时收益 / 元 事故期望成本 / 元 超时成本 / 元 净成本 / 元
全不抢(认超时) — 0 0 0 3.00 3.00
只盯省时抢 2 个 J4、J3 5.4 1.08 10.80 0 9.72
模型选风险最低 2 个 J5、J6 4.0 0.80 4.68 0 3.88

图 4 一趟配送的累计风险(左轴)与累计省时(右轴),模型方案在第 5、6 个路口才补满 4 分钟

图 4 把一趟配送摊开:横轴是途经路口,左轴累积风险、右轴累积省时。模型方案把两个名额押在最后两个路口(J5、J6),风险曲线在第 5、6 段才抬起来,累计 4.68 元;右轴的省时阶梯直到 J6 才越过 4 min 的需求线。"后置抢行"是这类问题的通用形状:先把低风险的路口用完,风险预算留到最需要的时候——但本案的结论是连这份预算都不该花。

4.3 主灵敏度:越急越危险

图 5 时间价值对临界事故损失(左轴)与"划算路口个数"(右轴)的影响

图 5 的斜线是式 (3) 的临界损失 \(L^{*}=12000v\):时间价值从 0.2 涨到 2.0 元/min,临界线从 2400 元抬到 24000 元,整整 10 倍。这条线越陡,"愿意用多高的代价换 1 分钟"的标准就越松——经济学上这叫时间价值的影子价格,口语里就叫"越急越危险"。本案的 1.8 万元水平线与它交在 \(v=1.5\) 元/min,右侧才是抢行的"理性区"。右轴阶梯同理:v 到 1.15 元/min 时第一个路口(区庄)翻正,1.20 时第二个(昌岗)翻正,之后受 \(\sum z\le2\) 封顶,一路停在 2 个。

图 6 时间价值 × 事故损失 的最优抢行个数分区(星号为本案 0.2 元/min、1.8 万元)

图 6 把两个参数摊成平面:横轴时间价值、纵轴事故损失,颜色是最优抢行个数。分界是一条从左上到右下的斜带,右上是"越急、命越贵"的双重危险区,本案星标 (0.2, 18000) 落在灰区(0 个)深处,离最近的分界线还有 5 倍以上的余量。结论对参数不敏感——这不是"卡在临界点上"的脆弱结论。

4.4 第三维与前沿:哪个路口先翻

图 7 第三维:六个路口各自的临界损失线,与 1.8 万元水平线的交点即翻正点(J1 与 J3 几乎重合)

图 7 把"路口"作为第三维:六条临界线斜率各不相同,斜率 \(s_j/(p_{1j}-p_{0j})\) 就是"这个路口值不值得冒险"的性价比。昌岗、区庄两条最陡(省时相对多、增量风险相对小),分别在 1.20 与 1.15 元/min 处越过 1.8 万元;客村最缓(增量风险 3.2 次/万次,是昌岗的 2.7 倍),要 2.06 元/min 才翻——省时最多的路口恰恰是最不该抢的那个,这是直觉最容易错的地方。

图 8 省时—风险的帕累托前沿(阴影为前沿下方不可达区,虚线为必须省够 4 分钟)

图 8 是省时—风险的帕累托前沿:横轴省时、纵轴风险,每个点是一对路口的组合。前沿在 4—5.4 min 之间陡然上翘——多省 1.4 分钟要多付 6.12 元风险,边际交换比 4.37 元/min,是时间价值 0.2 元/min 的 22 倍。阴影是前沿下方不可达区:想省 4 min 又把风险压在 4.68 元以下,没有这样的组合。左上角那个"零风险拿满 5.4 min"的理想点被整片阴影隔开,这就是"没有免费的时间"的几何形态。

4.5 分布、分解与"一条命的价格"

图 9 一次事故期望损失的分布与累计概率,2400 元临界值落在分布左尾之外

图 9 处理一个常被忽略的问题:1.8 万元只是均值。用对数正态描述实际赔付(医疗+伤残+误工,中位 16267 元、长尾到 4 万元以上),临界值 2400 元落在分布的极左尾——2 万次抽样里,低于 2400 元的事故出现 0 起。"抢行划算"要求你相信一起事故只赔 2400 元,而这种事故在现实中几乎不存在。均值决策已经偏向不抢,分布决策只会更坚决。

图 10 逐路口的省时收益与事故成本分解(最右为最优 2 个路口的合计)

图 10 把每个路口的账拆成两根柱:绿柱 = 省时收益,红柱 = 事故成本,菱形 = 净额。六根绿柱加起来 2.76 元,只有红柱合计 23.40 元的 12%。最右一组是模型选中的两个路口合计:收益 0.80 元、成本 4.68 元、净亏 3.88 元。

把尺子再放大一次:一天 30 趟、每趟都抢 2 个,一年 21600 次抢行——省下的时间值 10368 元,期望事故成本 77760 元,净亏 67392 元,等价于每年 4.32 起事故。这个量级已经超出"个人风险偏好"的范畴:它不是骑手在自己身上赌,是把 67392 元的账摊给了路上的每一个人。

5 结论

(1)抢行在期望值上就是亏的:省时收益 0.48 元/次,事故期望成本 3.60 元/次,净成本 3.12 元/次;6 个路口 \(\sum z_j\le2\) 的 0-1 模型最优解为全不抢,\(Z^{*}=0\)。模型的价值不在于得出这个"显然",而在于把"大概不会出事"写成 3.12 元。
(2)穿透测算给出主结论:临界事故损失 \(L^{*}=v s/(p_1-p_0)=2400\) 元。只有当一条命只值 2400 元(一台二手电动车)时,抢行才理性;按 1.8 万元计,差 7.5 倍。等价地,临界时间价值 1.5 元/min(时薪 90 元),目前 0.2 元/min,差 7.5 倍。
(3)必须抢时选风险最低的两个:约束 \(\sum s_j z_j\ge4\)、\(\sum z_j\le2\) 下最优为 J5、J6,总风险成本 4.68 元、净成本 3.88 元;只盯省时会选客村+科韵,净成本 9.72 元,多付 5.84 元买 1.4 分钟。模型即便在最不利的假设下仍有 5.84 元的价值,但仍不如认超时(3.00 元)。
(4)越急越危险有价格:\(v\) 从 0.2 到 2.0 元/min,临界损失从 2400 抬到 24000 元(10 倍);六条路口临界线的交点分别落在 1.15—2.06 元/min,省时最多的客村反而最后翻正。二维分区(图 6)显示本案参数离分界线有 5 倍余量,结论不脆弱。
(5)结论是不抢行:一年 21600 次抢行省 10368 元、赔 77760 元,净亏 67392 元、等价 4.32 起事故。抢行是本模型明确否定的选项——不是因为"不该违规"这句口号,而是因为它在算术上就不划算:用 3.60 元的期望成本,去换 0.48 元的确定收益。


参考文献

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

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