案例 153 电池不能拿上楼:1.15 元/天的差价,买不来一次火灾

案例 153 电池不能拿上楼:1.15 元/天的差价,买不来一次火灾

摘要:广州明令禁止电动自行车电池入户充电。楼下充电桩 1.05 元/度、上楼 0.55 元/度,日耗 2.3 度:楼下 \(2.3\times 1.05=2.415\) 元/天,上楼 \(2.3\times 0.55=1.265\) 元/天,差价 1.15 元/天、420 元/年(实算 419.75 元)。0-1 变量 \(z\)(1 = 楼下充)配一条法规约束 \(z=1\),可行域被钉成一个点,目标函数只做事后解释。题面的"火灾期望 120"必须拆开:按日读是 120 元/天(= 43800 元/年,反推单次损失 876 万元,不可能);按年读是 120 元/年(反推损失 2.4 万元,只够烧掉一间厨房)。按 0.5%/年 起火 × 30 万元损失 = 1500 元/年 = 4.11 元/天 重算,风险是差价的 3.6 倍:省 34.5 元/月、冒 123 元/月,纯经济账也是反的。但真正的结论不在账上——入户充电是法规禁止、涉及整栋楼的公共安全,期望值模型系统性低估"低概率高后果"风险,即使账面划算也不能入户。

关键词:0-1 合规决策;期望损失;低概率高后果;公共安全;法规约束优先

1 问题提出

1.1 问题是什么

楼下装了集中充电桩,1.05 元/度;家里的插座是居民电价 0.55 元/度。一块电池每天要吃掉 2.3 度电,于是"提上楼充"看起来每天能省 1.15 元。代价是:电池入户起火,烧的不只是自己家,还有楼道、邻居、整栋楼。广州把这件事写成了"禁止",而不是"建议"。

表 1 两种充电方式的日成本核对(元/天;算术无误,问题在风险的计量口径)

项目 算式 结果 性质
楼下充电桩 \(2.3\times 1.05\) 2.415 含服务费的合规价
上楼(只算电费) \(2.3\times 0.55\) 1.265 漏掉了风险项
日差价 \(2.415-1.265\) 1.150 全部的经济诱惑
年差价 \(1.150\times 365\) 419.75 宣传口径里的"一年省 420"
火灾期望(重算) \(0.005\times 300000/365\) 4.11 真实的日成本

1.2 为什么这值得建模

第一,差价是真的,风险也是真的,但两者不在一个量级上。1.15 元/天是每天都发生的确定支出,4.11 元/天是把 30 万元灾难摊到 365 天之后的平均值。前者摸得着,后者只在 0.5% 的年份里兑现——人脑天然低估后者,这正是需要模型的地方。

第二,期望值不是上限,是下限。\(0.5\%\times 30\) 万 \(=1500\) 元/年,这个数字假设"起火就是 30 万、不发生就是 0",把连续分布的损失压成了一个两点分布。真实损失有长尾:一旦引燃楼道里的其它电动车,30 万根本不够。所以 4.11 元/天只能当保守下界用,用它算出来的结论如果已经不利,真实结论只会更不利。

第三,这不是一道可以"算赢"的题。合规的成本是 1.15 元/天,违规的代价由整栋楼分担,收益由一个人独享——这是一个典型的负外部性问题,任何只优化个人账本的目标函数都必然低估社会成本。所以约束必须写在目标之前。

1.3 Gurobi 如何求解

模型只有 1 个 0-1 变量、1 条约束,求解是常数时间。计算量全在反复解:基准与口径对照 8 次、差价扫描 61 点 × 3 档概率、二维网格 25 点、情景 4 次,共 223 次 MIP,总耗时不到 1 秒。每一个扫描点都重新建模,不套解析式——这样"改一个参数就是改一个模型",避免手推公式与代码走岔。

2 数学模型

2.1 符号说明

符号 含义 本案取值
\(z\) 是否在楼下充电,0-1 决策变量
\(e\) 日耗电量 /(度/天) 2.3
\(p_{d}\) 楼下充电桩电价 /(元/度) 1.05
\(p_{u}\) 居民电价 /(元/度) 0.55
\(\pi\) 入户充电起火概率 /(1/年) 0.005
\(L\) 一次火灾总损失 /元 30 万
\(q\) 楼下排队时间折价 /(元/天) 3.5

2.2 目标函数

两种方式的日成本,取下楼充电的比例 \(z\) 加权:

\[c(z)=z\,e\,p_{d}+(1-z)\left(e\,p_{u}+\frac{\pi L}{365}\right)\tag{1} \]

记 \(g=e(p_{d}-p_{u})\) 为日差价、\(r=\pi L/365\) 为日风险,则

\[c(1)=e\,p_{d},\qquad c(0)=e\,p_{u}+r,\qquad \Delta=c(1)-c(0)=r-g\tag{2} \]

\(\Delta>0\) 意味着"合规更贵",也就是入户在账面上占优。本案 \(g=1.15\)、\(r=4.11\),\(\Delta=2.96>0\)——但这不是"应该入户"的理由,见 2.3 节。

2.3 约束条件

法规把可行域砍成一个点:

\[z=1\tag{3} \]

为了看清"只算钱会走到哪里",另设一个无约束对照模型(删去式 (3)),它的解只用于解释,不用于决策:

\[z^{\mathrm{money}}=\arg\min_{z\in\{0,1\}}c(z)\tag{4} \]

把法规改写成罚函数是常见但错误的做法——它把"禁止"降格成"定价":

\[c^{\mathrm{pen}}(z)=c(z)+M(1-z),\qquad M^{*}=c(0)-c(1)=r-g\tag{5} \]

\(M<M^{*}\) 时求解器会选 \(z=0\),等于宣布"罚得起就能入户"。\(M\) 不是罚金,是许可证价格,而公共安全不出售。

账面翻转的两个临界值由 \(r=g\) 解出:

\[g^{*}=r=\frac{\pi L}{365},\qquad \pi^{*}=\frac{365\,g}{L},\qquad L^{*}=\frac{365\,g}{\pi}\tag{6} \]

代入本案:\(g^{*}=4.11\) 元/天(即 1.79 元/度的电价差),\(\pi^{*}=0.0014\)/年,\(L^{*}=8.4\) 万元。

年化把日成本乘 365;把排队时间也折成钱,楼下要多付 \(q\):

\[C_{yr}(z)=365\,c(z),\qquad C^{q}_{yr}=365\,(e\,p_{d}+q)\tag{7} \]

规模与性质:1 个变量、1 条约束、1 个线性目标项。这个模型小到不需要求解器,它演示的是"约束先于目标":式 (3) 一旦写入,\(z=1\) 就与 \(\pi\)、\(L\)、\(g\) 取什么值无关;目标函数只负责回答"如果只算钱,会怎样"。案例 152 用同一结构讲过执法概率,本案把同一结构推到"风险的计量口径"这一维上:口径一变,账面能翻;约束不变,结论不翻。

3 Gurobi 求解实现

3.1 建模要点

z = m.addVar(vtype=GRB.BINARY, name="z")
if legal: m.addConstr(z == 1)                       # (3) 法规
obj = z * (C_UP + gap) + (1 - z) * (C_UP + risk)    # (1)
if pen is not None: obj = obj + pen * (1 - z)       # (5) 罚函数对照
m.setObjective(obj, GRB.MINIMIZE)

实现细节:legal 与 pen 两个开关只控制条款,其余全部复用;同一函数被调用 223 次,参数换、模型换、代码不换。这样"题面口径"与"重算口径"跑的是同一个模型,只差 \(r\),比较才干净。

3.2 求解结果

表 2 八个模型的解(元/天)

模型 法规约束 风险项 最优 \(z\) 最优成本 可否采纳
基准 \(z=1\) 4.11 1 2.415 采纳
只算钱·重算 无 4.11 1 2.415 佐证
只算钱·题面按日 120 无 120 1 2.415 佐证
只算钱·题面按年 120 无 0.329 0 1.594 不可采纳
只算钱·风险归零 无 0 0 1.265 不可采纳
罚函数 \(M=3\) 软 0 1 2.415 等价,但危险
罚函数 \(M=1\) 软 0 0 2.265 不可采纳

三行 \(z=0\) 全部来自"把风险算小或算没":题面 120 若按年读,风险只有 0.33 元/天,赔不上 1.15 元的差价,求解器当然选入户;风险归零更直接。罚函数 \(M=1\) 则演示了"定价式执法"的失败:\(M\) 低于 1.15 元/天(一年 420 元),法规就形同虚设。这三行的共同点是参数错,不是结论对。

4 结果分析

4.1 结构:2.415 与 1.265 之间隔着 4.11

图 1 两种充电方式的日成本构成(电费、火灾期望、不同口径)

楼下 2.415 元/天,上楼只算电费 1.265 元/天——两根棒子差 1.15 元。加上重算的风险 4.11 元/天,上楼的棒子立刻长到 5.37 元,反过来比楼下贵 2.96 元/天、一年 1080 元。而按题面 120 元/年读,上楼只有 1.59 元,看上去确实比楼下便宜 0.82 元——同一件事,口径差 12.5 倍,结论就反了。

4.2 数据全景:概率与损失谁说了算

图 2 起火概率 × 单次损失的年期望风险场(气泡正比于年期望,星号为本案)

年期望风险 \(=\pi L\),在双对数意义上是等值双曲线。图 2 里黑实线是"期望正好等于 420 元/年电费差价"的那条线:它左下侧(低概率、低损失)才是入户占优的区域。本案 \((0.5\%,30\text{万})\) 落在 1500 元/年等值线上,是差价线的 3.6 倍——离分界很远。要注意右上方:损失一旦到 100 万(引燃楼道),年期望就是 5000 元,是差价的 12 倍。

4.3 方案对比:隐性成本才是"想上楼"的真原因

图 3 入户、楼下、楼下含排队成本、罚函数写法四种情形的日成本

楼下 2.415 元 vs 上楼含风险 5.37 元,差 2.96 元;但楼下还要排队 20 min,按 10.5 元/小时折 3.5 元/天,加起来 5.92 元/天;无桩小区还得跑 1 km(约 0.6 元/次,同量级,未计入)。这才是"宁愿提上楼"的真实动机:不是 1.15 元的电费,而是 3.5 元的时间。第四根柱子是把法规写成 \(M=1\) 罚函数的产物——账面 2.26 元"最优",但那是一个违规解。隐性成本是真的,解法是加桩、错峰、换电柜,不是允许入户。

4.4 时序:一年到底差多少

图 4 365 天累计成本:省下的 420 元与背上的 1500 元

两条电费线从原点缓慢分叉,365 天差 420 元;把风险计入后,上楼那条线在起点就比楼下高出 1500 元——风险是一次性跳上去的,不是一天天攒出来的。图 4 里那根竖直的箭头就是它:1500 元的落差,420 元的斜率,斜率要追 3.6 年才追得回。

4.5 主灵敏度:差价要多高,账才偏向入户

图 5 日差价与起火概率对账面的影响(右轴为账面最优决策)

三条线斜率都是"每 1 元/天折 365 元/年",截距是 \(-\pi L\)。差价 1.15 元/天、概率 0.5% 时,净额 \(-1080\) 元/年(入户反而贵 1080 元);概率降到 0.1%,净额翻到 \(+120\) 元/年(这时账面才"省")。分界在 \(g^{*}=4.11\) 元/天,即电价差 1.79 元/度——楼下要涨到 2.34 元/度,账面才翻。实测 0.5 / 1.15 / 2.0 元/天三档,模型全部选 \(z=1\)(楼下)。

4.6 二维分区:算账会翻,红线不翻

图 6 差价 × 起火概率的算账分区(红框为法规红线,覆盖全图)

分界线是 \(g=\pi L/365\)(图中黑线)。线上方(红区)入户更贵:概率高、风险压过差价,楼下更便宜——本案星标就落在线上方 2.96 元/天处;线下方(右下蓝区)才是"账面偏入户":概率极低、差价极大。关键在红框——这张图的每一个像素都落在红框里,意味着无论参数取什么值、无论色块是红是蓝,\(z=1\) 都成立。参数能让颜色变,不能让红线移动。

4.7 第三维:损失越大,临界概率越低

图 7 不同单次损失下,年期望风险随起火概率的变化

三条线在原点出发,斜率是 \(L\)。与 420 元/年的差价线相交,得到三个临界概率:10 万对应 0.42%、30 万对应 0.14%、100 万对应 0.04%。本案 0.5% 已经高出 30 万那条临界线 3.6 倍。反过来说:只有当起火概率低于 0.14%/年、且损失不超过 8.4 万元时,账才会偏向入户——这两个条件同时成立,等于假设"电池几乎不会烧,烧了也只烧一间厨房"。

4.8 前沿:唯一的可行点是零风险那个端点

图 8 年化电费—年化火灾风险平面上的前沿与不可行区

横轴年化电费、纵轴年化风险:楼下 \((881,0)\),入户 \((462,1500)\)。混合比例 \(\alpha\) 画出一条直线前沿,每省 1 元电费就换 \(3.57\) 元风险。但这条前沿上只有最右端 \(\alpha=1\) 可行——其余全部落在阴影里,不是"被支配",是"不允许"。帕累托分析在这里的作用不是找折中,而是证明折中不存在。

4.9 分布:均值站在一个从不发生的点上

图 9 一年火灾成本的两点分布(99.5% 为 0,0.5% 为 30 万)

99.5% 的年头一分不赔,0.5% 的年头赔 30 万;期望 1500 元。这个均值落在概率为 0 的位置上——没有任何一年会真的花 1500 元。这就是期望值模型在"低概率高后果"问题上的结构性缺陷:它把一次不可承受的打击,平均成一笔可以忽略的零钱。蒙特卡洛 20000 次里,入户年成本高于楼下的比例是 0.5%——大多数人赌赢,少数人倾家荡产,平均下来"看起来还行"。

4.10 分解:净额只有半度电的钱

图 10 入户减楼下的日成本边际分解(电费差、排队、风险)

电费省 1.15、免排队省 3.50、风险赔 4.11,净额 -0.54 元/天。也就是说,把时间也算成钱,入户的全部"优势"只有 0.54 元/天(净省 197 元/年)——半度电的钱。 为这半度电押上 30 万元的一次性损失,任何风险厌恶系数大于零的人都不会签。而真实的"省 420 元/年"宣传口径,是把 4.11 元/天的风险和 3.5 元/天的时间都划掉的算法。

5 结论

  1. 核对通过:楼下 2.415 元/天、上楼 1.265 元/天,差价 1.15 元/天、419.75 元/年(34.5 元/月)。 题面的"一年省 420"实算无误,算术没问题。
  2. 题面的"火灾期望 120"必须拆口径。 按日读是 43800 元/年(反推损失 876 万元,不可能);按年读是 120 元/年(反推损失 2.4 万元,只够一间厨房)。按 \(0.5%\times30\text{万}=1500\) 元/年 \(=4.11\) 元/天重算,风险是差价的 3.6 倍:省 34.5 元/月、冒 123 元/月,纯经济账也是反的。
  3. 只有极端参数才让账偏向入户,而那样算出来的解不可采纳。 差价要涨到 4.11 元/天(1.79 元/度),或起火概率低到 0.14%/年(本案的 1/3.6),或损失压到 8.4 万元以下。三者都需要"电池不会烧"这个前提,而这个前提正是消防部门用事故换来的。
  4. 隐性成本解释了动机,不构成理由。 排队 20 min 折 3.5 元/天,是电费差价的 3.0 倍,这才是"宁愿提上楼"的真实原因;把时间也算成钱,入户的全部账面优势只剩 0.54 元/天。正确的回应是加桩、错峰、换电柜,不是放开入户。
  5. 必须楼下充(\(z=1\)),且这是法规与安全的双重要求。 式 (3) 让 \(z=1\) 与所有参数无关;目标函数在重算口径下也同意它。但同意是结果,不是依据——依据是"电池不进楼、不进电梯、不进家门"这条规则本身。整栋楼的公共安全,不能由一户的电费账单来定价。

电池不进楼,一律楼下或集中充电桩充电:省的是 1.15 元/天,押的是 30 万元和整栋楼的安全。

参考文献

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

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