聊到多微网电能共享,绕不开的一个词就是非对称纳什谈判。前段时间我在做微电网群协调运行的项目,模型里最开始用的是对称纳什谈判,结果几个微网主体差点谈崩——有人出力多却分得少,谁都不愿意签字。后来把权重改成非对称形式,收益分配才真正站得住脚,这就是我用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_{i=1}^{N} (C_i^0 - C_i^{fin})
其中 C_i^0 - C_i^{fin} 表示第 i 个微网通过合作省下的钱,我习惯把它记为 R_i,叫合作收益。乘积形式有很好的性质:它要求每个 R_i 都为正,否则整个乘积变成负数或零,谈判直接失败。实际写进优化模型时,会把乘积取对数,因为对数严格递增且能把乘积变成求和,数值上更稳定:
\max \sum_{i=1}^{N} \ln R_i
2.2 为什么必须引入非对称权重
对称纳什谈判假设所有微网议价能力相同,收益按某种数学上对称的方式分配。但这个假设在工程里很脆弱。微网之间规模不同、资产不同、承担的角色不同:有的微网自己有光伏,有的全是负荷;有的装了储能可以做调节,有的连联络线投资份额都更高。如果所有微网平均分收益,出力大、让利多的微网很快会不平衡。
非对称纳什谈判就是在每个微网的收益项上增加一个权重 w_i:
\max \sum_{i=1}^{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 个微网,调度周期 T=24 小时,步长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,T+1,'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:T+1) == SOC(:,1:T) + dt*(eta_ch*Pch - Pdis/eta_dis); F = [F, SOC(:,1) == SOC0]; % 初始电量 F = [F, SOC(:,T+1) == 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 = i+1: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的目标函数是最小化所有微网的本地运行成本之和。成本包括上级电网购电费用、售电收益(负成本)、储能充放电老化成本和弃风弃光惩罚:
% 分时电价,单位元/MWh,N=1时用矩阵广播为 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*(Pch+Pdis) ... + 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
满足 S>0 才有合作空间。再定义每个微网在物理调度上的“潜在贡献”:
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(:,T+1)==SOC0 的约束,结果优化结果里每个微网都在最后一个时段把储能放电放到下限,然后结束调度。问题在于目标函数里储能放电相当于减少购电,看起来是从电网“套利”,实际是把初始电量当免费资源耗掉了。加上周期约束后,储能一天的净充放电量必须回到初始状态,模型才会真正考虑跨时段蓄能的价值。
这是周期调度场景下一定要写的约束。如果实际系统要求第二天继续运行,甚至可以改成 SOC(:,T+1) >= 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_i>0 表示 i 净支付,t_i<0 表示 i 净获得补贴。这个符号约定写进注释,之后永远不会乱。
4.4 数值缩放和求解器配置
YALMIP建模时,如果电价、功率、成本量级差太多,Gurobi内部数值会出问题。我习惯统一单位:功率用MW,电量用MWh,电价用元/MWh,成本量级在几千到几万元,这个范围对Gurobi很友好。不要搞成kW和元/kWh混用,更不要把成本放大到亿元级。
求解器方面,Gurobi对MILP支持很好。没有商业求解器时,删掉二进制变量并加大微小惩罚后,直接用MATLAB的linprog也能跑通。如果是毕业论文和课题验证,YALMIP+Gurobi的组合最省心;如果是工程落地,建议把模型改写成MATLAB Optimization Toolbox的optimproblem,方便部署到不支持YALMIP的同事环境里。
5. 三微网算例:非对称权重到底改变了什么
5.1 独立运行、对称与非对称三种模式对比
我用一个三微网算例展示结果。三个微网分别为:MG1光伏很强,白天有大量富余;MG2是纯商业负荷,白天高峰明显;MG3装了风电,夜间出力好但自身负荷一般。经过阶段I和独立运行计算后,成本数据如下。
| 项目 | MG1 | MG2 | MG3 | 合计 |
|---|---|---|---|---|
| 独立运行成本 C_i^0 | 3000 | 4500 | 2700 | 10200 |
| 联盟运行成本 c_i^{op} | 2300 | 3700 | 3000 | 9000 |
| 物理节省 D_i | 700 | 800 | -300 | 1200 |
合作总收益 S=1200元,这是联盟调度带来的蛋糕。MG3 在联盟调度中本地成本反而上升300元,是因为它夜间把风电送给了MG2,自己需要多买一部分电来平衡,这部分额外成本必须通过内部结算补回来。
对称权重下,权重 w=[1/3, 1/3, 1/3],每个微网分到收益400元。内部结算费用为:
- MG1:t=700-400=300,净支付
- MG2:t=800-400=400,净支付
- MG3:t=-300-400=-700,净获得补贴
最终成本分别为2600、4100、2300。MG1明明提供了大量光伏富余,结果和MG2一样都是省400,心里不会舒服。这也是对称模型的典型软肋。
改成非对称权重 w=[0.5, 0.3, 0.2] 后,收益分配变成:
| 微网 | w_i | R_i | 结算 t_i | 最终成本 |
|---|---|---|---|---|
| MG1 | 0.5 | 600 | 100 | 2400 |
| MG2 | 0.3 | 360 | 440 | 4140 |
| MG3 | 0.2 | 240 | -540 | 2460 |
这里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^{k+1} = \lambda^k + \rho (x^{k+1} - z^{k+1})。
- 计算原始残差 r=x-z 和对偶残差 s=\rho(z^{k+1}-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改造。上来直接写分布式,很容易陷入调参泥潭。最后留一个小技巧:算完收益分配后,把每个微网的最终成本和独立运行成本画成柱状图发给业主看,让对方直观看到“我比不合作少花了多少”,这个模型才真正具备落地的说服力。