案例097 夜里的治安风险

案例097 夜里的治安风险

摘要:23:00 后跑城中村,手机被抢概率上升。按题面口径 \(p_k=0.0008\rho_k\)、一次损失 2950 元(手机 2600 + 停业 350),单均风险成本为 \(2.36\rho_k\),五片区为 1.18—4.72 元/单,全部低于 5.60 元的单均收益,净收益零点在 \(\rho^{*}=2.37\),超出 0.5—2.0 的风险区间——所以在期望口径下,20 张单没有一张该拒。以 5 片区 × 4 单的 20 个 0-1 变量建 \(\max\sum\pi_k x_{ik}\)、限单 3 单、排班时长的模型:全接 57.25、限单 54.31、22 点后定价版 53.43、硬禁止版 51.67 元。硬禁止(\(\rho>1.5\) 禁入)与"允许但计入风险成本"在 300 min 以内的排班下给出同一个解,但一致来自运力挤出而非风险定价——越过 302 min 的拐点两版就裂开,本案 330 min 时差 1.76 元/夜。组合口径揭穿期望:硬禁止版月净 1343 元、至少被抢一次 24.8%、\(\mathrm{CVaR}_{0.95}=5128\) 元;定价版多赚 45.76 元/月,却把尾部暴露抬高 1179 元(26 倍)。结论是高风险片区 22:00 后不接,且应写成规则而非逐单权衡。

关键词:风险定价;期望失真的尾部;CVaR;禁入约束;城中村夜班

1 问题提出

1.1 问题是什么

夜里十一点,城中村的巷子只剩外卖箱的灯。这一单 5.60 元,跑完 11 分钟;可这条巷子今年被抢过好几次。题面把这件事写成一个乘式:片区风险系数 \(\rho_k\)(0.5—2.0)乘基准概率 0.0008,得单均被抢概率 \(p_k\);再乘一次损失 2950 元(手机 2600 + 停业一天 350),得单均风险成本

\[c_k=2950\,p_k=2950\times0.0008\,\rho_k=2.36\,\rho_k\quad\text{元/单}\tag{1} \]

\(\rho_k=1\) 时 \(c_k=2.36\) 元,也就是题面说的"每单 2.4 元"。五个片区分别是 1.18、1.89、2.36、3.54、4.72 元,最险的棠下村(\(\rho=2.0\))也只有 4.72 元——一单还赚 0.88 元。于是第一层结论很刺眼:在期望口径下,没有一个片区该拒。

但这道题真正要问的不是"该不该拒",而是三个更硬的问题。其一,折现的临界点在哪:把净收益令零,\(\rho^{*}=w/(2950\times0.0008)=2.37\),已经超出了题面 0.5—2.0 的区间,所以期望口径永远给不出"拒绝"。要让临界落回区间,单均收益得降到 4.72 元以下——那是另一门生意(脚注)。其二,硬禁止与定价是不是一回事:22:00 后不许进 \(\rho>1.5\) 的片区,这条规则一旦换成"进也行,按风险成本扣钱",模型会不会自己走进去?其三,期望是不是够:2950 元一次付清,而单均期望只有 4.72 元,这两件事不在一个数量级上——一个月的账,可能被一次事件改写。脚注:题面另给的"\(\rho>1.37\) 时转负"对应的是单均收益 3.24 元的口径(\(3.24/2.36=1.373\)),不是 5.60 元。5.60 元对应的临界是 2.37,本文一律按 5.60 元实算。

1.2 为什么要优化

三条理由。其一,风险被折成了一个小数:4.72 元/单的算法把 2950 元的一次性打击摊成日供,任何"值不值"的讨论都必须先看清这个摊薄的代价。其二,禁入有两种写法,答案可能不同:写成 \(x_{ik}=0\) 是合规约束,写成 \(-c_kx_{ik}\) 是价格信号,两者在多大概率上等价,要算出来才知道。其三,运力会掩盖风险:高风险片区往往被更早挤出去,于是"禁不禁都一样",这种一致会让人误以为风险定价有效。

1.3 Gurobi 如何求解

20 个 0-1 变量、最多 10 条约束,四档方案 + 14 次排班扫描共 23 次求解,最长单次 0.002 s;\(2^{20}\) 全枚举复核,差 0(数值零)。组合风险用泊松二项分布卷积(每夜单数 → 月度次数分布)解析计算,2000 种组合逐一评估,不依赖抽样。

2 数学模型

2.1 符号说明

片区 \(k=1,\dots,5\),单 \(i=1,\dots,4\);风险系数 \(\rho_k\in\{0.5,0.8,1.0,1.5,2.0\}\);单均被抢概率 \(p_k=0.0008\rho_k\);单次损失 2950 元;单均收益 \(w=5.60\) 元;行程时间 \(t_{ik}\)(22:00 前 11—23 min,22:00 后每单加 2 min);排班 \(T_A=300\)、\(T_B=330\) min;0-1 变量 \(x_{ik}\)。

2.2 目标函数与约束条件

设片区 \(k=1,\dots,5\) 各有 4 张单,\(i=1,\dots,4\);\(x_{ik}\in\{0,1\}\) 表示接不接。单均收益统一 \(w=5.60\) 元,单均风险成本 \(c_k=2.36\rho_k\) 由式 (1) 给出,单均毛净收益

\[\pi_k=w-c_k=5.60-2.36\,\rho_k\tag{2} \]

两个时段各解一次同一批 20 个变量:时段 A 是 22:00 前(排班 300 min、无禁入),时段 B 是 22:00 后(排班 330 min、每单多 2 min、\(\rho>1.5\) 禁入)。主模型为

\[\max\ Z=\sum_{k=1}^{5}\sum_{i=1}^{4}\pi_k x_{ik}\quad \mathrm{s.t.}\ \begin{cases}\sum_{i=1}^{4}x_{ik}\le 3, & \rho_k\ge 1.5\\ \sum_{k,i} t_{ik}x_{ik}\le T_s, & s\in\{A,B\}\\ x_{ik}=0, & \rho_k>1.5,\ s=B\\ x_{ik}\in\{0,1\}\end{cases}\tag{3} \]

第二行是运力:一趟夜班能跑多久。第三行是题面的硬禁止,它只在时段 B 生效。这两条约束的性质完全不同:运力是"钱买时间",风险是"钱买概率",把它们放进同一个目标函数时,风险被折算成了一个价格——而这正是本案例要检验的地方。临界风险系数由 \(\pi_k=0\) 解出:

\[\rho^{*}=\frac{w}{2950\,p_0}=\frac{5.60}{2950\times0.0008}=2.37\tag{4} \]

因为 \(\rho^{*}>2.0\),式 (2) 在题面区间内恒正,期望口径的最优解一定是"能接就接"。要谈"该不该拒",必须换一把尺子。第二把尺子是组合口径:一个月 26 个夜班,第 \(k\) 片区每夜接 \(n_k\) 单,被抢次数 \(M\) 服从泊松二项分布

\[\Pr(M=m)=\Big[\prod_{k=1}^{5}\big((1-p_k)+p_k z\big)^{26 n_k}\Big]_{z^{m}},\qquad \Pr(M\ge 1)=1-\prod_{k=1}^{5}(1-p_k)^{26 n_k}\tag{5} \]

损失 \(L=2950M\) 是离散的,"最坏 5% 的平均"即 CVaR:

\[\mathrm{CVaR}_{0.95}(L)=\min_{\eta}\Big\{\eta+\frac{1}{0.05}\,\mathbb{E}\big[(L-\eta)^{+}\big]\Big\}\tag{6} \]

式 (5)(6) 不改变可行域,只改变评判标准:同一个方案,期望说它赚 1343 元,CVaR 说它最坏的 5% 要赔 5128 元。这就是"低概率高损失"下期望口径失真的准确位置。

2.3 规模与性质

20 个二值变量、16 条约束(1 时间 + 5 限单 + 4 禁入 + 6 条上界),可完全穷举。真正的难点不在求解而在尺子:同一个可行域,用式 (2) 判全部该接,用式 (5)(6) 判该拒——模型没错,是"平均值"这个口径在低概率高损失下不够用。

3 Gurobi 求解实现

3.1 建模要点

20 个 0-1 变量、1 条时间约束、5 条限单、最多 4 条禁入,规模小到可以完全复核:\(2^{20}=104.9\) 万个子集全枚举,与 Gurobi 的最优值相差 0(数值零);23 次求解(4 个方案 + 14 次排班扫描)合计 0.002 s。

m.addConstr(gp.quicksum(x[k, i] for i in range(NI)) <= CAP[k], name=f"cap{k}")
m.addConstr(gp.quicksum(tt[k, i] * x[k, i] for k in range(NJ) for i in range(NI)) <= T)
m.setObjective(gp.quicksum(NETK[k] * x[k, i] for k in range(NJ) for i in range(NI)), GRB.MAXIMIZE)

三个方案只差两处开关:price=True 时把禁入约束换成"照扣风险成本",T 决定运力。代码没有技巧,全部工作在系数怎么来:风险成本用的是 \(p_k\) 乘一次真实损失 2950 元,不是"罚个红包";禁入写成 \(x_{ik}=0\),不是一个可以花钱赎买的罚项。表 1 是逐片区明细。注意两件事:一是风险成本从 1.18 涨到 4.72,涨了 4 倍,但仍低于 5.60 的收益;二是22:00 前模型接了棠下村 2 单(那时没有禁入),22:00 后一单不进。

表 1 五个片区的风险折现(p_k=0.0008ρ_k,单均风险成本=2950p_k)

片区 ρ_k p_k 单均风险成本 / 元 单均净收益 / 元 22 前接单 22 后禁入 22 后定价
P1 珠江新城 0.5 4.00‱ 1.18 4.42 4 4 4
P2 员村 0.8 6.40‱ 1.89 3.71 4 4 4
P3 冼村 1.0 8.00‱ 2.36 3.24 4 4 4
P4 康乐村 1.5 12.00‱ 3.54 2.06 3 3 3
P5 棠下村 2.0 16.00‱ 4.72 0.88 2 0 2

三种口径的结果:全接 20 单 57.25 元(忽略运力,只作上界)、按限单 18 单 54.31 元、22:00 后定价版 53.43 元(17 单)、22:00 后硬禁止版 51.67 元(15 单)。

3.2 求解结果

时段 A(22:00 前)\(x=[1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 0 0]\)、\(Z^{*}=53.43\) 元;时段 B 定价版 \(x=[1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 0 0]\)、53.43 元;硬禁止版 \(x=[1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0]\)、51.67 元。禁入使夜间少 2 单、少赚 1.76 元。

4 结果分析

4.1 结构:风险折现只值 1—5 元

图 1 五个片区的风险系数与单均风险成本:五根棒全在 5.60 元虚线之下,零点在 ρ=2.37 处(图外)

图 1 是本题的体检报告。五根红棒是 \(c_k=2.36\rho_k\),从 1.18 元到 4.72 元;蓝色虚线是 5.60 元的收益,也就是净收益的零点线。五根棒全在虚线之下,而且离得不远:最险的棠下村离破产只差 0.88 元,最安全的珠江新城还赚 4.42 元。横向看,风险成本随 \(\rho\) 线性涨,但涨得比收益慢——这就是题面那句"高片区单净收益可能为负"的真实含义:它只在 \(\rho>2.37\) 时成立,而题面给的区间上限是 2.0。

图 2 风险系数—单均净收益散点(气泡大小为单均耗时的倒数),盈亏平衡落在 ρ=2.37,本案最险的棠下村仍剩 0.88 元

图 2 换成平面看:横轴 \(\rho\)、纵轴 \(\pi_k\),气泡大小是单均耗时的倒数(越靠右的片区跑得越快,城中村门牌集中)。五点在一条斜率为 \(-2.36\) 的直线上,整条直线在 \(\rho\le2.0\) 的区间里都在零线之上,交点落在 \(\rho=2.37\)。所以期望口径给出的答案是"全接",与"这片区夜间不接"的老师傅经验相反。这个反差不是模型错了,而是模型被问错了问题——它只被允许算平均值。

4.2 方案:运力先挤掉风险,禁入再挤一次

图 3 四种口径的夜间净收益:全接 57.25、限单 54.31、22 点后定价版 53.43、硬禁止版 51.67

图 3 四根柱依次是 57.25、54.31、53.43、51.67,每一步都在掉。第一步(全接→限单)掉 2.94 元,是限单规则砍掉棠下村与康乐村各一张单;第二步(限单→定价版)掉 0.88 元,是运力约束再挤掉一张棠下村的单;第三步(定价→硬禁止)掉 1.76 元,是禁入砍掉棠下村剩下的 2 单。三笔账的量级差不多,但性质完全不同:限单是规则、运力是物理、禁入是安全。

图 4 两个时段的接单轨迹(色深为片区风险):22:00 前棠下村还接 2 单,22:00 后一单不进

图 4 把一夜摊开。22:00 前(实心块)棠下村还接 2 单、康乐村接 3 单;22:00 后(斜纹块)棠下村整行空着,康乐村仍接 3 单,其余三行照旧。这张图说明禁入不是"整晚不做高风险片区",而是"过了 22:00 就不进"——同一批单,换个时段,结论不同。拒单清单只有 5 张:P5-1 至 P5-4(22:00 后禁入)、P4-4(高风险片区限 3 单),其余 15 单照接。

4.3 灵敏度:一张保单的价格

图 5 单次损失从 1000 调到 7000 元:左轴五条单均净收益,右轴临界风险系数(阶梯)

图 5 把"一次被抢值多少钱"从 1000 元调到 7000 元。左轴五条线全向下走,右轴是临界 \(\rho^{*}=w/(0.0008L)\) 的阶梯:损失越大,能容忍的风险系数越低。读法有三条。其一,本案 \(L=2950\) 元时,最险的棠下村还剩 0.88 元,要等到 \(L\) 涨到 3500 元才转负——手机 2600 元这个数如果换成"手机+一个月误工",结论立刻翻转。其二,珠江新城这条线在 7000 元时仍赚 2.80 元,低风险片区的抗打击能力来自 \(\rho\) 而不是收益。其三,右轴的阶梯在 \(L=3500\) 元处跨过 2.0,说明"2.0 的片区能不能接"完全取决于一次损失怎么估。

图 6 风险系数 × 单价的接/拒分区,分界线为 单价=2.36ρ,星标 (2.0, 5.60) 落在接单侧但只剩 0.88 元余量

图 6 是二维的取舍地图:横轴 \(\rho\)、纵轴单价,颜色只有两种——接(绿)与拒(红),分界线是 \(w=2.36\rho\)。本案的星标 (2.0, 5.60) 落在绿区,但离红线只有 0.88 元的竖直距离。这张图回答的是"什么情况下该拒":不是"风险高就拒",而是"单价压不住风险才拒"。夜间单均价一旦从 5.60 掉到 4.7 元(比如平台补贴退坡),棠下村立刻翻红,康乐村在 3.5 元时翻红。

4.4 硬禁止与定价:一致,但是巧合

图 7 第三维:夜间排班时长扫描,硬禁止与定价两版在 300 min 以内完全重合,330 min 时裂开 1.76 元

图 7 是本题最需要小心的一张。横轴是夜间排班时长,两条曲线在 300 min 以内完全重合,越过拐点(约 302 min)才裂开,本案 330 min 时差 1.76 元。这说明禁入的代价不是常数,而是随运力富余程度从零突然出现的:棠下村的单位时间净收益最低(0.080 元/min,珠江新城 0.221 元/min),运力一紧它先出局,禁不禁都一样;排班一越过拐点,定价版立刻多接 2 单。

所以"硬禁止 vs 经济性定价"的准确关系是:运力紧张时两者等价,硬禁止是零成本的保险;运力富余时定价更激进,它会为了 0.88 元/单的净收益走进去,代价是每夜 1.76 元。而"更激进"未必"更优"——期望上它多赚 1.76 元,见 4.5 节,尾部上它多赔 1179 元。反过来,硬禁止在什么时候过于保守:如果某片区 \( ho\) 很低却因一刀切被排除(本案没有,\(1.5\) 这条线正好切在康乐村与棠下村之间),或者损失被高估到 3500 元以上(图 5)——那时禁掉的是真金白银。

4.5 尾部:期望失真在哪里

图 8 2000 种限单组合的收益—尾部概率平面,前沿只有 19 个点,阴影为超出 20% 预算的区域

图 8 是 2000 种限单组合的收益—风险平面。横轴月净收益、纵轴"至少被抢 1 次"的概率,蓝线是前沿(只有 19 个点)。硬禁止版(X,1343 元、24.8%)与定价版(菱形,1389 元、30.8%)都落在阴影里——两者都超出了 20% 的尾部预算,区别只是超出多少。前沿告诉我们:要把概率压到 20%,月收益只能做到 1236 元(每夜 13 单),比硬禁止版少 107 元。

图 9 月度被抢次数分布与累计概率:硬禁止版至少 1 次的概率 24.8%,定价版 30.8%

图 9 把分布摊开。硬禁止版一个月"一次都没被抢"的概率是 75.2%,被抢 1 次 21.4%,2 次以上 3.4%;定价版把这三个数推到 69.2%、25.5%、5.3%。期望损失只从 841 元涨到 1086 元(每月多 275 元),但 CVaR 从 5128 元跳到 6307 元。为什么差这么多:CVaR 看的是最坏 5% 的平均,当 \(\Pr(M\ge1)\) 已经到 25%—31% 时,尾部几乎全是"两次以上",而两次就是 5900 元。把两件事放在一起:定价版用 45.76 元/月的期望净收益,换来了 1179 元的尾部暴露。比例 26 倍。这就是期望口径失真的地方——它把 2950 元的一次性打击,摊成了 4.72 元的日供,看起来像一张便宜的保单;而真实的账单是一次付清的。

4.6 分解

图 10 硬禁止方案的毛收益与风险成本分解(按片区),菱形为净收益

图 10 按片区拆。四根蓝柱(毛收益)等高,因为每单都是 5.60 元;红柱(风险成本)从左到右变厚,每单扣 1.18—4.72 元;棠下村因一单不接,柱高为零。净收益(菱形)因此从 17.68 元滑到 6.18 元:珠江新城 4 单赚 17.68 元,康乐村 3 单只赚 6.18 元,棠下村整根柱为零(一单不接)。合计毛收益 84.00 元、风险成本 21.71 元、净 51.67 元——风险吃掉了 26%,而这一部分在只看单量的排班表里是完全隐形的。

5 结论

(1)风险折现的临界是 \(\rho^{*}=2.37\),不是 1.37。单均风险成本 \(c_k=2950\times0.0008\rho_k=2.36\rho_k\),五片区为 1.18、1.89、2.36、3.54、4.72 元;净收益 \(\pi_k=5.60-2.36\rho_k\),全部为正,最险的棠下村剩 0.88 元。题面的 1.37 对应单均收益 3.24 元的另一套口径(\(3.24/2.36=1.373\)),按 5.60 元算是 2.37。

(2)期望口径不会拒单。22:00 前的最优解接了棠下村 2 单;22:00 后的定价版(\(x_{ik}\ge0\) 但照扣 \(c_k\))接了 2 单棠下村,净收益 53.43 元,比硬禁止版的 51.67 元高 1.76 元/夜。全接、限单、定价、硬禁四档依次为 57.25、54.31、53.43、51.67 元。

(3)硬禁止与定价在 300 min 以内一致,越过 302 min 的拐点才分岔。本案 330 min 下定价版多接 2 单,多赚 1.76 元/夜(月 45.76 元)。判据是单位时间净收益:棠下村 0.080 元/min、珠江新城 0.221 元/min,运力一紧它先出局。运力紧张时硬禁止零成本,运力富余时它才标价——所以"禁入是否昂贵"取决于排班,而不是取决于风险系数。

(4)尾部把结论翻回来。硬禁止版月净 1343 元、\(\Pr(M\ge1)=24.8\%\)、CVaR(95%)=5128 元;定价版 1389 元、30.8%、6307 元。多赚 45.76 元/月,换来 1179 元的尾部暴露(26 倍)。期望损失从 841 涨到 1086 元看着温和,是因为它摊平了 2950 元的一次性打击。

(5)结论:高风险片区夜间不接,是模型与安全的双重建议。模型给出的是"期望上不划算、尾部上更不划算";安全上,这类损失不是可分散的小额支出,而是不可逆的一次性事件。因此本案把 \(\rho>1.5\) 的片区在 22:00 后整体排除,并把拒单写成排班规则而不是"看情况"——能用规则挡掉的尾部,不要交给概率去赌。

参考文献

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

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