案例 158 12 分扣完就停运:把记分周期当预算来花

案例 158 12 分扣完就停运:把记分周期当预算来花

摘要:一个记分周期 12 分,扣满停运 7 天,损失 \(7\times350=2450\) 元,还要重考清分。违规每次省 4 min、值 0.80 元,扣 3 分。把 12 分当成 12 个月的可消耗预算,安全配额就是 \(12/12=1\) 分/月,也就是每月最多违规 0.33 次(每年 4 次);这 4 次换来的收益是 3.2 元/年,而一次停运就要 2450 元,相差 766 倍。反过来算"诱惑力临界值":一次违规只有在省下 612.5 元、也就是 51 小时跑单时间时才值得,现实是 4 分钟。模型的最优解是顶格使用配额(4 次/年,12 个月净收益 126003 元);但把违规的随机波动算进来,配额解的停运概率是 37%、年净收益跌到 125081 元,反而低于零违规的 126000 元。结论:12 分要当预算管,但绝不能花到 12;留 3 分垫,是这笔账里唯一的免费保险。

关键词:风险预算;累计扣分;0-1 停运指示;随机到达;安全垫

1 问题提出

1.1 问题是什么

外卖骑手的驾驶证一个记分周期 12 分。闯红灯、逆行、走机动车道,每次 3 分;扣满 12 分要停止接单、重新学习考试,前后 7 天不能跑,按 350 元/天算,损失 2450 元。另一方面,每闯一次红灯能省 4 min,按 0.20 元/min 折 0.80 元。现状是每月平均被扣 1.8 分——相当于每月违规 0.6 次。

表 1 三个数决定了全部结论

项目 算式 结果
一次停运的损失 \(7\times350\) 2450 元
一次违规的收益 \(4\times0.20\) 0.80 元
一次违规的扣分 题面 3 分
月度可用预算 \(12/12\) 1 分/月
安全月配额 \(1/3\) 0.33 次/月 = 4 次/年

1.2 为什么这值得建模

其一,"12 分"是一个跨月耦合的资源。 单看任何一个月,多闯两次毫无代价;放到 12 个月里,它就是月底停运的那根引线。这种"消耗型预算"必须用累计约束表达,不能逐月各算各的。

其二,停运之后清零,让约束变成分段累计的。 写错成 \(\sum_{m} u_{m}\le12\) 会把"清零重来"这条规则整个删掉,模型于是永远看不见停运,也就永远说不出"该少闯几个灯"。

其三,收益与代价差了三个数量级。 0.80 元对 2450 元,人的直觉在这里完全失效——必须算清"多高的收益才值得冒这个险",而不是凭感觉说"应该没事"。

1.3 Gurobi 如何求解

M1 是 12 个月、12 个 0-1 停运变量的 MILP:目标最大化"流水 + 违规收益 − 停运损失",约束是逐月前缀的累计扣分不超过 \(12(1+\text{停运次数})\)。M2 加以"每月违规次数相同"的均匀化约束,得到可执行的配额政策。M3 是漏写清零的错误模型,用来看错在哪里。M4/M5 对停运损失、违规收益、月度扣分期望做扫描,共 41 次求解,全部在 2 s 内完成。

2 数学模型

2.1 符号说明

符号 含义 取值
\(x_{m}\) 第 \(m\) 月违规次数(决策) \([0,1]\) 次/月
\(u_{m}=3x_{m}\) 第 \(m\) 月扣分 分
\(z_{m}\) 第 \(m\) 月是否触发停运 \(\{0,1\}\)
\(R_{0}\) 月流水 10500 元
\(g\) 每次违规的收益 0.80 元
\(L\) 一次停运的损失 2450 元
\(C\) 周期总分 12 分
\(H\) 规划期 12 月

2.2 目标函数

一个月的小哥收入 = 流水 + 违规省下的时间,触发停运再扣一次损失:

\[\max\ Z=\sum_{m=1}^{H}\left(R_{0}+g\,x_{m}-L\,z_{m}\right)\tag{1} \]

代入本案:\(R_0=10500\)、\(g=0.80\)、\(L=2450\),基准(零违规、零停运)是 \(12\times10500=126000\) 元。目标里的 \(g x_m\) 与 \(L z_m\) 量级差 3062 倍,这正是全部张力的来源。

2.3 约束条件

累计扣分必须落在"已获得的预算"之内。设 \(Z_m=\sum_{m'\le m}z_{m'}\) 为到第 \(m\) 月为止的累计停运次数,则

\[\sum_{m'=1}^{m}3x_{m'}\le 12+12\,Z_{m},\qquad m=1,\dots,H\tag{2} \]

式 (2) 是本题的核心。 每发生一次停运,交管那边就把分数清零、重新给你 12 分,所以第 \(m\) 月之前累计可用的分数是 \(12(1+Z_m)\),而不是固定的 12。写成单次形式就是题面那句 \(\sum_{m'\le m}u_{m'}\le12+M z_{m}\),其中 \(M=12\) 恰好够用——因为一次停运最多只买来 12 分。

只有预算约束还不够:\(z_m\) 是"真的越线了",不是"我想越线"。补一条触发约束,要求第 \(m\) 月的累计扣分确实越过了上一轮剩下的额度:

\[12\,z_{m}+12\,Z_{m-1}\le\sum_{m'=1}^{m}3x_{m'}\tag{3} \]

式 (2)(3) 合起来,\(z_m\) 既不能凭空置 1,也不能在越线后逃避。若漏掉 \(Z_m\)、直接写成年累计 \(\sum_{m=1}^{12}3x_{m}\le12\),模型就永久失去了"停运—清零—再累计"的循环:它给出的最优解是 0.33 次/月(每年 4 次)、零停运、年净 126003 元。在本案参数下这个数与正确解数值巧合相同——因为停运从来不划算;但一旦违规收益升到 300 元以上,错模型就会漏掉"多换一次停运值不值"这一整类决策,少赚的正是 \(4g-L\) 这一项。

2.4 规模与性质

12 个连续变量 + 12 个 0-1 变量 + 24 条约束,根节点松弛即闭合。它不是背包,而是"带重置的累计资源分配":目标对 \(x_m\) 线性、约束对 \(x_m\) 线性,唯一的结构来自 \(z_m\) 把"清零"这个非线性动作线性化了。均匀化版本再添 11 条等式,退化成一维搜索,答案就是配额 \(C/(3H)\)。

3 Gurobi 求解实现

3.1 建模要点

x = m.addVars(H, lb=0, ub=1)                       # 每月违规次数
z = m.addVars(H, vtype=GRB.BINARY)                 # 是否触发停运
cumx, cumz = 0, 0
for k in range(H):
    cumx = cumx + PTS * x[k]
    m.addConstr(cumx <= CYC + CYC * (cumz + z[k]))  # 预算:12 分/周期
    m.addConstr(CYC * z[k] + CYC * cumz <= cumx)    # 触发:确实越线
    cumz = cumz + z[k]
m.setObjective(gp.quicksum(g * x[k] - L * z[k] for k in range(H)), GRB.MAXIMIZE)

两个细节。第一,cumz 必须在前缀里累加,不能只用当月的 z[k],否则第二次停运无法解释"又多了 12 分"。第二,目标里 \(L z_m\) 的系数远大于 \(g x_m\),Gurobi 的 presolve 会很快判断出 \(z\) 的取值区间;真正决定答案的是那条前缀约束,而不是求解器。

3.2 求解结果

表 2 四个方案的 12 个月账

方案 违规 /(次/月) 年违规次数 停运次数 违规收益 停运损失 年净收益
零违规 0.00 0 0 0.0 0 126000
1 分/月配额 0.33 4 0 3.2 0 126003
3 分/月配额 1.00 12 2 9.6 4900 121110
不管不顾 0.60 7 1 5.8 2450 123556

配额解比零违规多赚 3.2 元/年——这就是"12 分预算"全年的全部价值,折到每月 0.27 元。而"不管不顾"比配额少 2447 元,相当于每月配额价值 0.27 元的 9178 倍。

4 结果分析

4.1 结构:12 分的月度拆解

图 1 12 分预算摊到 12 个月:配额 1 分/月 vs 现状 1.8 分/月

图 1 把 12 分横着切开:每月 1 分,正好 12 个月用完,不多不少。蓝线是配额,红线是现状 1.8 分——**每个月都超支 0.8 分,第 7 个月就烧穿全年预算**。这张图是全案的地基:只要承认"分数是有限的",后面所有结论都是它的推论。 ### 4.2 散点:确定性与随机性给出两条相反的曲线

图 2 每月违规次数对 12 个月净收益的影响(气泡=停运概率)

图 2 两条线。虚线是确定性口径:在每个"还没越线"的小区间里几乎持平(每月最多 0.8 元 x 12 = 9.6 元),一旦跨过 12 分就整块掉 2450 元,于是呈台阶下行;实线是随机口径,违规次数一多、触发停运的概率就压不住,曲线一路下滑。气泡是停运概率:配额处 37%,到 1 次/月是 99%。**两条线在 0.33 之后同时转向,说明"再多闯一次"从这一刻起就是纯亏。** ### 4.3 方案对比:配额只赢 3 元,不管不顾亏两千四

图 3 四个方案相对零违规的 12 个月净收益

图 3 是四个方案减掉基准流水后的净额。配额 $+3.2$ 元,3 分/月配额 $-4890$ 元,不管不顾 $-2444$ 元。**最优与次优只差 3 块 2,而最差与最优差 2447 元**——这说明本案例的决策不是"要不要贪那 3 块钱",而是"别让 2450 元的停运把一个月白干"。 ### 4.4 水位:第 7 个月越线

图 4 12 个月累计扣分水位(配额 vs 现状)

图 4 是水位图。绿线每月涨 1 分,第 12 月正好触到 12 分线——**顶格但不过线,这就是"配额"两个字的几何含义**。红线每月涨 1.8 分,第 7 个月到 12.6 分越线,停运 7 天、清零,剩 5 个月又攒到 9.0 分。**同一份 12 分,一个用满 12 个月,一个用 6 个多月就烧光。** ### 4.5 主灵敏度:停运损失翻倍,结论不变

图 5 停运损失对停运总损失与最优违规次数的影响

图 5 左轴是 12 个月的停运总损失,右轴是不同违规收益下的最优次数。停运损失从 1200 涨到 4900 元(家庭影响口径),现状的年净收益从 124806 元掉到 121106 元,配额方案的停运损失一直是 0。**右轴才是关键:收益 0.8 元时最优次数全程钉在 0.33,纹丝不动;收益 700 元时它在 1800 元以下跳到 1.00,到 3200 元又退回 0.33。** 也就是说,停运损失变大不会让人更想违规,只会让"违规值不值"的门槛更高。 ### 4.6 二维分区:临界线就是 $g=L/4$

图 6 停运损失 x 违规收益的最优违规次数分区

图 6 每一格都是重解一次 MILP。分界线很干净:$g^{*}=L/4$——多换一次停运要多违规 4 次(12 分 ÷ 3 分),所以只有单次收益超过停运损失的四分之一,才值得去撞线。本案 $g=0.80$、$L=2450$,临界 612 元,实际只有它的 0.0013:0 元那一列是 0.00(不赚钱的违规模型一次都不做),250 元那一列才回到 0.33。**"闯一次值 600 块"这种事在送外卖里不存在。** ### 4.7 第三维:扣分期望翻倍,停运次数翻三倍

图 7 月度扣分期望对年净收益与停运次数的影响

图 7 把现状扣分从 0.6 拉到 3.6 分/月。停运次数从 0 次涨到 3 次,年净收益从 126002 元掉到 118662 元,**每 1.2 分/月就是一次停运、2450 元**。配额线是一条水平线 126003 元——不管习惯多差,只要把总量压到 1 分/月,12 个月就一次都不会停。题面 1.8 分/月对应的 1 次停运,用 2450 元换 5.8 元收益。 ### 4.8 前沿:配额解已经在悬崖边上

图 8 年收益—停运概率前沿与超配额阴影

图 8 横轴是停运概率,纵轴是相对零违规的年收益。蓝线只进不出,红线扣掉期望损失。**配额解落在停运概率 37% 的位置上,年收益 -919 元——它已经在悬崖边上了**;再往右进入阴影区,收益迅速转负。前沿上真正的最优点是原点:零违规、零概率、零损失。 ### 4.9 分布:顶格用配额,37% 的概率会停运

图 9 12 个月内停运次数的概率分布与累计概率

图 9 是 20 万条 12 个月路径的模拟。配额方案(每月 0.33 次)有 37% 的路径至少停运一次,期望停运 0.38 次;压到 1.2 次/年只剩 0.7%,2.4 次/年是 9%。**注意定额与随机的差别:确定性模型说"刚好 12 分、不会越线",可违规是随机到达的,某个月连闯 4 次就提前清零。** 这正是"留安全垫"的量化理由——配额顶格不是安全线,是 50/50 的赌线。 ### 4.10 分解:违规收益与停运损失的量级

图 10 四个方案的违规收益与停运损失分解

图 10 把每个方案拆成两段。绿色是违规收益,最高的一档(3 分/月配额)也只有 9.6 元;红色是停运损失,同一档 4900 元。**两个数相差 510 倍,堆在同一张图上,绿色的柱子几乎看不见——这就是"违规的经济诱惑力"的真实尺寸。** ## 5 结论 1. **12 分是预算,不是额度。** $12/12=1$ 分/月,即每月 0.33 次、每年 4 次;这是"既用满又不越线"的唯一解。模型(表 2)与几何(图 4)都给同一个数。 2. **配额全年的价值是 3.2 元,停运一次的代价是 2450 元。** 两者相差 766 倍。任何"多闯几次没事"的说法,都是在拿 2450 元赌 0.80 元。 3. **诱惑力的临界值是 612 元/次**($L/4$):要让一次违规划算,得省下 51 小时。现实是 4 分钟,差 766 倍。停运损失涨到 4900 元(家庭影响口径),临界值升到 1225 元;降到 1200 元,临界值仍有 300 元——**换任何口径,0.8 元都够不着。** 4. **漏写"清零"会把模型变成另一道题。** 写成 $\sum_{m}3x_{m}\le12$ 时,模型永远看不见停运,最优解是 0.33 次/月、零停运;本案数值上与正确解巧合一致,但换一个收益参数就会错失 $4g-L$ 的整段决策。正确写法是式 (2)(3):前缀累计 + 累计停运次数 + 触发约束。 5. **确定性最优不等于安全。** 配额解在确定性模型里是 4 次/年(126003 元),但违规随机到达,12 个月内触发停运的概率是 37%,期望年净收益 125081 元,低于零违规的 126000 元。**把配额压到 2.4 次/年(0.2 次/月),停运概率从 37% 降到 9%,只放弃 1.6 元收益——这是全案性价比最高的一笔"保险"。** 6. **口径与立场。** 以上全部是"如果只算经济账"的推演,而结论本身就指向合规:**把 12 分当预算、留足 3 分安全垫;违规即使在算账上"有时划算",也必须服从法规与安全。** 一次红灯省 4 分钟,换不来 7 天不能接单,更换不来一次事故。 ## 参考文献

[1] Gurobi Optimization LLC. Gurobi Optimizer Reference Manual[Z]. 2024.

[2] Powell W B. Approximate Dynamic Programming[M]. 2nd ed. Hoboken: Wiley, 2011.

[3] 司守奎, 孙玺菁. 数学建模算法与应用[M]. 3 版. 北京: 国防工业出版社, 2021.

[4] 姜启源, 谢金星, 叶俊. 数学模型[M]. 5 版. 北京: 高等教育出版社, 2018.

复现方式:python batch_158.py;数据与结果见同目录 data_158.csv / results_158.json,图见 figs/

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