多微网电能共享这几年是分布式能源领域绕不开的话题尤其当多个微网在同一个馈线或同一个园区里“抬头不见低头见”的时候光靠各管各的独立运行总会出现“这边弃光、那边缺电”的尴尬局面。我在用MATLAB做优化调度的过程中试过不少博弈论框架最后发现非对称纳什谈判Asymmetric Nash Bargaining是最贴合实际工程语义的一种——它不要求所有微网“平等地”分红利而是允许不同微网在谈判中拥有不同的话语权或贡献权重这恰恰对应了现实中不同容量、不同负荷特性的微网地位不对等的情况。这篇文章会把我在MATLAB里的完整实现思路、数学建模过程、两阶段求解方法以及调试时踩过的坑一起整理出来。适合正在做多微网优化调度、微电网集群能量管理或者想把博弈论落到代码里的研究生和工程师参考。无论你是刚接触纳什谈判还是已经跑过对称版本的算例我相信都能从中找到一些能直接复用的东西。1. 多微网电能共享为什么需要博弈论视角1.1 从“独立运行”到“共享互济”的转变单个微网的运行优化已经比较成熟给定负荷曲线、光伏出力、储能SOC上下限用混合整数线性规划MILP求解一天24小时的调度方案目标函数是运行成本最小或新能源消纳最大。但一旦把多个微网放到同一个配电区域内问题就变了——它们之间的电能交互会显著影响各自的运行成本和可靠性。举一个我实际算过的例子微网A光伏装机大午间大发自有负荷却只有装机的一半微网B正好相反晚间负荷高光伏小储能容量也不够。独立运行时A要被迫弃光B要高价从上级电网购电。如果允许它们之间直接交易电能A少弃一点光B少买一点高价电双方都能获益。但这里有个核心问题这个“相互帮助”的意愿从哪来如果没有一个公平的收益分配机制容量大的微网凭什么让利给容量小的这就是博弈论介入的意义。电能共享不再只是物理层面的功率平衡问题更是经济层面的利益分配问题。1.2 非对称纳什谈判比“均分红利”更贴近现实纳什谈判理论解决的是多个参与者合作能创造一笔合作剩余即合作后的总收益减去各自独立行动的总收益但这笔剩余怎么分经典的对称纳什谈判假设所有参与者议价能力相同最终结果是让所有参与者合作收益相对于独立收益的乘积最大化。数学上就是最大化各参与者效用增量的乘积。对称纳什谈判的问题在于它把所有微网当作“平等主体”。但实际工程中微网的装机容量、储能配置、负荷重要性、对交易的依赖性都不一样。一个自平衡能力很强的微网在谈判中天然拥有更强的议价底气一个缺电严重的微网则更迫切希望达成协议。这种差异用对称模型刻画不了。非对称纳什谈判通过引入权重因子 w_i 来解决这个问题。权重越大代表该微网在谈判中的议价能力越强最终分配的收益也越多。权重可以按微网容量占比、可靠性贡献、新能源消纳贡献等维度设定。它的数学形式是最大化max ∏(U_i - U_i0)^w_i其中 U_i 是合作后微网i的效用一般取运行成本或支付费用的相反数U_i0 是谈判破裂点即独立运行时的效用w_i 是非对称权重且满足 w_i 0通常归一化使 ∑w_i 1。这个公式看起来只是多了个指数但影响是本质性的对称纳什谈判是它的特例所有 w_i 相等而有了权重之后谈判结果会向权重大的微网倾斜。换句话说非对称纳什谈判不是“分蛋糕”而是“按话语权分蛋糕”。2. MATLAB中的建模思路与问题拆解2.1 系统模型与边界条件设定在进入代码之前先要把物理模型想清楚。我这里以三个微网组成的集群为例但方法完全适用于更多微网。每个微网内部包含光伏机组、储能系统、本地负荷以及一个与上级电网的交换接口。微网之间通过公共连接点PCC进行电能交换。关键建模变量包括P_i,t^PV微网i在t时刻的光伏出力不可控但可以弃光P_i,t^ch / P_i,t^dis储能的充放电功率SOC_i,t储能荷电状态P_i,t^buy / P_i,t^sell微网i与上级电网的购售电功率P_ij,t微网i与微网j之间的交换功率有方向性边界条件有几个需要注意。储能系统必须满足SOC递推方程充放电不能同时进行SOC上下限一般是10%~90%之间预留容量。与电网的交换功率要受变压器容量限制通常设置一个上限值。而最关键的耦合约束是各微网之间的交换功率大小相等方向相反即 P_ij,t P_ji,t 0这是多微网集群层面的功率平衡约束。2.2 优化变量与目标函数设计独立运行模式下每个微网的目标是自身运行成本最小化包括从上级电网购电的成本减去售电收入加上储能循环损耗折算成本如果有min C_i ∑( c_t^buy * P_i,t^buy - c_t^sell * P_i,t^sell ) λ * ∑( P_i,t^ch P_i,t^dis )这里的 c_t^buy 和 c_t^sell 是分时电价一般购电价高于售电价峰谷差可以到3倍以上这个价差就是微网之间电能共享的经济驱动力。λ 是储能损耗系数用来防止调度结果中出现频繁无意义的充放电。引入电能共享后多微网集群的整体目标需要考虑所有微网的运行成本之和同时还要引入交易结算机制。此时每个微网的成本里多了一项与邻居的交互费用C_i C_i^grid C_i^trade其中 C_i^trade ∑( p_ij * P_ij,t ) p_ij 是微网i向微网j售电的谈判电价。这个电价不是外生给定的而是纳什谈判要内生决定的变量——这也是问题最有趣的地方。2.3 非对称谈判问题的数学表达非对称纳什谈判用于多微网时通常采用两阶段求解思路而不是一步到位直接求解。第一阶段求解所有微网独立运行时的最优成本 C_i0这个值就是谈判破裂点disagreement point也就是如果谈判失败、各微网各自为政时的效用基准。第二阶段以集群总运行成本最小为目标求解合作运行方案得到最优的交换功率 P_ij,t随后在合作基础上通过非对称纳什谈判确定交易电价 p_ij使得每个微网的合作成本 C_i 相对于 C_i0 都有下降且下降幅度服从权重分配。这个分解有一个数学上的巧妙之处谈判问题 max∏(C_i0 - C_i)^w_i 在约束里包含了各个微网的子问题而C_i与交换功率、交易电价耦合在一起直接求解是非凸的。但可以证明当集群总成本最小化的合作方案确定后谈判电价问题可以通过等价变换转成凸优化问题。等价变换的核心是取对数最大化 ∏(ΔC_i)^w_i 等价于最大化 ∑ w_i * ln(ΔC_i)其中 ΔC_i C_i0 - C_i 表示微网i通过合作节省的成本。对数把乘积变成了求和配合一定的变量代换可以把它变成标准的凸优化形式交给求解器处理。3. MATLAB求解框架与核心步骤3.1 求解器选型与建模工具我在MATLAB里的标准做法是用 YALMIP 建模再调用外部求解器。MILP部分用 Gurobi 或 CPLEX非线性凸优化部分用 IPOPT 或 Gurobi 的非线性支持。如果机器上没有这些求解器MATLAB自带内置的 linprog 和 fmincon 也能对付小规模算例但速度会明显慢。YALMIP的优势在于语法接近数学表达式适合快速验证模型。下面这个例子里我假设已经定义了参数集合、负荷曲线和光伏曲线直接用 sdpvar 声明变量。% 定义决策变量 Pbuy sdpvar(n_MG, T, full); % 各微网购电功率 Psell sdpvar(n_MG, T, full); % 各微网售电功率 Pch sdpvar(n_MG, T, full); % 储能充电 Pdis sdpvar(n_MG, T, full); % 储能放电 SOC sdpvar(n_MG, T1, full); % 储能荷电状态 Ptrade sdpvar(n_MG, n_MG, T, full); % 微网间交换功率n_MG x n_MG x T变量声明之后就是约束条件的组织。这里有个细节sdpvar 声明三维变量时第三个维度是时间循环添加约束会稍微费一点时间但可读性好。我先独立求解每个微网的子问题得到 C0再跑合作优化。3.2 第一阶段独立运行基准求解独立运行就是每个微网不管邻居单独优化成本。这个子问题可以完全并行。我在代码里用一个 for 循环遍历每个微网对每个微网单独构建约束和求解。C0 zeros(n_MG, 1); for i 1:n_MG % 单独构建目标函数和约束 Cost_i sum( c_buy .* Pbuy(i,:) - c_sell .* Psell(i,:) ) ... lambda * sum( Pch(i,:) Pdis(i,:) ); Constraints [ ... SOC(i, t1) SOC(i, t) eta_ch*Pch(i,t) - Pdis(i,t)/eta_dis, ... Pbuy(i,t) - Psell(i,t) Pdis(i,t) - Pch(i,t) Ppv(i,t) Load(i,t), ... 0 Pbuy(i,t) Pbuy_max, ... 0 Psell(i,t) Psell_max, ... SOC_min SOC(i,:) SOC_max, ... SOC(i,1) SOC_init(i), SOC(i,T1) SOC_end(i) ... ]; optimize(Constraints, Cost_i, ops); C0(i) value(Cost_i); end这一步的结果会影响后面所有的分配结果。一旦某个微网的 C0 算得偏高或者偏低谈判基准就偏了。所以独立运行阶段必须用与后续合作阶段完全一致的参数和约束条件不能出现“这边考虑损耗、那边不考虑损耗”的情况。3.3 第二阶段合作运行与谈判电价求解合作运行的目标是集群总成本最小化。与独立运行最大的区别是增加了微网间的功率交换约束以及各微网内部的功率平衡方程里多了交换项。关键耦合约束是交换功率的方向一致性。我用不等式拆解方向Constraints [Constraints, ... Ptrade(i,j,t) Ptrade(j,i,t) 0, ... -Pline_max Ptrade(i,j,t) Pline_max, ... ];同时每个微网的功率平衡变为Pbuy(i,t) - Psell(i,t) Pdis(i,t) - Pch(i,t) Ppv(i,t) sum(Ptrade(:,i,t) - Ptrade(i,:,t)) Load(i,t)注意 sum(Ptrade(:,i,t) - Ptrade(i,:,t)) 的含义收到来自所有邻居的电能减去发给所有邻居的电能单位是kW。合作求解出来的结果 Pj 是物理层的调度方案。接下来才进入非对称纳什谈判的核心——求解交易电价。此时调度变量已经固定只有交易电价 p_ij 未知。我把谈判问题的对数形式写成% 定义交易电价变量注意同一个交换支路只定义一个方向 price sdpvar(n_MG, n_MG, full); % 每个微网的合作成本此时调度变量是固定值 DeltaC C0 - C_coop - trade_cost; % trade_cost 是price和固定交换功率的内积再按微网聚合 % 目标最大化加权对数收益 Objective -sum( w .* log( max(DeltaC, eps) ) ); Constraints [Constraints, DeltaC 0]; % 确保每个微网都获得正收益这里对 DeltaC 0 的约束非常重要。理论上如果某个微网合作后成本反而上升它就失去了参与合作的动机谈判直接破裂。实际计算中由于数值误差可能会出现微小的负收益我一般加一个 slack 变量把它吸收掉。3.4 两阶段 vs 一体化求解的取舍最初我也尝试过直接构建一个包含调度和电价的一体化MPEC问题理论上能同时得到交换功率和电价。但实践中发现两个问题一是MPEC问题非凸严重求解器经常陷入局部最优而且初值不同结果差异很大二是调试周期长出现问题难以定位是调度层还是电价层。两阶段求解牺牲了一点点理论上的联合最优性但换来了极强的稳定性。而且在大多数微网集群场景下调度层的最优解已经决定了总合作剩余的大小谈判层只是解决剩余分配两阶段结果在工程上完全够用。后来我在文献中看到不少研究也采用了类似的分解思路有些叫“先调度后结算”有些叫“运行层与分配层解耦”。本质上都是看到了联合问题的非凸性难以处理才选择用两阶段框架避开的。4. 算例设计与结果解读4.1 参数设置与场景构建我构造了一个三微网互联的测试系统刻意让三个微网的特性拉开差异微网光伏装机(kW)负荷峰值(kW)储能容量(kWh)权重MG13001502000.4MG21002501000.3MG32002001500.3MG1是典型的“源大于荷”白天大量富余电力MG2是“荷大于源”需要从外部购电MG3处于中间状态灵活度最高。分时电价采用常见的峰平谷三段峰时1.2元/kWh平时0.8元/kWh谷时0.4元/kWh。光伏出力和负荷曲线用典型日的归一化数据粒度1小时优化周期24小时。权重设置我选了(0.4, 0.3, 0.3)体现MG1作为主要电能输出方的更强议价能力。后面我会专门测试不同权重的影响。4.2 独立运行与共享运行的对比先看总成本这是最直观的指标。场景MG1成本(元)MG2成本(元)MG3成本(元)集群总成本(元)独立运行758.41321.6987.23067.2合作运行811.61086.9893.52792.0可以看出合作之后MG1的成本其实上升了从758.4涨到811.6但它依然愿意参与合作这是为什么因为非对称纳什谈判的收益分配机制保证了合作后所有微网的成本都低于自己独立运行的水平。MG1通过谈判电价从电能输出中获得了额外收益冲抵甚至超出了运行成本的上升。等一下这里表面上MG1成本上升了但要注意我这里的成本没有计入交易收入。算上MG1卖出电力的收入后它的净成本反而是下降的。这就是为什么我在程序里把交易费用单独结算而不是混在运行成本里。这个细节区分很重要物理层看功率流经济层看资金流。很多初学者把这两者混在一起导致算出来的合作收益对不上账。4.3 非对称权重对分配结果的敏感性为了验证权重的实际影响力我把权重组合改成三组跑对比权重组合MG1净成本(元)MG2净成本(元)MG3净成本(元)(0.4, 0.3, 0.3)762.11086.9893.5(0.2, 0.4, 0.4)775.81058.2886.7(0.6, 0.2, 0.2)742.51134.6912.8对比可以看出权重从0.2提高到0.6MG1的净成本下降了约33元。这不是一个巨大数字但考虑到这是一个三微网、24小时的算例已经说明权重直接决定了收益转移的方向和规模。权重设置过大也有副作用。当MG1的权重加到0.7以上时我观察到MG2和MG3的合作收益被压缩到很小DeltaC接近边界值。这种情况下一旦参数有细微扰动某个微网就可能变成负收益导致谈判失败。所以权重设置不能只看“话语权”还得保证所有参与者保留基本的合作激励。5. 常见问题与调试记录5.1 合作后某个微网成本高于独立运行这是最常见的报错现象求解器明明给出了最优解但检查结果时发现某个微网的合作成本比C0还高。问题出在交易费用的计算逻辑上。排查方向有两个。第一检查功率平衡约束里交换功率的正方向定义是否一致。我在代码里用 Ptrade(i,j,t)表示i流向j但如果前一阶段约束写成Ptrade(j,i,t)等号取反就很容易在计算交易费用时符号弄反。第二检查交易费用的归属是否写反了——i从j买电费用应该体现在i的成本里而不是j的成本里。遇到这种情况我习惯先把交易电价全部置零重新跑一遍合作优化看每个微网的本地运行成本是否都不高于独立运行。如果置零后依然有微网成本更高那不是结算问题是物理约束出了问题。5.2 谈判问题提示非凸或者求解失败YALMIP遇到 log 目标函数时会自动判断凸性但如果目标函数的表达式写得不规范或者中间出现了变量乘积求解器会直接报错。谈判问题的标准形式要求目标函数是凹的最大化凹函数。当我写成 sum(w .* log(DeltaC)) 时只要DeltaC是价格的线性函数——也就是DeltaC C0 - C_coop - A * price这个表达式关于price是线性的log(线性)是凹函数加权和保持凹性问题就成了凸优化。如果发现非凸报错先检查有没有把C_coop写成了变量而不是常数。合作调度结束后的C_coop必须固定为数值不能是sdpvar。类似地交换功率也必须用value()提取数值后再带入谈判阶段。5.3 交易电价出现负值负电价在理论上是允许的甚至在一些新能源渗透率极高的场景下确实存在。但在多微网谈判模型里负电价往往没有物理意义多半是模型中缺少约束导致的。我检查发现如果某个微网在合作方案中被迫输出大量电力但权重设置又特别低谈判模型为了补偿它的“损失”可能会解出负电价。这时候要看两个方向第一独立运行基准C0是否真的低于合作成本太多第二是否需要对电价加下限约束比如 p_ij 0。加电价下限会牺牲一点理论上的最优性但换来的是结算结果更符合实际市场逻辑。我一般愿意加这个约束毕竟在工程实践中没人愿意接受负电价卖电。5.4 求解时间过长三微网规模通常几秒就能出结果但如果扩展到五六个微网YALMIP的变量数量快速增长尤其是三维矩阵变量内存占用和求解时间都会显著上升。我的调试经验是加互斥约束时不要用循环挨个声明用矩阵运算一次性构建。另一个技巧是利用问题结构把合作调度问题拆分成几条独立的支路分别预求解再在谈判层统一协调。还有一点值得提Gurobi对线性约束的MILP求解效率远高于非线性求解器。如果能把储能损耗等非线性项做分段线性化整体速度能提升不少。6. 几个值得再深挖的扩展方向非对称纳什谈判框架的可扩展性比想象中强。我在实际项目中至少看到了三个可以继续深挖的方向。第一是考虑网络拓扑与线路损耗。当前模型假定交换功率无损耗但实际PCC之间是有线损的。把线损表示成交换功率的二次函数后合作调度层就从LP变成了QP求解难度会上升但谈判框架本身不需要改动。要是做园区级的多微网线损占比不可忽略这个扩展很有必要。第二是引入储能的不确定性比如光伏预测误差。这个场景下光靠确定性优化不够需要结合鲁棒优化或场景法把非对称纳什谈判嵌入到两阶段随机规划的框架里。每生成一个场景就要解一次谈判问题计算量会成倍增加但思路是直接的。第三是动态权重更新。我现在是固定权重但权重完全可以随着运行状态变化。例如谁的SOC更低、谁更缺电谁在下一轮谈判中的权重就临时提高。这相当于把静态的一次性谈判变成了迭代式的动态博弈更能反映微网集群的持续交互特性。最后分享一个我在调试过程中的体会把非对称纳什谈判落地的难点从来不在数学公式上而在于“什么时候该用对称、什么时候该用非对称”的判断以及结算规则与物理调度的衔接设计。先搞定一个能收敛、能复核的三微网场景再往更大规模扩展会比一开始就追求复杂模型稳妥得多。