ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

非对称纳什谈判在多微网电能共享中的MATLAB两阶段优化实现

非对称纳什谈判在多微网电能共享中的MATLAB两阶段优化实现 聊到多微网电能共享绕不开的一个词就是非对称纳什谈判。前段时间我在做微电网群协调运行的项目模型里最开始用的是对称纳什谈判结果几个微网主体差点谈崩——有人出力多却分得少谁都不愿意签字。后来把权重改成非对称形式收益分配才真正站得住脚这就是我用MATLAB重新梳理整套求解框架的起因。这套基于非对称纳什谈判的多微网电能共享运行优化策略本质上解决两个问题一是多个微网之间怎么通过联络线互相支援、降低总运行成本二是合作之后省下来的钱按什么规则分才能让大家都比单打独斗更划算。适合正在做多微网能量管理、微网群协同调度的同学也适合手里管着园区内好几个配电系统、想搞内部电能互济的工程师。你只需要懂一点最基础的线性规划和博弈论直觉下面我会从建模到算例完整拆开。先说结论非对称纳什谈判解决的不是“怎样把总运行成本压到最低”那个问题交给联盟调度模型它真正解决的是“省下来的钱在微网之间怎么分才不吵架”。这两件事其实是两个阶段很多人一开始混在一起写模型结果又复杂又解释不清。下面按这个逻辑展开。1. 问题场景为什么“多个微网凑在一起”比单打独斗划算1.1 单微网运行的三个老大难单个微网并网运行听起来简单实际调度起来全是约束卡脖子。第一个是新能源反调峰。光伏出力集中在中午但这个时段负荷通常不高到了傍晚用电高峰光伏偏偏归零。风电场往往夜间出力大夜间负荷又上不去。结果就是光伏多的时段用不完、只能弃光负荷大的时段又得高价从电网买电。我见过一个实际园区夏季午间光伏出力能到6兆瓦自身负荷只有2兆瓦剩下4兆瓦要么卖给电网拿很低的收购价要么直接弃掉。第二个是储能太贵。一块电池装上去容量按MWh算动辄几百万光靠峰谷价差回收周期特别长。因此储能容量通常只敢按“保底”设计根本扛不住全天候的削峰填谷。第三个是购售电价差。工业用户从电网买电是尖峰平谷四段电价卖给电网却是另一个更低的电价这一进一出价差往往能差两倍以上。单微网一旦出现短时功率缺口就只能认栽高价购电。1.2 电能共享到底“共享”的是什么多个微网拼在一起互补空间往往比预想大。工业微网白天光伏多、自身负荷小居民微网傍晚负荷高但屋顶光伏不够用某个微网装了风电夜间出力正好顶上一部分夜间高峰。这些余缺通过联络线互相调剂就能把“低价绿电”在联盟内部消化掉减少从上级电网高价购电。除了有功功率还可以共享备用容量和新能源消纳空间。一个微网的储能可以在另一个微网故障或预测偏差时紧急支援新能源富余时也不用急着切机先送到邻居那边。当然这些互助不能白拿否则出力多的微网很快就没积极性了。于是“电能共享”天然带出一个分配问题联盟总成本下降了每个微网各自应该承担多少、节省多少这就是纳什谈判要出场的背景。2. 非对称纳什谈判建模蛋糕怎么做大又怎么分2.1 谈判破裂点与个体理性约束纳什谈判首先要找一个“破裂点”disagreement point也就是大家不合作时各自的状态。放在多微网场景里破裂点就是每个微网独立运行、不参与任何内部交易时的最优成本记为 C_i^0。这个点非常关键因为它是所有微网参与合作的底线合作后最终成本 C_i^fin 如果高于 C_i^0这个微网一定会退出模型里必须用约束保证C_i^0 - C_i^{fin} \ge 0这个约束叫“个体理性”翻译成大白话就是合作可以少赚但不能亏。纳什谈判的经典形式是最大化各方“收益乘积”\max \prod_{i1}^{N} (C_i^0 - C_i^{fin})其中 C_i^0 - C_i^{fin} 表示第 i 个微网通过合作省下的钱我习惯把它记为 R_i叫合作收益。乘积形式有很好的性质它要求每个 R_i 都为正否则整个乘积变成负数或零谈判直接失败。实际写进优化模型时会把乘积取对数因为对数严格递增且能把乘积变成求和数值上更稳定\max \sum_{i1}^{N} \ln R_i2.2 为什么必须引入非对称权重对称纳什谈判假设所有微网议价能力相同收益按某种数学上对称的方式分配。但这个假设在工程里很脆弱。微网之间规模不同、资产不同、承担的角色不同有的微网自己有光伏有的全是负荷有的装了储能可以做调节有的连联络线投资份额都更高。如果所有微网平均分收益出力大、让利多的微网很快会不平衡。非对称纳什谈判就是在每个微网的收益项上增加一个权重 w_i\max \sum_{i1}^{N} w_i \ln R_i,\quad w_i 0权重 w_i 越大该微网在谈判中分到的收益就越多。w_i 通常归一化即 \sum w_i 1。它不改变“总收益最大”的物理目标只改变“总收益在各主体间如何切”的方向。权重的来源有不少做法。最朴素的是按贡献占比比如按各微网可共享的新能源富余电量、储能可调容量、最大联络线支撑功率等指标折算。也可以用合作博弈里的 Shapley 值逐个计算每个微网对联盟总收益的边际贡献再归一化得到权重。Shapley 值理论公平但需要枚举 2^N 种联盟组合N 超过 6 之后计算量就不好看了适合小规模验证不适合上生产。实际项目中我更推荐按关键物理量折算权重边迭代边谈。2.3 两阶段求解框架为什么能成立多微网共享模型中微网之间除了物理上交换功率还有一笔内部结算费用 t_i正的 t_i 表示该微网向联盟其他成员支付负的表示获得补贴。最终成本表达式为C_i^{fin} c_i^{op} t_i其中 c_i^{op} 是微网本地运行成本包括从上级电网购电、储能充放电老化、弃风弃光惩罚等但不包含微网之间的结算费用。关键性质在于结算费用 t_i 只进入经济分配不影响每个时刻的功率平衡、储能SOC这些物理约束。联盟总运行成本 \sum c_i^{op} 只由物理调度决定和 t_i 无关。因此问题天然解耦成两个阶段先做联盟总成本最小化把蛋糕做大再做纳什谈判把固定大小的总收益分配掉。这也是可转移效用背景下纳什谈判的标准结论当各方效用与支付 t_i 呈线性关系时纳什谈判解等价于“先最大化总收益再按权重分配收益”。有些论文直接在一个大模型里同时写物理约束和纳什乘积理论上没错但求解难度高很多而且很难向业主解释清楚你到底是炒菜还是分菜。两阶段之后第二阶段甚至能写出闭式解。3. MATLAB两阶段模型搭建从变量定义到求解器调用3.1 输入数据与决策变量定义我用 MATLAB 2023b 加 YALMIP 建模求解器用 Gurobi。没有 Gurobi 的话把模型里的二进制变量去掉也可以用内置 linprog后面会讲。先定义基础数据。假设有 N 个微网调度周期 T24 小时步长1小时。每个微网有光伏预测出力 Ppv、风电预测出力 Pwt、负荷 L储能额定容量 Ecap最大充放电功率 PchMax、PdisMax。变量定义如下N 3; T 24; dt 1; % 预测数据为 NxT 矩阵单位统一为 MW 和 MWh Ppv rand(N,T)*1.5; Pwt rand(N,T)*0.8; L rand(N,T)*2.0; Pbuy sdpvar(N,T,full); % 从上级电网购电 Psell sdpvar(N,T,full); % 向上级电网售电 Pch sdpvar(N,T,full); % 储能充电功率 Pdis sdpvar(N,T,full); % 储能放电功率 SOC sdpvar(N,T1,full); % 储能电量单位 MWh % 微网间联络线功率Pij(i,j,t) 表示 t 时段 i 向 j 输送的功率 PpvUse sdpvar(N,T,full); % 实际使用的光伏 PwtUse sdpvar(N,T,full); % 实际使用的风电 Pij sdpvar(N,N,T,full); % 对角元素不用置零即可这里我把 SOC 直接定义成储能的电量而不是百分比能省掉一批容量归一化换算数值上也更稳。如果习惯用百分比那 SOC 约束里要记得除以 Ecap很容易漏。3.2 约束条件写法约束分四块功率平衡、储能时间耦合、联络线一致性、购售电上限。功率平衡是每个微网每个时段必须满足的F []; Pij Pij - diag(ones(1,N))*0; % 置零对角 for t 1:T F [F, PpvUse(:,t) PwtUse(:,t) Pbuy(:,t) Pdis(:,t) ... L(:,t) Psell(:,t) Pch(:,t) sum(Pij(:,:,t),2)]; end注意 sum(Pij(:,:,t),2) 是每个微网向所有邻居输出的功率总和。如果 Pij(i,j,t) 定义成从 i 到 j 的功率那么对 i 来说输出功率相当于额外负荷所以放在等式右边。储能约束很容易踩坑尤其是充放电效率% SOC 更新充电时能量增加要乘充电效率放电时要除以放电效率 SOC(:,2:T1) SOC(:,1:T) dt*(eta_ch*Pch - Pdis/eta_dis); F [F, SOC(:,1) SOC0]; % 初始电量 F [F, SOC(:,T1) SOC0]; % 周期调度末尾回到初始值 F [F, SOCmin SOC SOCmax]; F [F, 0 Pch PchMax]; F [F, 0 Pdis PdisMax];如果放电效率写成乘而不是除24小时下来SOC误差能差出好几个MWh优化结果会出现“凭空多出来的电”。联络线约束要保证功率方向一致且不超过容量Pmax 1.0; % 单条联络线可传输的最大功率 for i 1:N for j i1:N F [F, Pij(i,j,:) Pij(j,i,:) 0]; % 方向一致性 F [F, -Pmax Pij(i,j,:) Pmax]; end end这里 Pij(i,j) Pij(j,i) 0 的含义是如果 i 向 j 输出了 0.5MW那么 j 向 i 输出就是 -0.5MW不会出现两边同时“送电”的假象。没有线损时这个等式必须严格成立加上损耗之后会变成非凸不等式组实际工程可以先忽略线损后面再修正。购售电同时发生的问题我用二进制变量处理zGrid binvar(N,T,full); F [F, Pbuy PgridMax*zGrid]; F [F, Psell PgridMax*(1-zGrid)];这相当于告诉求解器同一个微网同一个时段要么买要么卖不能又买又卖。储能充放电同时发生的处理方式相同加一组二进制变量即可。需要提醒的是二进制变量会让MILP求解时间明显上升后面我会讲一个更轻量的替代方案。3.3 阶段I联盟总成本最小化阶段I的目标函数是最小化所有微网的本地运行成本之和。成本包括上级电网购电费用、售电收益负成本、储能充放电老化成本和弃风弃光惩罚% 分时电价单位元/MWhN1时用矩阵广播为 NxT pi_buy repmat([350 350 350 350 500 500 700 700 900 900 900 500 ... 500 900 900 900 700 700 500 500 500 350 350 350], N, 1); pi_sell pi_buy * 0.35; % 售电价格远低于购电价格 c_deg 80; % 储能每充放1MWh的折旧成本 lambda_cur 600; % 弃风弃光惩罚系数高于购电价 Objective sum(sum(pi_buy.*Pbuy - pi_sell.*Psell ... c_deg*(Pch Pdis) ... lambda_cur*((Ppv - PpvUse) (Pwt - PwtUse))));约束里要限制 PpvUse 和 PwtUse 不超过预测值F [F, 0 PpvUse Ppv, 0 PwtUse Pwt];调用求解器ops sdpsettings(solver,gurobi,verbose,1); optimize(F, Objective, ops); % 提取结果 C_i_op value(pi_buy.*Pbuy - pi_sell.*Psell c_deg*(PchPdis) ... lambda_cur*((Ppv-PpvUse) (Pwt-PwtUse))); C_i_op sum(C_i_op,2); % 每个微网的本地运行成本 C_sum sum(C_i_op);这里 C_i_op 就是第二阶段里的 c_i^{op}它是物理调度产生的成本还不包含微网之间结算费用。3.4 不合作基准与阶段II非对称纳什分配闭式解不合作成本 C_i^0 必须单独算。做法是把每个微网孤立出来删除所有 Pij 变量和联络线约束每个微网独立跑一遍最小化模型。代码上可以写一个循环也可以复制N份模型求解。这一步容易被人忽略但它直接决定谈判破裂点算错后面全白做。阶段II的数学可以推导得很干净。定义合作总收益S \sum_{i} C_i^0 - \sum_{i} c_i^{op} \sum_i C_i^0 - C_sum满足 S0 才有合作空间。再定义每个微网在物理调度上的“潜在贡献”D_i C_i^0 - c_i^{op}如果 D_i 是正的说明单纯看本地运行这个微网的调度成本比独立时降低了如果 D_i 是负的说明为了让联盟整体更优这个微网在物理上多花了钱需要在结算时由其他人补贴给它。非对称纳什谈判问题写成\max \sum_i w_i \ln R_i配平约束 \sum_i R_i S其中 R_i C_i^0 - C_i^{fin} 是最终合作收益。用拉格朗日法求解很容易得到闭式解R_i w_i S,\quad 若 w 已归一化内部结算费用t_i D_i - R_i最终成本C_i^{fin} c_i^{op} t_i C_i^0 - R_i在MATLAB里实现非常短% C_i0 是独立运行成本向量长度为 N S sum(C_i0) - C_sum; if S 0 error(联盟总成本高于独立运行没有合作空间); end % 自定义权重例如按新能源装机占比折算再归一化 w [0.5; 0.3; 0.2]; w w / sum(w); R_i w * S; % 每个微网分到的最终收益 D_i C_i0 - C_i_op; % 物理调度节省 t_i D_i - R_i; % 微网间结算费用 C_fin C_i_op t_i; % 最终成本这个闭式解是我最喜欢这个模型的地方。第二阶段根本不需要调用求解器几行矩阵运算就能完成而且物理含义一目了然。4. 实际调试中的关键细节与避坑指南4.1 储能SOC的“周期循环”坑刚开始做这个模型时我一度没有加 SOC(:,T1)SOC0 的约束结果优化结果里每个微网都在最后一个时段把储能放电放到下限然后结束调度。问题在于目标函数里储能放电相当于减少购电看起来是从电网“套利”实际是把初始电量当免费资源耗掉了。加上周期约束后储能一天的净充放电量必须回到初始状态模型才会真正考虑跨时段蓄能的价值。这是周期调度场景下一定要写的约束。如果实际系统要求第二天继续运行甚至可以改成 SOC(:,T1) SOC0允许留一点余量。4.2 二进制变量太多导致求解变慢前面用 binvar 限制“不购售同时”和“不充放同时”模型变成MILP。微网数量一多比如10个微网、24时段即使是简单MILP也可能要跑几十秒甚至更久。工程上如果不需要严格证明最优解我建议先删掉二进制变量在目标函数里加一个极小的线性惩罚项tiny_penalty 1e-4; Objective Objective tiny_penalty * sum(sum(Pbuy Psell Pch Pdis));因为购售电之间天然有价差储能的折旧成本也会抑制无意义的同时充放所以一个很小的惩罚就能让求解器自动避免同时发生。惩罚系数一定要小太大会改变真实调度结果。我通常取电价的千分之一量级比如购电价350元/MWh时惩罚系数取0.1元/MWh级别。4.3 联络线符号约定不清导致结果混乱我在第一版代码里把 Pij 定义成“从 i 到 j 的正功率”但写功率平衡时又让 j 侧把它当负值处理结果好几条约束方向反了阶段II的 t_i 符号也反了看起来每笔结算都对不上。最后我强制自己在代码里写清楚Pij(i,j,t) 0 表示 i 向 j 送电那么 i 的本地平衡中它对应负荷j 的平衡中它对应电源。约束 Pij(i,j)Pij(j,i)0 保证不会出现双向输送。阶段II结算时t_i0 表示 i 净支付t_i0 表示 i 净获得补贴。这个符号约定写进注释之后永远不会乱。4.4 数值缩放和求解器配置YALMIP建模时如果电价、功率、成本量级差太多Gurobi内部数值会出问题。我习惯统一单位功率用MW电量用MWh电价用元/MWh成本量级在几千到几万元这个范围对Gurobi很友好。不要搞成kW和元/kWh混用更不要把成本放大到亿元级。求解器方面Gurobi对MILP支持很好。没有商业求解器时删掉二进制变量并加大微小惩罚后直接用MATLAB的linprog也能跑通。如果是毕业论文和课题验证YALMIPGurobi的组合最省心如果是工程落地建议把模型改写成MATLAB Optimization Toolbox的optimproblem方便部署到不支持YALMIP的同事环境里。5. 三微网算例非对称权重到底改变了什么5.1 独立运行、对称与非对称三种模式对比我用一个三微网算例展示结果。三个微网分别为MG1光伏很强白天有大量富余MG2是纯商业负荷白天高峰明显MG3装了风电夜间出力好但自身负荷一般。经过阶段I和独立运行计算后成本数据如下。项目MG1MG2MG3合计独立运行成本 C_i^030004500270010200联盟运行成本 c_i^{op}2300370030009000物理节省 D_i700800-3001200合作总收益 S1200元这是联盟调度带来的蛋糕。MG3 在联盟调度中本地成本反而上升300元是因为它夜间把风电送给了MG2自己需要多买一部分电来平衡这部分额外成本必须通过内部结算补回来。对称权重下权重 w[1/3, 1/3, 1/3]每个微网分到收益400元。内部结算费用为MG1t700-400300净支付MG2t800-400400净支付MG3t-300-400-700净获得补贴最终成本分别为2600、4100、2300。MG1明明提供了大量光伏富余结果和MG2一样都是省400心里不会舒服。这也是对称模型的典型软肋。改成非对称权重 w[0.5, 0.3, 0.2] 后收益分配变成微网w_iR_i结算 t_i最终成本MG10.56001002400MG20.33604404140MG30.2240-5402460这里MG1在合作后的最终成本降到2400比对称时更好MG2和MG3也依然没有超过独立运行成本所以都愿意签约。但这个权重不是随便拍的应该根据MG1“可共享光伏电量”和MG3“风电支撑量”的实测潜力折算至少要有一张数据表支撑才能让各方服气。5.2 权重的灵敏度边界权重调整不是无限度的。虽然闭式解保证每个微网最终成本都低于独立运行成本但如果一个微网用极端权重拿走绝大多数收益另一个微网虽然技术上仍满足个体理性可能因为净结算费用过高而拒绝执行。我在项目里常加一个最低收益约束每个微网的最终收益不低于某个阈值 R_min_i比如不低于总收益的10%。再替换原来的闭式解用一个小规模凸优化重新分配S sum(C_i0) - sum(C_i_op); w [0.5; 0.3; 0.2]; w w / sum(w); R_min [100; 100; 80]; fun (R) -sum(w .* log(R)); Aeq ones(1,N); beq S; lb R_min; ub []; R0 w * S; R_opt fmincon(fun, R0, [], [], Aeq, beq, lb, ub);注意 R_min 的总和必须小于 S否则无解。如果出现无解说明这套权重组合本身不合理需要重新谈权重而不是继续在模型层面硬凑。实际使用中我会先跑闭式解把结果发给各微网业主看再根据反馈调整约束。5.3 运行计划本身的改善阶段I联盟调度的另一大收益是运行方式改变。我算过一组实际数据联盟前MG1午间弃光率达到9%联盟后降到2%以下MG2高峰时段从上级电网购电量下降约17%整个联盟的总购电费用减少幅度接近12%。这些数字虽然不是通用结论但方向非常一致电能共享首先在物理上减少了不必要的弃能和高价购电然后才是非对称纳什谈判解决分配公平性。算例最后我还习惯把Pij的时序曲线画出来检查几个时间点上的送电方向是否符合直觉。比如中午MG1往MG2送电夜间MG3往MG2送电如果反向说明功率平衡写错了或者电价信号不合理。6. 从集中式到分布式ADMM改造路径与调参经验6.1 集中式模型在工程落地时的局限两阶段模型如果直接集中式求解需要把所有微网的负荷曲线、光伏预测、储能SOC、成本参数汇总到一个中心。这些数据在同一个园区内部还好说跨业主、跨企业时很难拿到。没人愿意把自己真实的负荷和生产数据全交给别人。哪怕数据给了一旦微网数量增长到几十个集中式建模的变量规模也会明显膨胀调试一个全局MILP的难度比想象中大得多。所以工程上更常见的做法是用分布式算法每个微网只跑自己的子问题通过少量交换变量协调。ADMM是其中最好上手的一种。6.2 ADMM的变量复制与迭代框架以阶段I联盟总成本最小化为例。集中式模型中存在耦合约束 Pij(i,j)Pij(j,i)0它把两个微网的变量绑在一起。ADMM的做法是对每条联络线复制变量i侧保存 x_ij 表示i给j的功率j侧保存 x_ji 表示j给i的功率然后引入公共变量 z_ij让两侧逐步收敛到一致。迭代过程大致如下每个微网独立求解子问题目标是最小化自己的本地成本加上增广拉格朗日中的二次罚项。子问题规模只涉及单个微网变量连续模型可直接用quadprog或YALMIP求解。更新公共变量 z_ij通常取两侧变量和拉格朗日乘子的加权平均值。更新拉格朗日乘子公式是 \lambda^{k1} \lambda^k \rho (x^{k1} - z^{k1})。计算原始残差 rx-z 和对偶残差 s\rho(z^{k1}-z^k)直到二者都低于阈值。阶段II的非对称纳什分配在分布式框架下也很好办每个微网只需要向协调器上报两个标量独立运行成本 C_i^0 和本地运行成本 c_i^{op}再加自己的权重 w_i。协调器汇总后算出 S 和各微网的 R_i、t_i广播回去。这样完全不需要暴露负荷曲线和储能SOC隐私保护效果很好。6.3 调参经验ADMM不是银弹ADMM最头疼的参数是罚参数 \rho。 \rho 太小原始残差收敛慢 \rho 太大对偶残差震荡剧烈。我调一个五微网模型时把 \rho 从0.01扫到100发现最优区间很窄通常在功率量级MW的0.1到10倍之间。更稳的做法是自适应调节每5到10次迭代如果 |r| 10|s|就把 \rho 乘以2如果 |s| 10|r|就把 \rho 除以2。这套思路在学术论文里叫residual balancing实际上手很好用。还有一点必须提醒ADMM对纯凸连续问题才有保证。如果阶段I模型里保留了二进制变量比如严格“不购售同时”约束ADMM的收敛性就变成玄学。我实际跑下来MILP加ADMM经常出现振荡也许换个初始点能过但没有理论保证。工程上我通常先把模型改成连续版本用微小惩罚替代二进制变量确保ADMM稳定收敛等分布式结果验证通过后再考虑局部加整数约束做后校验。6.4 从集中式验证到分布式部署的路径我给自己的项目定了三条铁律先集中式、再分布式先连续、再整数先静态算例、再滚动预测。第一版一定用集中式两阶段模型跑通全部算例得到基准解。这个解的价值不只是给论文一个对比更是后面调ADMM时的“参考答案”。如果分布式算法收敛到的地方和集中式基准差太多大概率是参数或者初始点有问题而不是分布式算法不好用。第二版才改写ADMM而且先用不含整数的连续模型。每迭代几步就把当前的总成本和集中式基准解做对比看差距是否在可接受范围内。分布式收敛后再把结算结果送到各微网做复算确认每个微网子问题的内部约束都满足。最后说一个很细节但实用的心得ADMM在MATLAB里不要贪图“一行代码写完”一定要在每个微网子问题之间保留清晰的输入输出接口。比如子问题是函数输入是上一次迭代的z和lambda输出是本轮的Pij、本地成本、SOC调试时你能单独跑某个子问题定位问题。我把子问题封装成函数后排查速度比原来全部堆在脚本里快了不止一倍。这套模型做到最后我最大的感受是多微网电能共享的数学难度其实不在“优化”本身而在“让每个主体都愿意参加合作”。非对称纳什谈判把大家对收益分配的不满收敛到了“权重怎么定”这一个问题上反而给了各参与者一个透明、可讨论的谈判入口。工程上谈得拢比数学上好算更重要。如果你也在做类似项目我建议先把两阶段集中式模型跑通把非对称权重的灵敏度区间算清楚再考虑ADMM改造。上来直接写分布式很容易陷入调参泥潭。最后留一个小技巧算完收益分配后把每个微网的最终成本和独立运行成本画成柱状图发给业主看让对方直观看到“我比不合作少花了多少”这个模型才真正具备落地的说服力。
返回列表