案例 062 自充电还是租电
案例 062 自充电还是租电
摘要:199 元的换电月卡看似贵,家里 0.30 元的谷电看似便宜,可真正决定答案的不是电价,是两块电池跑得完多少单。本文把"买几块电池、白天回几次家、要不要包月换电"写成一个 0-1 整数规划:\(z\) 选租或自,\(k\) 定电池块数,\(r\) 定回家次数,\(q_{t}\) 把充电量分到四个电价窗口,大 M 把两条互斥的成本路径缝进同一个目标。Gurobi 的解是自充、两块、白天回家 1 次,日成本 8.38 元,比租电的 10.76 元省 2.38 元。但优势极薄:日单量一旦越过 33.9 单(两块电池的 34 单容量线),第三块电池加第二趟回家把成本抬到 14.18 元,反而比租电贵 3.42 元;电价要涨到 1.21 元每度,租电才会在 30 单下翻盘。临界值不是一个点,是一条由电池容量刻出来的台阶。
关键词:租电与自充;0-1 二选一;大 M 法;盈亏平衡;容量台阶
1 问题提出
1.1 问题是什么
小哥一天 30 单,耗电 2.3 度。两条路摆在面前:自己买电池、夜里在家充,一度电 0.30 元;或者包月换电,199 元不限次,随换随走。表 1 把两条路的成本逐项拆开——自充便宜在电费只有 0.78 元,贵在两块电池每天要折旧 3.60 元、中午还得回家一趟。
表 1 两种方案的成本构成(30 单,电价 0.30 元每度)
| 成本项 | 口径 | 自充 /元 | 租电 /元 | 性质 |
|---|---|---|---|---|
| 电费 | 2.3 度 ÷ 0.88 × 0.30 | 0.78 | — | 随单量变动 |
| 电池折旧 | 1.80 元每块日 × 2 块 | 3.60 | — | 随块数阶跃 |
| 回家换电时间 | 0.40 h × 10 元每小时 × 1 次 | 4.00 | — | 随次数阶跃 |
| 换电月卡 | 199 元 ÷ 26 个工作日 | — | 7.65 | 固定 |
| 换电绕行 | 0.72 + 5 min 时间 × 2 次 | — | 3.11 | 随次数变动 |
| 合计 | — | 8.38 | 10.76 | — |
只看这张表,结论是"自充省 2.38 元"。但表里藏着一个陷阱:"回家 1 次"是按 30 单算的。单量一旦超过两块电池的续航,第 2 次回家和第 3 块电池会同时被拉进来,成本不是线性上涨,是跳。所以真正的问题不是"哪个便宜",而是:在多大的单量、多高的电价下,这个"便宜"还成立?
1.2 为什么要优化
第一,成本是阶跃的,不是连续的。电池按块买,一块 1.30 度电、跑 17 单,买到第 3 块就多 1.80 元折旧;回家一趟多 4.00 元时间。这两笔钱都是"跳"上去的,用平均单价算,永远算不出台阶在哪。
第二,隐性时间成本不显性化,自充永远赢。若把回家那 0.40 小时按 0 元计,自充在 30 单只要 4.38 元,租电 10.76 元,差距大到没有讨论价值。把时间按 10 元每小时折进去,差距立刻缩到 2.38 元——这就是本题的全部张力。
第三,租与自不是两个数,是两组组合。买 1 块还是 3 块、回 0 次还是 2 次、换 2 次还是 3 次,互相牵制:块数少于回家次数就换不过来,回家次数少于单量需求就跑不完。这种"互相牵制的整数选择",正是整数规划该干的活。
1.3 Gurobi 如何求解
模型有 1 个 0-1 变量 \(z\)、3 个整数变量(块数 \(k\)、回家次数 \(r\)、换电次数 \(n\))、4 个连续充电量 \(q_{t}\),共 8 个决策量、13 条约束。二选一用大 M 写成"两条下界 + 互斥惩罚"(式 6),避免了 \(z\cdot c_{rent}\) 这种非线性;容量与块数的耦合写成两条线性不等式(式 4)。整题在根节点即证最优,单次求解 0.01 s,因此 20 点热图、6 点第三维扫描都能在 60 s 预算内跑完。另用闭式解在 7 个单量点上与 MILP 对拍,最大偏差 0.00 元。
2 数学模型
2.1 符号说明
\(D\) 为日单量(单);\(e_{0}=0.0767\) 为单均耗电(度每单);\(Q_{b}=1.30\) 为单块电池可用容量(度);\(\eta=0.88\) 为充电效率;\(p_{t}\) 为第 \(t\) 个电价窗口的电价(元每度);\(\delta=1.80\) 为电池折旧(元每块日);\(v=10\) 为时间价值(元每小时);\(\tau=0.40\) 为一次回家换电的占用时长(h);\(c_{s}=1.55\) 为单次换电的绕行与等待成本(元);\(z\in\{0,1\}\) 是否租电;\(k\in\{0,1,2,3\}\) 自购块数;\(r\in\{0,1,2\}\) 白天回家次数;\(n\in\mathbb{Z}_{+}\) 换电次数。
2.2 目标函数
目标把两条互斥路径的和压到最小:选租电时 \(c_{self}\) 被大 M 顶成 0,选自充时 \(c_{rent}\) 被顶成 0。这不是"两个方案各算一遍再比大小",而是让模型自己决定走哪条路——差别在于,路的选择会反过来改变块数、回家次数这些整数变量,从而改变成本本身。
2.3 约束条件
自充成本三项:电费按实际充电窗口的电价计价(夜间 0.30、早平 0.62、午峰 0.95、晚峰 1.20),折旧按块数,时间成本按回家次数。\(q_{t}\) 是模型自己分配的,不是假设"都在夜里充"——这一点在结果里得到了验证:全部 100.00% 的电量落在夜间谷段,因为夜间窗口 8 小时能充 5.2 度,足够覆盖 51 单的上限。
电量平衡与窗口上限。\(M=200\) 是充分大的常数(远大于任何可能的日成本),\(z=1\) 时右端变负,约束自动松弛。
块数、回家次数与续航的三角关系。第一条 \(r+1\le k\) 是本题最容易漏的一条:白天回家换电,换下来的那块必须已经在夜里充好,所以"用过的块数"永远等于"回家次数加一";漏掉它,模型会让 1 块电池撑 3 次回家,成本算成 10.69 元的假最优。第二条 \(k\le 3(1-z)\) 保证租电时不买电池。第三条是容量线:单块跑 \(Q_{b}/e_{0}\approx 17\) 单。
租电成本:月卡折日 7.65 元,加上每次换电的绕行 0.72 元与 5 分钟等待(合 1.55 元),换电次数由单量除以单块续航向上取整得到——因为 \(n\) 出现在最小化目标里,取整是自动的,不需要额外的 ceiling 约束。
大 M 互斥。\(z=1\) 时 \(c_{self}\) 的下界掉到负数、被非负约束截为 0;\(z=0\) 时反过来。两条式子合起来等价于 \(\min\{c_{self},c_{rent}\}\),但保留了全部整数变量参与决策的能力。
两个临界量的定义式:\(p^{*}\) 是使两条路径相等的电价,\(D^{*}\) 是使自充首次变贵的最小单量。前者是解析的,后者只能靠扫描——因为成本函数在容量线处不连续,求导没有意义。
2.4 规模与性质
8 个决策量、13 条约束,规模小到可以手算校验,但它的解不可用"单位成本乘单量"推出:成本函数在 \(D=17\)、\(D=34\)、\(D=51\) 三个点各跳一次,每跳一次都可能把最优方案从自充翻到租电。这也解释了为什么现实里"跑得少的人自充、跑得多的人租电"——不是偏好,是台阶。
3 Gurobi 求解实现
3.1 建模要点
z = m.addVar(vtype=GRB.BINARY) # 1 = 租电,0 = 自充
k = m.addVar(vtype=GRB.INTEGER, lb=0, ub=3) # 自购电池块数
r = m.addVar(vtype=GRB.INTEGER, lb=0, ub=2) # 白天回家换电次数
n = m.addVar(vtype=GRB.INTEGER, lb=0, ub=8) # 换电次数(租电时)
q = m.addVars(4, lb=0.0) # 四个电价窗口的充电量
m.addConstr(gp.quicksum(0.88*q[t] for t in range(4)) >= E0*D - 200*z) # 电量
m.addConstr(r + 1 <= k + 10*z) # 电池块数
m.addConstr(D <= QSW*(r + 1) + 200*z) # 单块续航
m.addConstr(n*QSW >= D - 200*(1 - z)) # 换电次数
m.addConstr(cS >= gp.quicksum(PW[t]*q[t] for t in range(4)) + DEL*k + V*TH*r - 200*z)
m.addConstr(cR >= PRENT + SWD*n - 200*(1 - z))
m.setObjective(cS + cR, GRB.MINIMIZE)
两个实现细节。第一,二选一不要写成 \(z\,c_{rent}+(1-z)\,c_{self}\):目标里出现"变量乘变量"会变成 MIQCP,Gurobi 要额外分支,本例虽小但性质变差;写成"两条下界 + 互斥大 M"后是纯 MILP,根节点即解。第二,换电次数的取整交给目标函数:只写 \(n\,Q_{b}\ge D\) 而不写等号,模型为了省 1.55 元会自己把 \(n\) 压到最小整数——比手写 ceil 更稳,也允许"多换一次更划算"的情形自然出现。
3.2 求解结果
表 2 三种租/自组合在 30 单下的日成本对照
| 方案 | 电池块数 | 回家次数 | 换电次数 | 现金成本 /元 | 时间成本 /元 | 合计 /元 |
|---|---|---|---|---|---|---|
| 两块自充 | 2 | 1 | 0 | 4.38 | 4.00 | 8.38 |
| 三块自充 | 3 | 2 | 0 | 6.18 | 8.00 | 14.18 |
| 全租换电 | 0 | 0 | 2 | 10.76 | 0.00 | 10.76 |
三行读完:两块自充 8.38 元最便宜;三块自充 14.18 元反而最贵,多买一块、多回一趟家,换来的 17 单余量在 30 单的场景里一点用没有,纯粹是浪费 5.80 元;全租 10.76 元,比自充贵 2.38 元,但不需要买电池、不需要回家、单量涨上去也不跳价。
表 3 日单量扫描下的最优组合(电价 0.30 元每度)
| 日单量 /单 | 自充块数 | 回家次数 | 自充成本 /元 | 租电成本 /元 | 最优 | 差额 /元 |
|---|---|---|---|---|---|---|
| 20 | 2 | 1 | 8.12 | 10.76 | 自充 | 2.64 |
| 30 | 2 | 1 | 8.38 | 10.76 | 自充 | 2.38 |
| 34 | 3 | 2 | 14.29 | 12.31 | 租电 | 1.97 |
| 36 | 3 | 2 | 14.34 | 12.31 | 租电 | 2.03 |
| 40 | 3 | 2 | 14.45 | 12.31 | 租电 | 2.13 |
| 46 | 3 | 2 | 14.60 | 12.31 | 租电 | 2.29 |
| 50 | 3 | 2 | 14.71 | 12.31 | 租电 | 2.39 |
4 结果分析

图 1 30 单下两种方案的成本构成(棒棒糖长度=金额,颜色=方案)
**4.1 成本不是一个数,是五根棍子** 图 1 把 30 单的两条路拆成五根棍子。自充这边:电费只有 0.78 元,短得几乎看不见;折旧 3.60 元;回家时间 4.00 元——**后两根加起来是电费的 9.7 倍,自充的钱根本不是花在电上,是花在电池和脚程上。** 租电那边:月卡 7.65 元是硬底,绕行 3.11 元是浮动的。**两条路的成本结构完全不同——一条是"重资产 + 轻运营",一条是"零资产 + 重订阅",所以它们对不同单量的反应也完全不同。**
图 2 日单量与日成本的散点气泡(气泡=电池块数/换电次数)
**4.2 两条曲线在 34 单处换位** 图 2 横轴日单量、纵轴日成本。**自充(蓝)是阶梯:17 单之前 1 块、17 到 34 单 2 块、34 单之后 3 块,每一级都往上跳一次;租电(橙)也是阶梯,但跳得缓——每 17 单才多一次换电、多 1.55 元。** 淡蓝虚线的交叉点就在 33.9 单:**左边自充低 2 元,右边租电低 2 元,中间没有过渡带,因为成本是跳的。** 这也是"临界日单量"唯一能定义的方式——不是解方程,是找两条阶梯的先后次序反转点。
图 3 三种租/自组合的日成本分解(实色=现金成本,浅色=时间成本)
**4.3 多买一块电池是最差的一手** 图 3 三根柱:两块自充 8.38 元、三块自充 14.18 元、全租 10.76 元。**三块自充比两块贵 5.80 元,比全租还贵 3.42 元——它同时背着"多一块折旧 1.80 元"和"多一趟回家 4.00 元"两笔钱,却只买到用不上的 17 单余量。** 注意柱子的配色:自充的时间成本占了 47.7%,租电是 0——**"租电贵"贵在明处,"自充便宜"便宜在暗处,暗处那部分一旦被算进来,便宜就不多了。**
图 4 一周六天的累计成本阶梯(横轴标签为当日单量)
**4.4 差距是在第四天一次性收窄的** 图 4 按一周六天(单量 22 到 42)累加。**前三天 22、26、30 单,自充每天省 2.4 元上下,三天攒下 7.44 元;第四天单量 34,一脚踩过 33.9 单的容量线,日成本从 8.38 元跳到 14.29 元,当天反倒比租电贵 1.97 元,累计优势一天之内从 7.44 元缩到 5.47 元。** 六天累计:自充 68.0 元、租电 69.2 元,自充仍省 1.2 元,**但这条累计线的形状说明了一切——自充的优势是"攒"出来的,租电的劣势是"摊"平的,单量越不稳,攒的越容易被一次跳价吃掉。**
图 5 日单量对最优日成本与租电决策的影响(右轴为 0-1 阶梯)
**4.5 主灵敏度:决策在 35 单处翻转** 图 5 左轴最优日成本、右轴 $z$ 的阶梯。**单量 20 到 34,$z=0$,成本从 8.1 元爬到 8.4 元;35 单处阶梯跳到 1,成本直接站在租电的 12.3 元上。** 值得注意的是 60 单时最优成本是 13.9 元——**不是自充 3 块撑不住,而是自充到 51 单就到顶,再往上只能租电;租电的成本随单量几乎不动(每 17 单才多 1.55 元),这就是"包月"的本质:把边际成本压成 0,把固定成本抬高。**
图 6 日单量 × 夜间电价的成本差热图(红=租电更便宜,蓝=自充更便宜)
**4.6 电价这个旋钮只在临界单量附近才有用** 图 6 是四档单量乘五档电价的成本差。**20 单那一整行全蓝(自充便宜 0.6 到 2.6 元),40 单、50 单两整行全红(租电便宜 2.1 到 7.6 元),只有 30 单这一行从左到右由蓝转红,翻转点落在 1.21 元每度——这正是式 (7) 的 $p^{*}$。** 沿电价方向看:30 单那一行,电价从 0.30 涨到 1.50,差值从 2.38 走到 0.76,摆幅 -1.62 元,只占日成本的三成;**因为自充的电费本来就只占成本的 9.4%,电价涨五倍,总成本也只涨 37.4%。** 换句话说:**电价能改变"自充省多少",改不了"谁更省"——除非你正好站在临界单量上。沿单量方向走一步(20 到 40 单,电价不动 0.30 元),差值从 -2.64 跳到 2.13,一步跨过 4.77 元,是电价走满五档的两倍。**
图 7 回家换电的时间价值对临界日单量的影响
**4.7 第三维:时间越贵,临界单量越低** 图 7 横轴时间价值 $v$,左轴临界单量,右轴 30 单的自充成本。**$v$ 从 2 元每小时涨到 22 元每小时,临界单量从 50.9 单掉到 17.0 单,中间只停过 33.9 这一档——不是渐变,是三级台阶,因为容量按块算、回家按趟算,$v$ 只是把台阶往左推。** 相比之下右轴的自充成本(5.18 元到 13.18 元)是连续的,因为时间按小时计价。**两条线一对比就看得出:时间价值抬高的不是"每天多花几块钱",而是"能承受的单量上限往下掉一个档次"。** 本案取的 10 元每小时是保守值——若按小哥真实机会成本(午高峰一小时能挣 30 元以上)算,临界单量压到 17.0 单,**那时候"自充划算"只剩半天跑单的兼职骑手成立。**
图 8 日成本—可承载单量的非支配前沿,灰区为自充容量不可行区
**4.8 前沿与天花板** 图 8 把两种方案的"整数档位"全画出来:自充 1/2/3 块对应 17.0、33.9、50.9 单,租电 1 到 4 次换电对应同样的 17 单一档。**淡灰区是自充的容量天花板——50.9 单以上,无论买几块电池都跑不完,只能租。** 非支配前沿(红虚线)从"1 块 2.23 元 / 17 单"爬到"4 次换电 13.87 元 / 68 单",**每一级的斜率就是"多承载 17 单要花多少钱":自充从第 1 块到第 2 块要 6.24 元,租电从 1 次到 2 次只要 1.55 元——这就是租电在"小步扩容"上便宜、在"起步"上贵的原因。** 星号落在 30 单 / 8.38 元,**位置在"2 块"档的左下方:同样的钱自充能撑 33.9 单,今天只跑 30 单——这 3.9 单的余量,正是它比租电便宜 2.38 元的来源,也是它一过线就翻车的原因。**
图 9 单量随机波动下两种方案的日成本分布与累计概率
**4.9 自充的分布是双峰的** 图 9 把日单量按均值 30、标准差 6 抽 4000 天。**自充分布明显有两坨:34 单以下一坨在 8.33 元附近,34 单以上一坨在 14.36 元附近,中间是空的——因为成本是跳的,不存在"平均 11 元"这种日子。** 租电的分布窄得多,挤在 10.76 元。**自充贵过租电的概率是 25.1%——差不多每四天有一天,自充反而更贵。用均值比较会得到"自充每天省 2 元"的结论,用分布看才知道这 2 元是拿"四分之一的日子多花 4 元"换来的。**
图 10 不同单量下自充成本的三项分解与同单量租电成本
**4.10 边际贡献:每一档加的是什么钱** 图 10 是六档单量的堆叠。**18 到 30 单,柱子只长"电费"那一小截(0.47 元到 0.78 元),折旧和回家时间纹丝不动;到 34 单那一档,柱子里同时多出 1.80 元折旧和 4.00 元时间,柱子从 8.38 元窜到 14.29 元,一步跨过租电线(12.31 元)。** 对比橙线:34 单之前橙线始终在上方,34 单之后落到下方——交叉就发生在 33.9 单。**堆叠图最有说服力的一句是:自充的边际成本不是 0.30 元每度,而是"每 17 单一次 4 元多的台阶",只是这个台阶被平均到每一单上,看起来才像 0.30 元。**5 结论
- 30 单的答案是自充:两块电池、白天回家 1 次,日成本 8.38 元,比租电的 10.76 元省 2.38 元。 省的钱不在电费(只有 0.78 元),在"不用付 7.65 元的月卡底"。
- 临界日单量是 33.9 单,恰好是两块电池的容量线。 越过这条线,第三块电池(+1.80 元)和第二趟回家(+4.00 元)同时被拉进来,自充成本从 8.38 元跳到 14.18 元,比租电贵 3.42 元。临界点不是一个平滑的交点,是一级 5.80 元的台阶。
- 临界电价是 1.21 元每度,现实中基本碰不到。 因为电费只占自充总成本的 9.4%,电价要涨四倍才能把差距抹平。所以"等电价降了再自充"是个伪命题——电价从来不是决策变量,单量才是。
- 自充的优势是脆的,不是稳的。 日单量按 30±6 波动时,有 25.1% 的日子自充反而更贵;一周六天里,第四天一次跳价就抹掉四分之三的优势。"平均更便宜"和"每天都更便宜"是两件事。
- 时间价值决定这条临界线在哪。 \(v\) 从 2 元每小时涨到 22 元每小时,临界单量从 50.9 单压到 17.0 单。兼职骑手自充划算,全职骑手租电划算——不是因为他们算得不一样,是因为他们的 0.40 小时值不一样的钱。
参考文献
[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 -u batch_062.py;数据与结果见同目录 data_062.csv / results_062.json,图见 figs/

浙公网安备 33010602011771号