共享储能背景下综合能源微网主从博弈建模与求解
在电力系统优化调度这个圈子里双层优化、主从博弈已经不算什么新概念了但把“共享储能”和“综合能源微网”放到同一个主从框架里让微网运营商作为上层领导者去制定价格策略下层多个微网根据价格调整自身用能计划——这个组合确实还有不少文章可做。我自己做这个方向也有段时间了从模型搭建到程序调试踩了不少坑今天就把这套“共享储能背景下考虑微网运营商主从博弈”的程序框架完整拆一遍讲清楚模型怎么建、程序怎么解、坑在哪里。1. 项目整体拆解这套程序到底在算什么先把这个课题的骨架立起来。不是所有带“博弈”二字的论文都值得做但这个确实有它的现实逻辑传统微网各自为政每家配一套储能投资大、利用率低共享储能相当于把储能资源集中起来运营微网按需租用类似“电力版的共享单车”。这时候一个核心问题就出现了——共享储能由谁来运营怎么定价微网什么时候租、租多少、怎么充放电主从博弈Stackelberg game正好描述这种“先决策、后跟随”的层级关系。微网运营商MGO作为共享储能的投资运营方先确定向微网收取的储能服务价格、电量交易价格各个微网作为跟随者在看到价格后优化自己的设备出力和购能计划。两者目标函数不同、决策变量不同但相互影响最终收敛到一个均衡解。这也就是为什么这个课题“具有一定的创新性”它在物理上打通了“共享储能”这种商业模式在数学上把微网的用能优化升级成了博弈问题。对于学生或者从业者来说这套程序做完之后能复用到的场景很多——园区综合能源、虚拟电厂、配网级多主体交易都可以套用类似的“上层定价-下层决策”框架。先说清楚程序的最终效果给定微网的电负荷、气负荷、热负荷给定分布式光伏、风电出力曲线给定共享储能参数和外部电网分时电价程序通过主从博弈求解输出各微网逐时段的购电量、购气量、储能充放电计划、内部交易价格以及运营商和微网各自的收益/成本。最终验证的是共享储能方案比微网自建储能方案、以及无储能方案在各主体收益和系统运行指标上的优势。1.1 核心关键词拆解主从博弈、综合能源微网、共享储能三者的关系先说“主从博弈”。它有严格的定义博弈中的参与者有先后顺序领导者Leader先行动追随者Follower观察到领导者的决策后再行动。这跟纳什均衡那种同时决策的静态博弈完全是两码事。在电力市场背景里主从博弈的典型应用就是“售电公司定电价、用户调负荷”。在我们的模型里微网运营商就是Leader各微网是Follower。再说“综合能源微网”。单纯的电微网不难做但综合能源微网引入了天然气、热能、甚至冷能核心设备是热电联产CHP机组、燃气锅炉、电制冷机、蓄热罐这类的多能耦合设备。微网不再是单一的“用电户”它可以自己发电、自己产热向电网买电、向气网购气内部还可以电转热、气转电。这时候下层优化问题的变量维度大幅增加设备运行约束也多了好几个量级。而“共享储能”是这套模型在商业模式上最大的亮点。跟“用户侧自建储能”相比共享储能更像一个“储能即服务”Storage-as-a-Service的架构储能资产归运营商或者第三方储能聚合商所有微网不需要承担初始投资只需要在使用时付费。在模型里这意味着微网的决策变量里不会有“储能投资容量”这种0-1整数变量取而代之的是“储能租赁容量”和“充放电功率”运营商的收益里则多了一项储能服务收费。1.2 为什么微网运营商适合当博弈的“上层领导者”你可能会问为什么上层必须是微网运营商而不能是微网、储能一起做集中优化这里面有两层原因。第一层是信息与激励不一致。集中优化模型假设所有主体共享所有信息、服从同一个目标函数——这在实际中很难成立。微网和运营商是不同利益实体微网的目标是自己的运行成本最低运营商的目标是自己的收益最大两个目标方向本身就有冲突。主从博弈模型把这种冲突显式表达出来更贴近现实。第二层是决策顺序的自然属性。运营商拥有共享储能在物理上掌握着“能源路由器”式的资源它可以先公布服务价格然后才有微网的用能响应。这种“你先定价、我再决策”的顺序是天然的主从关系不勉强。在程序实现上上层模型实际上是一个“定价优化问题”下层模型是一个“运行调度问题”两者之间靠KKT条件或者迭代算法衔接逻辑也很顺畅。2. 综合能源微网建模不是只有电一种能量这部分是整个程序里工作量最大的一块。综合能源微网的下层模型结构上是一个“多能源输入—设备转换—多能源输出”的网络光设备模型就得列十几二十个公式。我做的时候是先画了一张能源流图把电力、天然气、热能的产生、转换、存储、消耗全梳理清楚再开始写约束否则很容易漏约束或者重复约束。以一个典型园区级微网为例它通常包含以下核心单元分布式光伏PV和风力发电WT出力曲线是给定输入数据热电联产机组CHP消耗天然气同时产电和产热这是多能耦合的核心燃气锅炉GB补充供热同样消耗天然气电储能EES可充可放储能电池这是微网侧自己拥有的储能非共享储能电制冷机/吸收式制冷机如果涉及冷负荷电负荷、气负荷、热负荷或冷负荷三类刚性需求2.1 设备建模的关键公式与物理含义先写CHP机组。这是综合能源微网区别于纯电微网的标志性设备。它的数学模型是[ P_{t}^{\text{CHP}} \eta_{e}^{\text{CHP}} \cdot V_{t}^{\text{CHP}} ][ H_{t}^{\text{CHP}} \eta_{h}^{\text{CHP}} \cdot V_{t}^{\text{CHP}} ]其中 (P_{t}^{\text{CHP}}) 是t时段CHP产电功率(H_{t}^{\text{CHP}}) 是产热功率(V_{t}^{\text{CHP}}) 是消耗的天然气功率(\eta_{e}^{\text{CHP}})、(\eta_{h}^{\text{CHP}}) 分别是发电效率和产热效率。这个模型把天然气和电力、热能联系了起来微网从气网购气的量一部分变成了电一部分变成了热。在程序里这里有个细节容易忽略CHP的“电热比”通常是固定的或者说在某个运行区间内可调。如果写成固定电热比那么产电和产热是绑定关系如果写成热电比可调区间程序就变成了带区间的双子模型求解难度会上一个台阶。我做的时候是先做固定热电比版本跑通再扩展成可调区间这样可以控制调试难度。再看燃气锅炉它就是一个“气转热”的装置[ H_{t}^{\text{GB}} \eta^{\text{GB}} \cdot V_{t}^{\text{GB}} ](V_{t}^{\text{GB}}) 是锅炉耗气功率。加上CHP的耗气微网的总购气量就是[ V_{t}^{\text{buy}} V_{t}^{\text{CHP}} V_{t}^{\text{GB}} ]而电储能模型用的是标准的充放电动态方程[ E_{t1}^{E} E_{t}^{E} \eta_{c} P_{t}^{c} \Delta t - \frac{P_{t}^{d}}{\eta_{d}} \Delta t ]以及容量约束[ E_{\min}^{E} \le E_{t}^{E} \le E_{\max}^{E}, \quad 0 \le P_{t}^{c} \le P_{\max}^{c}, \quad 0 \le P_{t}^{d} \le P_{\max}^{d} ]2.2 多能耦合的平衡约束怎么写不出错多能耦合的微网它的关键约束是“母线平衡”也就是每个能源品种在每个时段的供需平衡。三种能量的平衡长这样电力平衡[ P_{t}^{\text{PV}} P_{t}^{\text{WT}} P_{t}^{\text{CHP}} P_{t}^{d} - P_{t}^{c} P_{t}^{\text{buy}} L_{t}^{e} P_{t}^{\text{EB}} ]其中 (L_{t}^{e}) 是电负荷(P_{t}^{\text{EB}}) 是电锅炉或其他电转热设备的耗电功率如果热负荷由电锅炉参与补充。热力平衡[ H_{t}^{\text{CHP}} H_{t}^{\text{GB}} H_{t}^{\text{EB}} L_{t}^{h} ]天然气平衡[ V_{t}^{\text{buy}} V_{t}^{\text{CHP}} V_{t}^{\text{GB}} ]这里的难点在于电平衡和热平衡通过CHP和电锅炉耦合在一起CHP多发电意味着多产热而多产热可能超出热负荷需求造成弃热电锅炉多耗电会加重电力供需压力但能缓解热负荷缺口。这种“此消彼长”的关系正是综合能源微网运行优化有意思的地方也是程序里最容易出现无解或者不可行的地方。2.3 新能源出力与负荷数据的预处理下层模型必须有输入数据。光伏和风机的出力曲线我通常用典型日的归一化出力系数乘以装机容量来生成也就是[ P_{t}^{\text{PV}} \lambda_{t}^{\text{PV}} \cdot P_{\text{cap}}^{\text{PV}}, \quad P_{t}^{\text{WT}} \lambda_{t}^{\text{WT}} \cdot P_{\text{cap}}^{\text{WT}} ]其中 (\lambda_{t}^{\text{PV}}) 是归一化光照出力系数。这里有一个常见问题如果PV、WT的装机容量在优化里也是变量那么程序会去优化“建设多少新能源”那就变成了容量规划问题而不是运行调度问题。这个课题的主从博弈框架聚焦的是运行层面——装机构成是给定的优化的是出力计划和交易策略。如果你之后想做规划-运行联合优化可以考虑把上层模型替换成容量规划模型但那是另一个量级的复杂度了。负荷数据方面电、气、热三类负荷曲线最好用同一时间尺度比如1小时一个点24个点方便对齐。如果只有电负荷数据热负荷和气负荷可以按比例构造但需要在论文里说明数据来源合理性别自己心里没数。3. 共享储能机制设计从“自建”到“共享租赁”共享储能是这个课题的“题眼”建模方式直接决定了程序的核心逻辑。我也见过不少论文把“共享储能”简单写成一个大储能让所有微网共同放电——这其实是变相自建储能没有体现“共享”的博弈含义。真正的共享储能在数学上应该是储能资产属于微网运营商上层不属于任何单一微网微网不能直接控制储能充放电而是向运营商“租赁”储能服务微网之间通过运营商间接共享储能容量谁租得多、谁用得多谁付费多。3.1 共享储能的两种建模方式对比共享储能模型在文献里主要有两种写法第一种是“容量租赁模式”。微网向运营商租用储能容量按月或按日支付租赁费然后微网获得该容量范围内的充放电使用权。这种模式的好处是模型实现简单——微网决策变量里有“租赁容量”和“充放电功率”付费项是“单位租赁容量价格 × 租赁容量 单位充放电功率价格 × 充放电功率”。第二种是“充放电服务费模式”。运营商设定充放电服务价格元/kWh微网每充一度电付一次费每放一度电付一次费储能本身的调度决策仍然由运营商上层统一决定。这种模式更像“充电宝租赁”用完按次付费。从博弈程序的可实现性来看我更推荐第二种或者第二种的变体。原因是第一种模式里微网租赁容量之后实际上还是“自己控制储能”运营商的决策空间被压缩成了单纯的定价主从博弈的层次感会弱很多。第二种模式则天然形成了“上层决策充放电计划 定价下层决策购能计划”的互动结构博弈特征更鲜明。我在自己的程序里选择的是“容量租赁 充放电功率租赁”的混合模式微网向运营商申报储能租赁容量获得对应的功率充放权限运营商的收益由三部分构成——向微网售电的电费收入、储能充放电服务费收入、以及向电网售电的收入。这个结构处理下来模型既没有过度简化又方便化成单层MIP。3.2 运营商上层的收益模型上层模型的目标函数是运营商总收益最大化表达式写出来长这样[ \max \quad \sum_{t} \left[ \pi_{t}^{s} P_{t}^{\text{sell}} \lambda_{t}^{c} P_{t}^{\text{charge}} \lambda_{t}^{d} P_{t}^{\text{discharge}} - c_{t}^{\text{grid}} P_{t}^{\text{net}} \right] - C^{\text{storage, inv}} ]其中(\pi_{t}^{s}) 是运营商向微网售电的价格(\lambda_{t}^{c})、(\lambda_{t}^{d}) 是储能充、放电服务费单价(c_{t}^{\text{grid}}) 是运营商从电网购电的分时电价(P_{t}^{\text{net}}) 是运营商从电网净购入的电量(C^{\text{storage, inv}}) 是储能投资成本的等年值分摊。这里有一个很关键的约束运营商卖电给微网的量不得超过微网的实际购电量也就是 (P_{t}^{\text{sell}} \le \sum_{n} P_{t}^{n,\text{buy}})。这个约束在程序实现里可以简化掉因为下层模型已经给出了微网的购电决策运营商只需按自己的售电价格卖出对应电量即可。但如果上层模型里 (P_{t}^{\text{sell}}) 是自由变量一定要加上这个逻辑约束否则程序会给出“运营商空卖电”的假自由变量解。3.3 共享储能系统运行约束共享储能自身的运行约束类似单储能模型但注意它的服务对象是多个微网充放电功率会被多个微网“瓜分”[ E_{t1}^{S} E_{t}^{S} \eta_{c}^{S} \sum_{n} P_{t}^{n,c} \Delta t - \frac{\sum_{n} P_{t}^{n,d}}{\eta_{d}^{S}} \Delta t ][ 0 \le \sum_{n} P_{t}^{n,c} \le P_{\text{rate}}^{S}, \quad 0 \le \sum_{n} P_{t}^{n,d} \le P_{\text{rate}}^{S} ]也就是所有微网的充电功率之和、放电功率之和都不能超过共享储能电站的额定功率。这个约束在程序里就是Gurobi/Cplex里的一条普通线性约束但如果漏了所有微网的充放电决策互相不受限制共享储能电站的物理容量形同虚设。另外共享储能还要考虑“容量配额”问题。多个微网同时租用同一个储能可能出现容量分配不均、个别微网长期租不到容量。在实际工程中运营商会设置“租赁容量上限”或“预留容量”机制。程序里我用了一个“政策系数”比如微网n可租赁的储能容量不超过总容量的40%避免一家独大。这个系数加进去之后博弈的均衡解会更合理论文里也能多一个敏感性分析的维度。4. 主从博弈模型构建与求解路径前面把两个层级的模型分别铺开了这一步就是把他们缝在一起。主从博弈的求解程序实现上有两条主流路线一条是“KKT条件转单层”另一条是“迭代求解”。这两条路线我走都走过各有优劣。4.1 路线一KKT条件转单层求解这条路线是学术论文里最常见的做法把下层优化问题的Karush-Kuhn-TuckerKKT最优性条件作为约束加入上层模型于是双层问题变成一个带互补约束的单层数学规划MPEC再用Big-M法将互补约束线性化最终转成MILP交给Gurobi/Cplex求解。以微网下层模型为例下层模型的形式是[ \min_{x} \quad f(x; \pi) \ s.t. \quad g(x) \le 0, ; h(x) 0 ]其中 (\pi) 是上层传来的价格参数。对下层模型构造拉格朗日函数[ \mathcal{L} f \mu^{T} g(x) \nu^{T} h(x) ]KKT条件包含三部分拉格朗日函数对 (x) 的梯度为零、互补松弛条件(\mu_i g_i(x) 0)、原始可行与对偶可行条件。把这三部分全部塞进上层模型后原来“上层先动、下层后动”的先后关系就变成了“同时满足所有主体的最优性条件”单层求解器可以直接处理。这条路线的问题在于互补松弛条件是非线性的乘积约束虽然可以用Big-M法线性化但Big-M的取值非常讲究——取值过大MIP求解数值稳定性差取值过小可能割掉可行解。常见做法是对偶变量往往有明确的物理含义比如微网购电的影子价格应根据单位电价的数量级设定M值经验上设在电价量级的100到1000倍比较稳。4.2 路线二迭代求解粒子群CPLEX/Gurobi如果KKT路线在程序实现时遇到麻烦——比如互补约束太多导致MIP求解极慢——迭代求解就是更实践性的选择。思路是上层模型用智能算法粒子群PSO、遗传算法GA、灰狼优化GWO等生成一组价格变量下层模型拿着这组价格去求解自己的优化问题得到一个决策值把这个决策值返回给上层上层根据该决策重新计算自己的收益更新价格变量继续迭代直到价格和决策收敛。这条路线在工程里非常实用尤其是当你手头已经有现成的微网调度优化模型时不需要改造下层模型直接把它封装成一个子函数上层用启发式算法去搜就完事了。我自己的程序用的是“PSO Gurobi”的组合PSO搜上层价格变量Gurobi解下层微网优化。这里有几个经验参数粒子群规模30-50个粒子维度等于价格变量的个数比如24时段购电价格 24时段放电服务费就是48维迭代次数200-500次惯性权重从0.9线性递减到0.4速度限制价格变量范围的比例系数避免粒子飞出可行域。这个方案的缺点是收敛性没有保证PSO可能陷入局部最优而且每一代PSO都要调用下层Gurobi求解器计算时间很长。我实测一个3个微网、24时段、每个微网约50个连续变量的模型一轮迭代耗时大约0.5秒300代就是150秒属于可以接受的范围。如果微网数量到10个以上建议还是把KKT路线走通用单层MIP求解。4.3 非线性项线性化实操无论走哪条路线都会遇到非线性项。下层微网模型里最常见的非线性是0-1变量与连续变量的乘积比如储能充放电状态变量 (u_{t})0-1变量和充电功率 (P_{t}^{c}) 的乘积。如果不处理Gurobi直接报“非二次约束”错误。线性化的标准做法是引入辅助变量 (\alpha_{t} u_{t} P_{t}^{c})然后用以下四条约束替换[ \alpha_{t} \le P_{\max} u_{t} ][ \alpha_{t} \ge P_{\min} u_{t} ][ \alpha_{t} \le P_{t}^{c} - P_{\min}(1 - u_{t}) ][ \alpha_{t} \ge P_{t}^{c} - P_{\max}(1 - u_{t}) ]这四条约束共同保证了当 (u_{t}1) 时(\alpha_{t} P_{t}^{c})当 (u_{t}0) 时(\alpha_{t}0)。这在我的程序里是最高频出现的代码段几乎每个设备模型都会用到。另外热/电负荷的二次成本函数比如有些论文会给微网加一个凸二次购电成本也可以用分段线性化处理但会增加变量数量。我的建议是第一版程序跑通之前别加二次项用分段线性做逼近就够了第二版再考虑二次凸函数的QCP求解。4.4 程序主流程设计我把自己的主程序框架列一下方便你对照搭建数据输入模块读取风光出力、负荷曲线、设备参数、外部电价、储能参数、算法参数PSO迭代次数、粒子数等上层决策生成模块初始化或更新运营商的价格变量PSO的粒子位置下层模型求解模块调用Gurobi/Cplex求解多个微网的独立优化问题返回微网购电计划、购气计划、负荷削减量等上层收益评估模块将微网决策代入运营商收益函数计算适应度值迭代与收敛判断模块更新PSO粒子判断是否达到最大迭代次数或收敛精度结果输出模块输出价格序列、微网用能计划、储能充放电计划、各主体收益/成本并绘制曲线。这个框架的好处是模块之间解耦清晰任何一个环节出了问题都能单独调试。比如下层微网模型跑出logical infeasible那就是设备约束写错了不用去动上层代码。5. 常见问题与程序调试经验最后说点干货——这个程序最容易踩的坑每个我都亲自趟过。5.1 双层模型无解或可行域为空这是最常见的问题。程序报“infeasible model”十有八九是下层模型某些约束写死了。我排查了多次之后总结出一个高效的技巧先固定上层价格变量为一个合理常数比如取外部电网电价只求解下层模型。如果下层模型在这个固定价格下都无解那说明下层模型自身的问题跟博弈无关。另一种可能是电价取值过低微网从运营商购电的价格比外部电网电价还低很多导致微网的下层模型“无限购电”或者反之电价太高导致微网完全不用电破坏了电平衡。解决方法是给价格变量加BOX约束上下界比如购电价必须介于外部上网电价和电网购电电价的1.2倍之间。5.2 Big-M定得不对KKT转单层时Big-M参数是玄学。取值太大MIP的LP松弛解全是“半边可行”求解器分支剪枝量爆炸取值太小又可能把真正的极值点切掉。我的经验是先以对偶变量的物理量纲估一个量级再在这个量级的基础上放大100倍然后做灵敏度分析观察解是否稳定。一般两种不同M值得到完全相同的解才能说明M值没在“扭曲”解空间。5.3 PSO迭代不收敛或收敛到“假均衡”PSO迭代到后期价格变量还在震荡通常不是算法问题而是上下层目标函数的梯度方向不一致导致目标映射不稳定。我试过两个有效手段。一是动态缩减粒子的速度上限初期大范围探索后期小步精调收敛速度明显改善。二是加一个“历史最优解池”每轮迭代保留所有粒子访问过的最优目标值最后以最优池的最小目标值作为结果而不是以最后一代粒子的值为结果。这不算严格意义上的收敛但在工程实践中非常实用。5.4 储能SOC的初值陷阱共享储能SOC初值设得不对会导致第一时段和最后时段的边界出现异常表现是储能容量利用率突然掉到0或者顶到上限。常规做法是设定SOC初值等于末值日循环约束(E_{0} E_{24})。在程序里这其实是一个线性约束加上去之后储能曲线就会变成一条漂亮的“驼峰型”充放电曲线而不是头尾断崖。5.5 数据量纲不统一这个坑非常低级但又非常致命。有些论文里价格单位用的是“元/kWh”储能容量单位却是“kWh”而天然气价格是“元/m³”天然气热值是“kWh/m³”换算不对全部白搭。我建议所有能量统一用kWh做计量单位天然气按热值折算成kWh热负荷直接按kWh算电价统一到元/kWh成本统一到万元。换算清楚之后模型里所有约束的量纲才能对齐。6. 程序实现的扩展方向这套主从博弈共享储能综合能源微网的框架做完了并不是终点。我目前正在考虑两个后续扩展方向你也可以参考。第一个方向是把“不确定性”引进来。现在风光出力和负荷都是确定性的典型日数据实际上微网运行面对的是强不确定性。可以把上层共享储能定价和下层微网调度做成两阶段鲁棒优化或分布鲁棒优化下层用场景法或模糊集描述不确定变量模型难度会上一个档次但论文的深度也会上一个档次。第二个方向是引入多个共享储能供应商。现在是单一运营商垄断所有共享储能资源和定价格如果引入两个运营商竞争形成“运营商-微网”的多领导者-多跟随者博弈那模型的复杂度和求解难度会显著增加但更贴近真实的共享储能市场竞争格局。做这类程序最大的体会是不要一上来就追求模型全、约束多、方法新先把1个微网、1个储能运营商、24时段的小规模版本跑通再逐步加微网数量、加设备约束、加不确定性。每一步都要跑出合理的经济性结果比如储能在谷充峰放、CHP在电价高峰期多发电再往下走。中间可能反复几十次但每解决一个问题对主从博弈和综合能源系统运行的理解都会深一层。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →