案例 068 谷电充电省多少
案例 068 谷电充电省多少
摘要:小哥 20:00 收车插枪、07:00 出车,电池 3.0 度只剩 0.5 度,当日要补 2.3 度才能顶到 2.8 度。电价分三档,峰 1.00、平 0.60、谷 0.30 元每度,谷段是 0:00—07:00 的 7 小时。把 11 个可用小时各设一个充电量变量 \(x_{t}\),用 0-1 变量 \(b_{t}\) 刻画"已插枪"、以 \(n_{r}=\lceil E/\bar{P}\rceil\) 作充电小时数,在"补足 2.3 度"和"1.2 kW 功率上限"下最小化电费加占位费。Gurobi 求得最优开始时刻为 5:00,日支出 0.69 元,比"回家就充"的 6.80 元省 6.11 元、年省 2230 元;谷段窗口短于 1.92 小时就必须动用平价电。
关键词:分时电价;充电调度;0-1 调度;占位费;临界窗口
1 问题提出
1.1 一晚上的充电账
小哥跑一整天耗 2.3 度电,夜里回家只剩 0.5 度。次日 07:00 出车前要把电量顶到 2.8 度,也就是补 2.3 度。小区充电桩 1.2 kW,纯充电至少要 1.92 小时。电价按小时分三档,谷段集中在 0:00 之后:
表 1 逐小时电价、桩可用性与三策略充电量
| 时刻 | 时段 | 电价/元每度 | 回家就充/kWh | 谷段集中/kWh | 优化分时/kWh |
|---|---|---|---|---|---|
| 20:00 | 峰 | 1.00 | 1.20 | 0.00 | 0.00 |
| 23:00 | 平 | 0.60 | 0.00 | 0.00 | 0.00 |
| 0:00 | 谷 | 0.30 | 0.00 | 1.20 | 0.00 |
| 5:00 | 谷 | 0.30 | 0.00 | 0.00 | 1.20 |
| 6:00 | 谷 | 0.30 | 0.00 | 0.00 | 1.10 |
桩从 20:00 到次日 07:00 可用,共 11 个小时;07:00 之后人车都走了。表 1 最后三列是三种策略的充电量:优化方案只在 5:00 与 6:00 两个小时里充,其余九个小时一度不动。
1.2 为什么要优化
价差本身并不惊人:2.3 度电全在峰段是 2.30 元,全在谷段是 0.69 元,一天差 1.61 元,一年 588 元,只占峰段电费的 70%。真正咬人的是占位费:共享桩按 0.50 元每小时收,从"充满"到"拔枪"这段时间照样计费。20:00 插枪 22:00 就满了,人却睡到 07:00,白交 9 小时、4.50 元,是电费的 2.0 倍。所以三条路的差距不在"用不用谷电",而在"什么时候插枪"。
1.3 Gurobi 如何求解
把一晚上切成 11 个小时,每小时一个连续变量 \(x_{t}\)(充多少度)加一个 0-1 变量 \(b_{t}\)(插没插枪),模型就是一个 22 个变量的混合整数规划。求解分三步:先由"补足 2.3 度"定出可行域下界,再用 \(b_{t}\) 的单调性保证"插枪后一直插到出门",最后由目标里的占位费把解推到"尽量晚开始"。总共 23 条约束,Gurobi 在根节点即得最优。
2 数学模型
2.1 符号说明
表 2 符号说明
| 符号 | 含义 | 取值/单位 |
|---|---|---|
| \(t\) | 到家后第 t 小时(1 即 20:00) | 1—11 |
| \(x_{t}\) | 第 t 小时充电量 | kWh |
| \(b_{t}\) | 第 t 小时是否已插枪(0-1) | - |
| \(n_{r}\) | 满功率充满所需小时数 | 2 h |
| \(p_{t}\) | 第 t 小时电价 | 元/度 |
| \(E\) | 当日需补回电量 | 2.3 kWh |
| \(\bar{P}\) | 充电桩功率上限 | 1.2 kW |
| \(c_{o}\) | 占位费率 | 0.50 元/h |
| \(W\) | 谷段可用时长 | 7 h |
2.2 目标函数
电价是时间 \(t\) 的分段函数,谷段只覆盖 0:00 起的 \(W\) 小时:
一晚总支出等于各小时电费之和,加上"插着却没在充"的占位费:
其中 \(\varepsilon=10^{-4}\) 只用于打破"早充晚充同样便宜"的平局,不影响最优成本的量级。
2.3 约束条件
补电总量必须够次日跑:
每小时充电量受桩功率与插枪状态双重限制,没插枪就不能充:
插枪是一去不回的,\(b_{t}\) 单调不减,把插枪时段锁成一段连续区间;插枪时长又必须容得下 \(n_{r}=\lceil E/\bar{P}\rceil\) 个满功率小时:
2.4 规模与性质
22 个变量(11 个连续 + 11 个 0-1)、23 条约束,规模很小但结构清楚:\(b\) 单调加 \(\sum b\ge n_{r}\),可行集等价于"选一个插枪起点 \(s\),从 \(s\) 一直插到 11",占位恰好是 \((11-s+1)-n_{r}\)。去掉 0-1 后 LP 松弛会把 \(b\) 摊成小数、占位费被抹平,所以 0-1 不能省。
3 Gurobi 求解实现
3.1 建模要点
x = m.addVars(ts, lb=0, ub=P)
b = m.addVars(ts, vtype=GRB.BINARY)
m.addConstr(gp.quicksum(x[t] for t in ts) == E)
m.addConstr(gp.quicksum(b[t] for t in ts) >= nreq)
for t in ts:
m.addConstr(x[t] <= P*b[t])
for t in ts[1:]:
m.addConstr(b[t] >= b[t-1])
m.setObjective(gp.quicksum(p[t-1]*x[t] for t in ts)
+ co*(gp.quicksum(b[t] for t in ts) - nreq) + 1e-4*gp.quicksum(b[t] for t in ts))
一个实现细节:占位费不能写成 \(c_{o}\sum(b_{t}-y_{t})\) 再引入"正在充"的 \(y_{t}\)。那样求解器会让 \(y_{t}=1\) 而 \(x_{t}\approx0\),等于"假装在充、免费续占位",占位一小时 0.50 元、假装充电一小时只要几分钱,套利空间极大。改用常量 \(n_{r}=\lceil E/\bar{P}\rceil\) 作充电小时数,占位 \(=\sum b-n_{r}\),既保持线性又堵死了这条路。
3.2 求解结果
表 3 三种策略的日支出分解
| 策略 | 开始时刻 | 谷/平/峰电量 kWh | 电费/元 | 占位/h | 合计/元 |
|---|---|---|---|---|---|
| 回家就充 | 20:00 | 0 / 0 / 2.3 | 2.30 | 9 | 6.80 |
| 谷段集中充 | 00:00 | 2.3 / 0 / 0 | 0.69 | 5 | 3.19 |
| 优化分时 | 5:00 | 2.3 / 0.0 / 0.0 | 0.69 | 0 | 0.69 |
最优解把 2.3 度电全部塞进 5:00—07:00 这两个小时,电费 0.69 元、占位 0 小时,合计 0.69 元。同样用谷电的"谷段集中充"因为 0:00 就插枪,充满后仍占位 5 小时,多付 2.50 元,是 3.19 元——充电时段对了、插枪时刻不对,这就是占位费的杀伤力。
4 结果分析
4.1 电价结构与充电落点(图 1、图 2)
图 1 把一晚上的电价画成阶梯:前 3 小时峰、23:00 平、0:00 之后 7 小时谷,07:00 出车拔枪。谷段在可用窗口里占 7/11,看起来绰绰有余——只需 1.92 小时就能充满,窗口是需求的 3.7 倍。图 2 的气泡是三条路的落点:峰段的两个点贴着 1.00 元那条台阶,谷段的四个点贴着 0.30 元,位置越高越贵、越靠右越省。

图 1 分时电价阶梯与桩可用窗口:谷段 7 小时,需求仅 1.92 小时

图 2 三种策略的充电落点:峰段贵、谷段便宜
4.2 三策略与累计过程(图 3、图 4)
图 3 把日支出拆成四段:回家就充几乎全是峰段电费 2.30 元,再压上 4.50 元占位费;谷段集中充电费只有 0.69 元,但占位 5 小时又是 2.50 元;优化分时把两项都清零,只剩 0.69 元。合计从 6.80 元降到 0.69 元,降幅 90%。

图 3 三种策略的日支出分解:电费按峰/平/谷三段,另加占位费
图 4 是这一晚的时间轴:柱子是逐小时充电量,在 5:00 与 6:00 各 1.2 度与 1.1 度;折线是累计补电量从 0 爬到 2.3 度,正好停在目标线的位置;底色是三个电价时段,两根柱子都落在谷段底色里。充满即出门,占位为零。

图 4 优化方案的逐小时充电量与累计补电量(底色为电价时段)
4.3 谷段窗口、电量与占位费率(图 5—图 7)
图 5 扫谷段可用时长 \(W\):把占位费置零后(实线),\(W\ge2\) 曲线就平了,全部用谷电;\(W=1\) 时只剩 1.2 度谷电,缺的 1.1 度只能用平价,日电费从 0.69 元抬到 1.02 元。临界值 1.92 小时由此而来,它是 \(E/\bar{P}\),只由电量和功率决定,与电价无关。把占位费加回来(虚线,0.50 元每小时),曲线整体抬高:\(W=5\) 要 1.38 元、\(W=6\) 要 1.02 元,只有 \(W=7\) 才回落到 0.69 元——谷段必须一直拖到出门,才能既用谷电又不占位。

图 5 谷段时长对日电费与总支出的影响及临界窗口 1.92 小时
图 6 把谷电价和需补电量放在一张热图上:等值线是一族双曲线,往右(补电更多)、往上(谷价更贵)颜色同时加深,左下浅黄、右上深红。星标在 \((2.3,\ 0.30)\),正是本案参数。谷价从 0.15 涨到 0.45,日支出从 0.34 涨到 1.03 元;补电从 1.8 涨到 2.9 度,日支出从 0.54 涨到 0.87 元。两个方向的斜率都是常数——谷段充足时,日支出就是"单价乘电量",没有别的结构。真正的结构性风险在图 5 的窗口上。

图 6 谷电价与需补电量的二维日支出曲面(星号为本案参数)
图 7 单独扫占位费率:0.50 元每小时是本案取值,此时回家就充 6.80 元、谷段集中 3.19 元、优化 0.69 元。费率降到 0,三者变成 2.30 / 0.69 / 0.69 元,优化与谷段集中打平;费率涨到 0.40 元每小时,回家就充与谷段集中持平,再涨"先插上再说"就彻底不划算。这条交叉线给了一个判据:占位费一旦超过 0.40 元每小时,就必须定时到最后一刻再充。

图 7 占位费率对三策略的影响与交叉点 0.40 元每小时
4.4 前沿、分布与汇总(图 8—图 10)
图 8 把"等"和"花"画成前沿:20:00 就充要 6.80 元,等到 0:00 降到 3.19 元,等到 5:00 降到 0.69 元;再往后(右侧阴影)就来不及在 07:00 前充满,属于不可行区。前沿在 5:00 处终止,这就是"最晚可行开始时刻"——等待本身不要钱,因为那 9 小时都在睡觉,要的只是一个定时器。

图 8 等待时长—日支出前沿与来不及充满的不可行区
图 9 让日耗在 1.8—2.8 度之间波动、谷段窗口在 2—7 小时之间随机,跑 400 天:节省额集中在 5.45 元附近,最少的一天也省 4.96 元,反例 0 天。节省额全部为正,优化调度在随机场景下稳定占优。

图 9 400 天随机场景下相对回家就充的日节省分布
图 10 把从回家就充到优化分时的差额逐项拆开:峰段电费清零 +2.30 元、谷段电费新增 +0.69 元、占位费清零 +4.50 元,合计 -6.11 元。占位费一项就是峰段电费的两倍,这次优化真正省下的不是电价、是"占着位不挪车"。

图 10 从回家就充到优化分时的边际贡献分解
5 结论
第一,最优调度是把 2.3 度电压在 5:00—07:00 的最后两个小时,电费 0.69 元、占位 0 小时,日支出 0.69 元,比回家就充省 6.11 元。第二,省下的钱里电费只占 1.61 元(年 588 元,与"一年省六百"的量级吻合),占位费占 4.50 元。只盯电价会漏掉大头。
第三,谷段窗口的临界值是 1.92 小时(\(E/\bar{P}\))。窗口长于它,多出来的谷电时段毫无价值;短于它,每缺 1 小时就要用 1.2 度平价电顶上,日电费多 0.36 元。第四,占位费率 0.40 元每小时是一条分界线:低于它,"等到谷段"仍然值得;高于它,"先插上、早上再拔"的代价会吞掉全部价差。
第五,这套"逐小时量 + 插枪 0-1 + 占位计费"的骨架只有 22 个变量,可直接搬到电动自行车、电动摩托乃至家用储能的夜间补电,换的只是电价表和功率。
参考文献
[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_068.py;数据与结果见同目录 .csv / .json,图见 figs/

浙公网安备 33010602011771号