第一次接触基于主从博弈的共享储能与综合能源微网优化运行问题,是在模拟项目X里。当时某课题组要从零搭建一个微网群的仿真环境,我拿到手的第一份资料里,共享储能站被设计成“第三方运营商”,综合能源微网则是买电、买气、买热服务的用户。读了两遍文献,印象最深的不是公式,而是那句“领导者先行动,跟随者再响应”——储能运营商定好租赁价格,微网再决定怎么用能。今天这篇文章想把它的来龙去脉拆开,包括主从博弈为什么适合这个场景、双层模型怎么搭、求解时会踩哪些坑,以及从论文到工程还差多少。适合正在做微网调度、共享储能商业模式或双层优化的同学参考,也适合刚入门、被“博弈”两个字吓住的人。
1. 共享储能和综合能源微网为什么总被放在一起
1.1 单一微网配储能的账,经常算不过来
先说痛点。一个典型的工业园区微网,可能有屋顶光伏、燃气轮机和热泵,白天光伏大发,晚上负荷却还在高位。从原理上看,储能确实能削峰填谷:光伏多的时候充电,晚高峰再放电。可真要掏钱买一套储能设备时,很多项目就算不过来了。
假设一个微网峰值负荷3MW,想配一套1MW/2MWh的储能,按当时算例里的设备造价折算,单纯靠峰谷价差需要好几年才能回本。问题出在利用率上:光伏出力只有白天几个小时,微网晚间负荷偏高,但中午到下午这段时间,储能很可能充满后长时间闲置,一年下来有效充放电循环次数可能连300次都不到。储能资产利用率低,折算到每度电的存储成本就很高,投资自然缺乏吸引力。
这就是共享储能出现的原因。它把“自建储能”变成“租用储能”,微网不需要一次性投入巨额资金,按容量、按电量付费即可。储能站由第三方统一投资运营,在多个微网之间周转容量,谁缺电、谁有余电,就调配给谁,整体利用率摊上去,单位成本才能降下来。这个逻辑和共享充电宝很相似,但技术上远比充电宝复杂,因为服务对象是完整的微网系统。
1.2 共享储能把“拥有”变成“租用”,但这只是第一步
共享储能并不是简单的“大电池出租”。按功能分,常见模式有容量租赁、功率共享和辅助服务共享。
容量租赁适合长期稳定需求的微网。微网向运营商租下一部分电池容量,比如200kWh,在租赁期内拥有优先使用权,类似包年包月。功率共享则更灵活,不锁定具体容量,而是按实时充电、放电功率计费,哪家用得多就多付费,适合负荷波动较大的微网。在此基础上,储能站还可以参与电网调频、备用等辅助服务,把闲置时段利用起来,这部分收益在模型中往往作为运营商的额外收入来源。
但“租用”只是商业形式的改变,真正让问题复杂起来的是多主体决策。一家自建储能,系统内部自己调度就行;换成第三方共享储能后,运营商要定价,微网要响应,双方利益不完全一致。电价定高了,微网可能干脆不用共享储能,转而去电网买电或自建机组;电价定低了,运营商不赚钱。这时候就必须引入一个能描述“先定价后响应”的博弈模型,而不是单纯求一个全局最优。
1.3 “综合能源”让问题从二维变成三维
如果只是电能储存,模型还相对简单。但标题里强调的是综合能源微网,这意味着电、热、冷、气多种能量形式耦合在一个系统里。
拿微网里常见的热电联产机组(CHP)来说,它烧天然气同时发电和产热,发的电可以给负荷用,余热可以用来供暖。有了热负荷,储能就不再只是储电,还可以做蓄热罐,把白天CHP产出的多余热量存起来,晚上再释放供暖。类似地,吸收式制冷机能把热能转成冷量,电制冷机则反之。能量在多种形式之间互相转换,储能设备的角色也变得更加立体。
这对共享储能的影响很大。微网的用能结构变了,储能租赁需求就不再是单纯的“充放电功率曲线”,还要考虑储热、储冷的配合。例如某微网在冬季夜间热负荷高,白天却有余热,如果没有蓄热,就只能浪费掉;如果有共享储能站同时提供蓄热服务,整体运行成本会明显下降。但多能耦合也意味着模型里的变量和约束更多,物理层稍有不慎就会让求解器算不动,这也是很多初接触者容易低估的地方。
1.4 一个最小画面:两个微网和一座共享储能站
为了有一个直观印象,可以想象一个最小案例:工业园区A白天光伏多、负荷少,傍晚后负荷上升;工业园区B正好相反,白天有大量连续生产负荷,光伏少,但夜里负荷回落。
共享储能站建在两园区的中间位置,白天给A充电存电,傍晚放给A使用;同时夜间利用低价电充电,次日白天向B放电。储能站运行一天,A和B都节省了从电网购电的费用,运营商则通过租赁费和充放电服务费获利。这个画面里隐藏着三层关系:储能站决定价格,两个微网分别决定自己的用电计划,双方的结果又互相影响。主从博弈就是用来描述这种关系的工具。
2. 主从博弈到底在博弈什么:从“坐庄”直觉到双层优化模型
2.1 先手定价权如何撬动整个市场
主从博弈也常被称为Stackelberg博弈,最核心的特征是决策有先后顺序。领导者先做出承诺,跟随者看到承诺后做出最优反应,领导者在做决策时就要预判跟随者的反应。这和我们熟悉的“同时出招”的纳什博弈不同,更像下棋里的先手:先落子的人并不一定稳赢,但他的每一步都在改变棋盘局面。
在共享储能场景里,储能运营商是天然的先手。它掌握储能站的控制权,可以发布充电服务费、放电服务费、容量租赁价格。微网看到这些价格之后,在自身物理约束下做经济调度:要么用共享储能,要么直接向电网购电,要么多烧天然气。运营商在定价之前必须清楚微网会怎么选,否则定出的价格可能无人接受。
这里有一个关键概念叫“个人理性”。微网只有在使用共享储能比自己单独运行更省钱时才会参与,运营商定价就必须留出足够的利润空间。而运营商自身的理性是收益最大。两种理性在市场中碰撞,最终达到的状态叫Stackelberg均衡,此时任何一方单独改变策略都无法让自己更好。
2.2 双层模型的数学外壳:上层收益,下层成本
把上面的冲突写成数学问题,就会得到典型的双层优化结构。
上层是储能运营商的问题:
- 决策变量:租赁价格、充电服务费、放电服务费;
- 目标函数:最大化总收入减去储能运行成本、电池退化成本;
- 约束:储能容量、充放电功率、SOC递推关系。
下层是每一个微网的运行调度问题:
- 给定价格后,决策变量是各时刻购电、购气、CHP出力、电池充放电功率;
- 目标函数:最小化一天的购能和运维总成本;
- 约束:电、热、冷功率平衡,设备出力上下限,爬坡约束等。
下层所有微网的最优解会反馈影响上层目标的实现程度,因此上层不能直接替代下层做决策。整体问题是一个单领导者、多跟随者的双层规划,数学上属于NP-hard类别,求解并不轻松。常规做法是对下层问题推导KKT条件,把每个微网的最优性条件变成上层模型的约束,于是双层问题转成单层MPEC。这句话听起来绕,实际操作时其实就两步:写出下层问题的拉格朗日函数,再把梯度条件、互补松弛条件放进上层。
2.3 为什么不能直接做集中式优化
很多人第一次看到这个问题时会问:既然模型都能写清楚,为什么不把所有微网和储能站的数据放在一起,做一个全局优化?技术上完全可行,集中式优化的解在效率上也往往更高,但现实中几乎走不通。原因有两个,一个叫隐私,一个叫激励。
隐私方面,微网的负荷曲线、机组运行参数、燃料采购成本,都是商业信息,交给统一的调度中心就相当于把自家底牌公开。共享储能面对的多个微网很可能属于不同利益主体,不存在一个“总调度”能强制获取所有数据。激励方面,即使能拿到数据,市场主体也会担心决策结果是否公平,是否偏向运营商的利益。用博弈模型的好处是,它承认各方目标不同,通过价格信号达成均衡,而不是用一只“有形的手”去强行分配。
当然,这并不等于集中式优化没有价值。在同一个企业内部的多个微网之间,集中式仍然是效率天花板。模型跑完之后,可以把主从博弈的结果和集中式结果做对比,用来衡量“分布式决策带来的效率损失有多大”,这是一个很常见的分析思路。
2.4 主从均衡和纳什均衡的边界在哪里
为了把这部分彻底讲透,我整理了一个对比表,平时给别人介绍时也经常用。
| 对比维度 | 主从博弈(Stackelberg) | 纳什博弈(Nash) |
|---|---|---|
| 决策时序 | 领导者先行动,跟随者后行动 | 多个参与人同时行动 |
| 信息使用 | 领导者预判跟随者反应 | 各方只知道自己和对手的策略空间 |
| 典型场景 | 储能运营商定价,微网响应 | 多个微网同时报价互相竞争 |
| 均衡概念 | Stackelberg均衡 | 纳什均衡 |
| 计算难度 | 双层优化,转化为MPEC后仍需非线性处理 | 多为固定点迭代或均衡约束求解 |
需要特别提醒的是,主从均衡并不天然好于纳什均衡,也不意味着领导者一定有绝对优势。领导者的优势来自“承诺能力”,即跟随者相信它会按照公布的价格执行。如果运营商信誉差、价格频繁变动,跟随者就不会按模型里的方式理性响应,均衡也就不存在了。很多论文津津乐道“领导者的先手优势”,但工程上更关心这种优势能不能兑现。
3. 搭优化运行模型:把物理设备和博弈结构同时写对
3.1 微网侧的能流约束:电、热、冷各算各的账
我做模拟项目X时,最深的体会是:博弈结构先进,物理约束也得写对,否则后面全是无用功。下面以24小时、1小时为调度时段为例,梳理微网侧必须写清的约束。
电功率平衡是所有模型的地基。对每个微网每个时段,发电加上购电和储能放电,必须等于负荷加上储能充电和电锅炉耗电。这个约束不能有半点含糊,否则整个运行结果没有物理意义。热功率平衡要描述CHP余热、燃气锅炉、蓄热罐、热负荷之间的关系。冷功率平衡则涉及电制冷机、吸收式制冷机和冷负荷。
设备出力还有上下限和爬坡约束。燃气轮机启停有最小运行时间,电锅炉不能瞬时从0到满负荷。这些约束虽然不是博弈研究的主角,却直接决定微网对价格信号的响应能力。如果我把这些约束写宽了,比如忽略爬坡限制,微网会在模型里出现不现实的功率跳跃,上层定价策略也会跟着失真。
3.2 共享储能侧的运行约束:SOC、功率上下限和退化成本
共享储能站作为上层决策者,同样有自身的物理限制。电池的荷电状态SOC需要递推约束连接,充放电功率有额定上限,充电效率和放电效率通常不相等。还要加入“不能同时充电和放电”的逻辑约束,工程上常用两个二进制变量配合一个线性不等式实现。
电池退化是一个经常被论文略过、但现实里非常影响运营决策的项。储能每充放一次都会产生寿命损耗,运营商在制定高价刺激放电时,必须把额外损耗折算成成本。常用的简化方式是在目标函数中加一个与充放电功率相关的退化成本项,比如每放电1kWh记一定费用。虽然不如精确寿命模型精细,但能在优化运行中体现“电池不是免费用的”这一原则。
容量租赁机制也要在模型里有对应表达。微网租用了200kW功率和400kWh容量之后,储能运营商的调度计划必须优先保障这部分已出租资源可用,剩余容量才能用于辅助服务或对其他微网的临时放电。这种优先级关系如果不写进上层约束,定价和实际运行就会脱节。
3.3 上下层目标函数与KKT衔接
下层微网调度问题如果写成线性规划,就可以用KKT条件等效替换。以单个微网为例,设其决策变量为x,目标函数为min f(x),约束为A x ≤ b。拉格朗日乘子λ对应约束,KKT条件包括:
- 梯度条件:∇f + A^T λ = 0;
- 原问题约束:A x ≤ b;
- 对偶可行性:λ ≥ 0;
- 互补松弛条件:λᵀ(b − A x) = 0。
把这些条件代入上层模型后,每个微网的“最优响应”就被压缩成一组约束。双线性的互补松弛项是求解器不喜欢的非线性来源,需要用大M法线性化:引入二元变量和足够大的M,把“λ大于0”和“约束松弛为0”两种情况分别表达。
我在实际建模中还发现一个容易忽略的细节:上层的价格变量同时出现在下层目标函数里,而目标函数里会出现价格乘以功率的乘积项,这也是一种双线性。处理方式是使用强对偶转化,把下层目标函数的最优值表达式代入上层,或者直接保留乘积项交给非线性求解器,但后者对规模非常敏感。
3.4 线性化三大件:乘积项、互补松弛、Big-M
到这里,线性化已经成为从模型走向代码的关键动作。简单总结我常用的三件套:
- 乘积项线性化。价格和功率都是连续变量,两个连续变量相乘在模型里会产生双线性项。如果价格是离散的档位变量,可以用Big-M分段表达;如果都是连续变量,通常要配合强对偶或McCormick包络。
- 互补松弛线性化。KKT带来的λ × (松弛量) = 0,用Big-M拆成两个方向:当λ大于0时松弛量必须为0,当松弛量大于0时λ必须为0。M取值不能太小,太小可能把合理解排除;也不能太大,太大会让求解器数值病态。经验上,M取相关变量数量级的100倍左右比较稳妥。
- 二进制状态约束。充放电不能同时发生、机组启停等,用二进制变量加线性不等式即可,这部分属于标准操作。
这里想提醒一句:不要试图在不理解KKT的情况下硬抄多篇论文的线性化代码。每个模型的变量维度和符号习惯不同,抄过来的Big-M范围很可能不匹配。自己在小规模例子上写一遍,哪怕慢一点,也比后期排查莫名其妙的不可行要省时间。
4. 求解算例与调参经验:模拟项目X里的真实复现过程
4.1 一个能跑通的最小算例配置
我建议任何初接触这个方向的人,都先建一个“最小算例”,而不是一上来就堆几十个节点设备。模拟项目X里用的初始参数如下,这里列出来供复现参考。
| 参数 | 数值 |
|---|---|
| 微网数量 | 2个 |
| 调度周期 | 24h,间隔1h |
| 共享储能额定功率 | 500kW |
| 共享储能额定容量 | 1MWh |
| 充电效率 | 0.95 |
| 放电效率 | 0.95 |
| 电池退化成本 | 0.05元/kWh |
| 微网A光伏装机 | 800kW |
| 微网B燃气轮机 | 600kW |
| 电网峰谷电价 | 峰1.2元/kWh,谷0.4元/kWh |
| 天然气折算成本 | 0.35元/kWh |
以上数值只是为了算例演示,不代表特定地区的真实价格。峰值负荷设为1000kW左右的量级,热负荷按冬季典型日取值,才能让CHP和电锅炉有真实的调度空间。
算例规模虽然小,但上层有定价决策,下层有两个微网的完整调度约束,已经能复现主从博弈机制。如果这个模型跑不通,不用急着加更多微网,问题八成出在约束或线性化细节上。
4.2 从建模语言到求解器的完整流程
我的流程分四步。第一步,先用文本把上层、下层的变量、参数、目标函数、约束分别列出来,尤其标记出哪些变量跨层传递。第二步,选择建模工具,把模型写出来;我用过通用代数建模语言,也用过Python环境下的优化建模库,比较下来,Python的灵活性更适合反复试验不同线性化方案。第三步,调用商业求解器求解MPEC,注意设定合理的时间上限和MIPgap。第四步,检查解的可行性,特别是SOC是否在约束边界、互补松弛是否被违反。
下面的伪代码展示了上层MPEC模型里,如何把下层KKT条件作为约束加入:
# 伪代码,仅展示结构,不代表完整实现 m = Model() # 上层变量 price_c, price_d = m.var("price_c"), m.var("price_d") # 下层变量 P_chp, P_buy, P_bat, Q_boiler = m.var("P_chp"), m.var("P_buy"), ... # KKT条件 for t in range(24): m.add_constr(dL_dP_buy[t] + lambda_buy[t] == 0) m.add_constr(lambda_buy[t] >= 0) # 互补松弛项用Big-M拆分 m.add_constr(lambda_buy[t] <= M * z_buy[t]) m.add_constr(P_buy_ub - P_buy[t] <= M * (1 - z_buy[t]))这里的关键是每个微网变量都要有对应的对偶变量,并且对偶变量只在上层模型里出现,不参与微网之间的耦合。写完之后第一件事不是直接求解,而是先把下层单独求解一次,核对约束是否全部满足,再接入上层。
4.3 迭代求解的振荡和KKT单层化的阵痛
求解双层优化有两条常见路线,我都试过。
路线一是迭代法:上层先给出一个价格,下层求解得到功率需求,上层再根据需求调整价格,如此反复。实现简单,但很容易振荡。原因是微网对价格过于敏感,价格稍微上调一点,它就把共享储能放电量降到0,价格再降回来,它又大幅回升。如果没有阻尼机制或学习率控制,循环可能一直不收敛。
路线二是KKT单层化,也就是把下层换成KKT条件后直接求解MPEC。这个方法收敛性相对可控,但有两个阵痛。第一,约束数量剧增,一个24时段的下层问题就可能多出几百条KKT相关约束,两个微网叠加以后规模膨胀很快。第二,Big-M参数若设置不当,求解器可能给出“看起来可行、实际不合理”的解。我遇到过一种情况:大M设得过大,互补松弛条件被“绕过”,SOC曲线出现了违反物理直觉的突跳,后来把M从1e6降到1000量级才恢复正常。
还有一种问题是多重均衡。同一个模型从不同初始点出发,可能收敛到不同的Stackelberg均衡点,上层收益还不一样。论文里通常只会展示一个均衡,但实际做工程对比时,我会从几个随机初值分别求解,选择上层收益最大的均衡,或者用“前瞻性偏离检验”来评估解的稳定性。
4.4 结果怎么看:储能利用率、总成本和SOC轨迹
算例跑完之后,不要只看最终收益数字,还要看三个中间指标。第一个是储能利用率,即实际充放电电量与额定容量的比值;第二个是各微网的总运行成本;第三个是SOC轨迹是否平滑。
我在模拟项目X中得到过一组结果,可以说明算法的效果。无共享储能时,两个微网各自运行,因为缺少调节资源,A微网午后光伏浪费了约260kWh,B微网晚间高价时段购电较多,当日总成本约为8200元。引入共享储能后,运营商定价,两个微网租用储能,光伏余电在A侧充入、在B侧高峰时段放出,储能当日循环次数4次左右,两个微网总运行成本降到了7500元左右,运营商扣除成本和退化损耗后收益约420元。
有意思的是,SOC轨迹并不像自建储能那样“峰谷平滑”。因为共享储能要服务两个不同特性的微网,SOC一天之内可能出现多次反复升降,而不是简单的“充一次放一次”。这种高频响应正是共享储能提高资产利用率的原因,但也对电池寿命建模提出了更高要求。
5. 离落地还有多远:被论文省略的工程细节
5.1 模型需要的数据,现实中很难拿全
论文算例里的一切都很干净:负荷曲线已知,设备参数固定,价格信号公开透明。但真要落地到某个园区,第一关就是数据。
微网内部负荷数据往往分散在多个系统中,光伏出力预测有误差,设备实际效率也不是铭牌值。更麻烦的是,多个微网属于不同主体时,连协商一个统一的“租用协议”都很费劲。价格是定容量价还是电量价?超额使用怎么惩罚?故障时如何分配稀缺容量?这些商业条款在模型中是整段约束,在现实中是合同谈判。所以我在做项目时,会把模型当成“谈判支持工具”,而不是自动决策工具:给定一版参数,算出建议价格区间,再由人去谈协议细节。
5.2 通信时延、线路损耗和不确定性
主从博弈模型默认信息同步、指令即时执行,但真实微网里,远动通信有一定时延,储能站到各微网的线路也有损耗,这在单节点模型里是看不见的。
线路损耗会让“共享”的效率打折扣:A微网充入1kWh,到B微网放出来可能只有0.93kWh。如果不把这个损耗分配到电价里,运营商会亏本。一种做法是在下层模型的充放电约束中加效率系数,另一种做法是引入简单的网损敏感因子。通信时延则影响均衡能否在真实时间内到达,模型里的均衡是瞬时概念,现实中价格更新需要分钟级周期,这期间负荷早已变化。要解决这些问题,通常会走鲁棒优化或模型预测控制的路线,但模型复杂度会显著上升。
5.3 不确定性带来的三层挑战
光伏出力、负荷需求、电网实时电价都充满不确定性。主从博弈里的领导者定价如果基于确定性预测,一旦预测偏差很大,实际运行可能远离预设均衡。
引入不确定性有三种等级的做法。第一级是场景法,根据历史数据生成多个典型场景,把下层每个场景的KKT条件全部放入上层,最后目标函数取期望收益或最坏场景收益。第二级是分布鲁棒优化,只假设部分矩信息,求解最坏分布下的均衡。第三级是用深度强化学习做近端策略或软演员-评论家算法,让运营商的定价策略适应环境变化。第三级近期很热,但对初学者来说容易迷失方向,我建议先把前两级跑通,再去碰强化学习。
5.4 扩展方向:多领导者、联盟博弈和储能容量规划
单领导者模型是入口,不是终点。现实里一个区域可能有多个储能运营商竞争,这时候就要做多领导者博弈,问题从MPEC变成EPEC,也就是多个MPEC组合在一起。EPEC的求解难度成倍上升,通常只能用对角化迭代或启发式算法找近似解。
另一个方向是联盟博弈:多个微网除了和储能运营商博弈,彼此之间也可以结成联盟,共同租用储能、共享备用容量。用夏普利值分配联盟收益,能够回答“谁贡献大、谁该多分钱”的问题,这在商业谈判里很有用。此外,共享储能站的容量规划和选址,也是一个独立决策层,储建多少容量、布在哪,会影响后续的均衡价格。把这些扩展方向串起来,才更接近真实的能源系统。
我在模拟项目X里最终能跑通主从博弈模型,靠的是先老老实实把下层微网的物理约束写对,再一点一点把KKT条件和线性化加进去,最后才轮到调上层定价策略。这个方向看着高大上,拆开也就是三件事:先手定价、理性跟随、双层优化。能把这三件事讲清楚,模型就成功了一半。