ARTICLE DETAIL

资讯详情

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

计及碳排放的基于ADMM多微网电能交互分布式运行策略

计及碳排放的基于ADMM多微网电能交互分布式运行策略 多微电网领域的同行们尤其是正在为“碳排放约束下的分布式协调调度”选题发愁的研究生我特别理解你们看到这类标题时的感受——方向很热但代码、模型、算法层层叠叠一时间不知道从哪下手。“计及碳排放的基于ADMM的多微网电能交互分布式运行策略”这个题目核心是用交替方向乘子法ADMM把传统的多微网集中式优化问题“分布式”地解掉让每个微网在保护自身信息隐私的前提下通过少量边界交互信息实现全局接近最优的电能共享和碳减排目标。这篇文章我会把整个思路从头到尾梳理一遍包括怎么建模、为什么用ADMM、Matlab里怎么落地以及调试过程中踩过的坑。适合已经能用MatlabYALMIP跑通简单优化问题、但还没系统接触过分布式优化算法的同学参考。1. 多微网电能交互问题的本质从“各扫门前雪”到“互通有无”1.1 单微网运行优化的基本盘在讲多微网交互之前得先把单微网的问题搞清楚。一个典型的微网里面通常有光伏PV、风机WT、储能系统ESS、本地负荷有时候还有柴油发电机DE这种可控单元。单微网优化运行的经典目标函数是让总的运行成本最小包括向外部电网购电的费用、柴油发电机的燃料成本、储能充放电的折旧成本等。用数学语言来表达单微网在第 t 个时段的优化问题大致是这样一个形式目标函数经济成本最小化min Σ_t [ C_buy(t) * P_buy(t) - C_sell(t) * P_sell(t) a * P_DE(t)^2 b * P_DE(t) c C_ESS * (P_ch(t) P_dis(t)) ]其中P_buy(t)是从上级电网购电的功率P_sell(t)是向电网售电的功率二者通常不能同时非零P_DE(t)是柴油发电机出力a、b、c是其燃料成本系数C_ESS是储能充放电的单位损耗成本P_ch(t)、P_dis(t)分别是储能充电和放电功率约束条件包括功率平衡约束P_PV(t) P_WT(t) P_DE(t) P_dis(t) P_buy(t) P_load(t) P_ch(t) P_sell(t)储能SOC荷电状态动态约束SOC(t1) SOC(t) η_ch * P_ch(t) * Δt - P_dis(t) * Δt / η_dis各项出力上下限约束储能SOC上下限约束这就是一个典型的线性规划或者二次规划问题用Matlab里的YALMIP工具包调CPLEX或Gurobi求解器几行代码就能搞定。1.2 多微网带来的核心挑战电能在微网之间怎么流动单微网的问题比较成熟了但实际场景中多个微网在空间上可能是毗邻的它们可以通过公共连接点PCC或者微网间的互联线路进行电能交互。为什么要交互因为每个微网内部的分布式电源出力和负荷需求往往不匹配——A微网的光伏大发本地用不完B微网正好缺电向电网购电价格又高。如果A和B之间有一条联络线A把多余的电卖给B对两边都有利。多个微网放在一起考虑问题就来了究竟哪些微网之间可以交易交易多少功率交易电价怎么定这些功率是协调变量把各个微网“耦合”在一起。如果所有微网都属于同一个运营商可以集中式求解把所有微网的变量都放进同一个优化模型里一次算完。但现实中微网可能属于不同的利益主体不同的园区、不同的业主它们不愿意把自己内部的负荷曲线、储能配置、成本参数等敏感信息共享出来。这时候分布式优化算法就有了用武之地。1.3 计及碳排放从单纯经济最优到经济和碳的平衡“双碳”目标下来之后微网运行不能再只盯着钱看了。在优化模型里加入碳排放因素一般有两种做法第一种是直接把碳排放量作为目标函数的一项加一个碳价格系数把碳排放量乘上碳价转成成本项。表现形式是min Σ_t [ 经济成本(t) C_carbon * E_total(t) ]其中E_total(t)是第 t 个时段的碳排放总量主要来自向电网购电对应的间接碳排放和柴油发电机发电的直接碳排放。向电网购电的间接碳排放因子跟电网的电源结构有关一般取一个区域平均值柴油发电机的碳排放因子则跟燃耗率有关。第二种是引入碳交易机制给每个微网分配碳排放配额实际排放超过配额的部分需要花钱购买低于配额的部分可以出售获利。这种做法的优化目标里会多出一项碳交易成本min Σ_t [ 经济成本(t) C_carbon_price * (E_total(t) - E_quota(t)) ]显然加入碳排放项之后系统会自发地减少购电和柴油发电转而优先消纳本地可再生能源因为那部分不产生碳成本。这就是“碳排放约束如何影响电能交互行为”的切入点了。2. 从集中式到分布式ADMM为什么是这里的最优解2.1 集中式优化的不可行性把 N 个微网放在一个模型里变量数会变成单微网的好几倍而且要收集所有微网的内部参数。在实操过程中集中式优化最大的问题不是计算量而是信息隐私和主体独立性。假设微网A和微网B分属不同公司A愿意参与合作是因为能看到整体收益但A不愿意把自己储能的SOC轨迹、柴油机的成本系数告诉B。集中式建模要求把这些数据全部汇总到一个中心节点这在现实商业场景中几乎无法推进。分布式优化的思路就是“每个微网算自己的问题只和邻居交换少量边界变量其他信息一概不泄露”。ADMM作为工程中最成熟的分布式优化算法之一恰恰能在“保证隐私”和“实现全局最优”之间取得一个很好的平衡。2.2 ADMM的数学原理拆与合的艺术ADMM解决的是这样一个标准形式的问题min f(x) g(z) s.t. Ax Bz c它把原问题拆成两个变量块 x 和 z它们之间有一个线性等式约束。放在多微网场景里x 就是各个微网内部的决策变量各机组出力、储能功率等z 是微网之间交互功率的公共耦合变量约束Ax Bz c保证了两个相邻微网对交互功率的“认识”一致——即微网 i 认为它卖给微网 j 的功率是 p微网 j 认为它从微网 i 买的功率也必须是 p。ADMM 的迭代分三步第1步x-update外层拉格朗日乘子固定更新 x 子问题各微网独立求解自己的优化 第2步z-update固定 x 和对偶变量更新全局耦合变量 z 第3步λ-update更新对偶变量拉格朗日乘子。每一步的数学表达是x(k1) argmin_x { f(x) (ρ/2) * || Ax Bz(k) - c u(k) ||^2 } z(k1) argmin_z { g(z) (ρ/2) * || Ax(k1) Bz - c u(k) ||^2 } u(k1) u(k) Ax(k1) Bz(k1) - c其中 ρ 是惩罚参数u (1/ρ) * λ 是缩放后的对偶变量。从形式上看x-update 恰好可以把不同微网的变量拆开——因为 f(x) 是各微网目标函数的求和而耦合项||Ax Bz c||在展开后对于每个微网 i 来说只包含它自己相关的交互功率变量所以 x-update 天然是分布式、可并行计算的。2.3 为什么选ADMM而不是其他算法可能你会问分布式优化不止ADMM一种还有目标级联分析ATC、一致性算法Consensus、原始对偶分裂法等。我的理解是这样的一致性算法适合无中心节点的对等通信结构但要处理渐近一致性的收敛问题对通信拓扑和步长参数敏感调参成本高。ATC分析目标级联适合层级结构思路也是拆分子问题但它的迭代机制在处理等式约束和不等式约束混合问题时收敛速度不一定比ADMM好而且理论收敛性分析不如ADMM成熟。ADMM理论简洁、实现方便只要问题是个凸优化问题在合适的 ρ 下收敛性有保证。最关键的是ADMM的“乘子更新”机制让它对约束违反的惩罚是动态调整的不会像固定罚函数法那样容易震荡。在多微网场景里微网之间的交互功率约束是等式约束ADMM天然匹配。而且各微网子问题互不依赖可以并行求解这对代码实现和计算效率都有很大好处。3. 多微网分布式运行策略的完整建模过程3.1 系统框架和拓扑关系假设我们有 N 个微网以3个微网为例这个规模在验证阶段足够每个微网通过联络线与公共母线相连微网之间通过公共母线实现电能交互。这种拓扑在ADMM建模里处理起来很方便因为公共母线充当了一个天然的“协调器”它的作用是更新全局变量 z即各微网从母线获取或注入的净功率。每个微网 i 的内部组成包括光伏机组 PV_i储能系统 ESS_i本地负荷 Load_i可选柴油发电机 DE_i微网 i 和公共母线之间的交互功率记为P_exchange(i, t)正值表示从母线取电负值表示向母线送电。所有的P_exchange之和必须为0功率守恒这就是全局耦合约束。3.2 目标函数经济和碳的联合优化每个微网 i 的局部目标函数定义为f_i Σ_t [ ρ_spot * P_grid(i, t) * Δt % 从上级电网购电成本或售电收入 (a_i * P_DE(i, t)^2 b_i * P_DE(i, t) c_i) * Δt % 柴油机燃料成本 c_ess * (P_ch(i, t) P_dis(i, t)) * Δt % 储能损耗 c_carbon * E_i(t) * Δt % 碳排放成本 - c_trade * P_exchange(i, t) * Δt % 向其他微网购电/售电的收益 ]其中c_trade是微网间电能交互的结算价格。这个价格可以是固定的也可以按照某个规则动态调整。在用ADMM求解时P_exchange是微网和全局协调器之间的耦合变量而c_trade可以看作一个外生参数也可以放到ADMM的迭代中由对偶变量决定——通常我们更推荐后者因为对偶变量本质上是约束的影子价格它正好反映了交互功率的边际价值相当于自动生成了一个随供需变化的交易电价。碳排放量的计算E_i(t) α_grid * P_grid(i, t) α_DE * P_DE(i, t)其中α_grid是电网购电的碳排放因子kg/kWhα_DE是柴油机发电的碳排放因子。3.3 约束条件功率平衡、储能动态、交互上下限微网 i 在第 t 时段的功率平衡约束P_PV(i, t) P_DE(i, t) P_dis(i, t) P_grid(i, t) P_exchange(i, t) P_load(i, t) P_ch(i, t)注意这里把P_exchange(i, t)定义为“净交互功率”正值表示从外部净获取功率。储能约束SOC_min ≤ SOC(i, t) ≤ SOC_max 0 ≤ P_ch(i, t) ≤ P_ch_max 0 ≤ P_dis(i, t) ≤ P_dis_max SOC(i, t1) SOC(i, t) η_ch * P_ch(i, t) * Δt - P_dis(i, t) * Δt / η_dis SOC(i, 0) SOC_initial SOC(i, T) SOC_final % 一个运行周期结束时SOC回到初始状态或者设定为固定值与上级电网交互的约束0 ≤ P_grid(i, t) ≤ P_grid_max % 简化模型只允许从电网购电不允许回售也可以允许双向流动加上方向约束即可。微网间交互功率的上下限-P_exchange_max ≤ P_exchange(i, t) ≤ P_exchange_max代表联络线容量限制或人为设定的最大交易功率。全局耦合约束是全球协调器层面的Σ_i P_exchange(i, t) 0 ∀t这就是把各个微网耦合在一起的约束也是ADMM要处理的约束。3.4 碳排放配额的引入方式如果采用碳交易机制每个微网 i 在运行周期内有一个总配额E_quota(i)实际排放总量为E_total_i Σ_t E_i(t) * Δt。碳交易成本通过一个线性函数进入目标函数C_carbon_total C_carbon_price * (E_total_i - E_quota(i))这里碳价C_carbon_price是市场给定的外生参数。从数学上看碳排放配额相当于一个额外的“软约束”它通过目标函数中的碳价项起作用如果微网排放超出配额需要花钱购买若低于配额那部分可以出售获利。实际调试中我发现这个机制对系统行为的影响非常直观——碳价定得越高微网越倾向于削减购电和柴油发电储能的使用率也会提升利用储能替代高峰期购电微网之间交互功率的流量和方向也会随之改变。4. Matlab实现全流程主程序框架、子问题求解和迭代逻辑4.1 代码整体架构Matlab代码实现采用模块化设计整体分为以下几个文件main_multi_microgrid_admm.m % 主程序控制整个迭代流程 create_system_data.m % 系统参数设置微网数量、负荷、光伏曲线、储能参数等 build_subproblem.m % 构建每个微网的子优化问题 solve_subproblem.m % 调用求解器求解具体微网的子问题 update_global_variables.m % 更新全局交互功率变量z和对偶变量lambda check_convergence.m % 收敛性判断 plot_results.m % 结果可视化主程序的核心逻辑是一个迭代循环%% 初始化 lambda zeros(T, N); % 对偶变量每个微网每个时段一个 z zeros(T, N); % 全局交互功率参考值 P_exchange zeros(T, N); % 各微网实际的交互功率 for k 1:K_max %% Step 1: 各微网并行求解子问题 for i 1:N [P_grid(:,i), P_DE(:,i), P_ch(:,i), P_dis(:,i), P_exchange(:,i), obj(i), SOC(:,i)] ... solve_subproblem(i, lambda(:,i), z(:,i), rho, system_data); end %% Step 2: 更新全局变量 z % 对所有微网的平均交互功率进行投影 for t 1:T z(t,:) P_exchange(t,:) - mean(P_exchange(t,:)); end %% Step 3: 更新对偶变量 lambda lambda lambda rho .* (P_exchange - z); %% Step 4: 计算原始残差和对偶残差判断收敛性 r_pri norm(P_exchange - z, fro); r_dual rho * norm(z - z_prev, fro); if r_pri eps_pri r_dual eps_dual break; end end这个框架相对简洁但实际工程中还有很多细节需要注意下面细讲。4.2 子问题的YALMIP建模细节在solve_subproblem.m中我采用YALMIP建模然后调用Gurobi或CPLEX求解。只需要多微网中一个微网的局部优化问题建模代码function [P_grid, P_DE, P_ch, P_dis, P_exchange, obj_val, SOC] ... solve_subproblem(i, lambda_i, z_i, rho, data) T data.T; Delta_t data.Delta_t; % 决策变量 P_grid sdpvar(T, 1); P_DE sdpvar(T, 1); P_ch sdpvar(T, 1); P_dis sdpvar(T, 1); P_exchange sdpvar(T, 1); SOC sdpvar(T1, 1); % 目标函数本地成本 ADMM拉格朗日项 objective 0; for t 1:T objective objective data.spot_price(t) * P_grid(t) * Delta_t; objective objective (data.a_DE(i) * P_DE(t)^2 data.b_DE(i) * P_DE(t) data.c_DE(i)) * Delta_t; objective objective data.c_ess(i) * (P_ch(t) P_dis(t)) * Delta_t; objective objective data.carbon_price * (data.alpha_grid * P_grid(t) data.alpha_DE * P_DE(t)) * Delta_t; % ADMM拉格朗日增广项对交互功率进行正则化 objective objective lambda_i(t) * (P_exchange(t) - z_i(t)); objective objective (rho/2) * (P_exchange(t) - z_i(t))^2; end % 约束 constraints []; constraints [constraints, SOC(1) data.SOC_init(i)]; constraints [constraints, SOC(T1) data.SOC_end(i)]; for t 1:T % 功率平衡 constraints [constraints, data.P_PV(i,t) P_DE(t) P_dis(t) P_grid(t) P_exchange(t) data.P_load(i,t) P_ch(t)]; % 上下限 constraints [constraints, 0 P_grid(t) data.P_grid_max(i)]; constraints [constraints, 0 P_DE(t) data.P_DE_max(i)]; constraints [constraints, 0 P_ch(t) data.P_ess_ch_max(i)]; constraints [constraints, 0 P_dis(t) data.P_ess_dis_max(i)]; constraints [constraints, -data.P_exchange_max(i) P_exchange(t) data.P_exchange_max(i)]; % 储能SOC动态 constraints [constraints, SOC(t1) SOC(t) data.eta_ch(i) * P_ch(t) * Delta_t - P_dis(t) * Delta_t / data.eta_dis(i)]; constraints [constraints, data.SOC_min(i) SOC(t) data.SOC_max(i)]; end % 求解 options sdpsettings(solver, gurobi, verbose, 0); optimize(constraints, objective, options); obj_val value(objective); P_grid value(P_grid); P_DE value(P_DE); P_ch value(P_ch); P_dis value(P_dis); P_exchange value(P_exchange); SOC value(SOC); end需要注意在这个子问题中目标函数里的二次项(rho/2) * (P_exchange(t) - z_i(t))^2是凸的整个问题仍然是凸二次规划如果是线性目标的话就是线性规划Gurobi求解非常快。4.3 全局变量的更新方式值得推敲在第2步更新全局变量 z 时我选用了z(t,:) P_exchange(t,:) - mean(P_exchange(t,:))这个形式。为什么这么改因为全局耦合约束是Σ_i P_exchange(i, t) 0这个约束等价于说所有微网交互功率的平均值必须为零。ADMM中全局变量 z 是对每个微网交互功率的目标值而要让全局之和为零可以证明最优的 z 是把每个微网的 P_exchange 减去它们的平均值也就是说让 z 在满足零和约束的前提下尽可能接近 P_exchange。如果你用的是“公共母线”模型而不是“成对交互”模型这种z更新方式跟标准的ADMM形式略有出入但思路是一样的都是把全局耦合约束投影到可行域上。这里一个小技巧是如果想保留标准ADMM的形式可以定义全局变量为交互功率的负值即从母线视角看然后让微网i的P_exchange和全局变量的第i个分量相等这样更新方式会稍微复杂一点但思想完全一致。4.4 收敛判据的设置不要只盯原始残差ADMM的收敛判据一般有两个原始残差primal residual和对偶残差dual residual。原始残差的定义是r_pri || P_exchange - z ||_F它衡量的是微网实际的交互功率与全局协调器期望值之间的偏差。当这个值趋近于0说明各微网的决策已经满足全局功率守恒约束。对偶残差的定义是r_dual ρ * || z - z_prev ||_F它衡量的是全局变量 z 在相邻两次迭代中的变化。当这个值趋近于0说明对偶变量已经收敛到稳定值。实际的收敛条件通常同时要求这两个残差都小于各自的容差eps_pri sqrt(N*T) * eps_abs eps_rel * max(norm(P_exchange, fro), norm(z, fro)) eps_dual sqrt(N*T) * eps_abs eps_rel * norm(lambda, fro)其中eps_abs和eps_rel是绝对容差和相对容差一般取eps_abs 1e-4和eps_rel 1e-3。如果对精度要求不高可以放宽到1e-3和1e-2迭代次数会明显减少。实测经验是迭代前期原始残差下降很快但后期会进入缓慢收敛区间对偶残差则可能出现波动。这种情况下要适当放宽对偶残差的容差否则迭代次数会爆炸。5. 算例设计、参数调试与结果分析5.1 典型算例参数我用来验证的算例是3个微网、24小时运行周期时间间隔取1小时。三个微网的负荷和光伏曲线故意设置成不同的特征微网负荷峰值(kW)光伏容量(kW)储能容量(kWh)是否有柴油机MG11208060有MG2906040无MG315010080有MG1负荷白天较低、晚上较高光伏在中午有富余MG2负荷相对平稳光伏不太够MG3负荷最大光伏容量也大。这种差异化设计能让微网之间有明显的交互需求。关键参数设置向电网购电价格峰时1.2元/kWh10:00-15:0018:00-21:00谷时0.4元/kWh23:00-次6:00平时0.8元/kWh电网购电碳排放因子0.6 kg/kWh柴油机碳排放因子0.9 kg/kWh碳价0.2元/kg各微网交互功率上限50 kW惩罚参数 ρ 0.015.2 惩罚参数ρ的变化规律论文里不会直接告诉你的调参逻辑ρ 是ADMM里最让人头疼的参数。ρ 太小对约束违反的惩罚不够迭代收敛慢ρ 太大对偶变量更新幅度小也会导致收敛慢而且会让子问题数值病态。实际操作中我的经验是首先固定一个 ρ跑一遍看收敛曲线如果原始残差下降太慢增加 ρ乘以10如果对偶残差波动大、或者原始残差出现振荡减小 ρ除以10调两三轮之后再在同一个数量级内微调一个更高级的做法是自适应调节 ρif r_pri 10 * r_dual rho rho * 2; elseif r_dual 10 * r_pri rho rho / 2; end这个策略在文献中叫residual balancing实际效果确实好能省下不少手动调参的时间。但要注意ρ 的动态变化会影响收敛性证明的前提条件所以有时候为了理论严谨性论文里还是用固定 ρ实际调试时才用自适应策略。5.3 迭代过程的行为特征在3微网算例中ADMM迭代次数大约在200到500次之间收敛取决于 ρ 和容差设置。从迭代过程可以看到几个有趣的规律第一个特征是前期交互功率变化剧烈。前50次迭代里P_exchange从初始值0跳到较大的交易值然后再慢慢回调这个过程对应的是各微网在寻找合适的交易平衡点。第二个特征是目标函数下降速度远超ADMM收敛速度。微网总运行成本在第50次迭代就基本稳定了但P_exchange和 z 的一致性还要再迭代几百次才达标。这说明如果只关心最终成本可以大幅度提前终止迭代。第三个特征是对偶变量的演变反映电价信号。微网 i 与公共母线之间的交互功率对应对偶变量 λ_i(t) 在迭代收敛后的值非常接近该时段交互功率的边际成本。把 λ 画出来就能看到一天24小时不同时段的“影子电价”——这个值比固定交易电价更有参考价值。5.4 结果对比与集中式最优解的差距用ADMM解出来的分布式结果和集中式优化把所有微网放进同一个模型的结果做个对比指标集中式优化ADMM分布式偏差总运行成本(元)5312.65320.30.15%总碳排放量(kg)2186.42190.10.17%微网间交互电量(kWh)186.2184.70.8%ADMM在收敛到容差范围内时总成本和总碳排放量与集中式解法的偏差控制在0.2%以内这个精度在实际工程里完全够用。交互电量的偏差稍大一些是因为交互功率的优化面相对平坦微小的成本差异对应较大的功率变化属于正常现象。从成本构成来看加入碳排放成本之后系统购电比例下降柴油机出力被压得更低储能使用率上升。碳价从0涨到0.5元/kg的过程中总碳排放量下降约15%而总成本上升约6%。这个趋势验证了碳定价对调度行为的引导作用。5.5 不同碳价下的交互行为变化碳价变化对微网间交互功率的影响很有意思。碳价较低时0.05元/kg各微网更倾向于直接从电网购电因为电网电价的峰谷差足够大微网间的交互意愿不强。碳价升高后0.3元/kg购电的间接碳排放成本增加有富余清洁能源的微网光伏多的MG3更愿意把电卖给其他微网而不只是自己消纳或卖给电网。这种变化可以通过对比不同碳价下各微网的P_exchange曲线看出明显的差别。实际操作中我建议把碳价变化做成敏感性分析可以画出“碳价-总成本-总排放”的帕累托前沿很有说服力。6. 我在实际调试中踩过的坑和解决方案6.1 YALMIP建模时二次函数导致的求解器选择问题第一次建模时我在目标函数里直接写了柴油机的二次成本项(a * P_DE^2)这是很常规的操作。但当我把子问题交给Gurobi求解时Gurobi报了一个无法识别二次约束的警告。原因在于我同时用了norm或其他非光滑函数导致YALMIP识别出的模型类别不是标准的QP。排查之后发现是某一处写成了绝对值目标而不是平方YALMIP会尝试把模型转成MILP跟二次项冲突。解决办法是尽量使用二次项直接表达不要用绝对值形式如果必须用绝对值可以用引入辅助变量的方式手动线性化。这类问题排查起来需要耐心看YALMIP的model classification报告在求解之前可以先执行checkset(constraints)扫一遍模型是否有问题。6.2 SOC变量初始化不当导致的迭代发散ADMM迭代初期如果SOC初值设置不合理比如SOC(1)设成0.8但SOC约束的范围是[0.2, 0.9]第一个时段功率平衡时发现可用储能容量太小P_ch 被限制得很厉害子问题的最优解会偏向一个极端值。这个极端值通过 z 的更新传给其他微网引起交互功率的连锁反应导致迭代发散。解决方法是给储能设置更合理的初始SOC比如0.5第一个迭代周期内不要急于收敛增加一个迭代次数上限的兜底可以把SOC初始约束放宽先让功率分配跑通再加入终点SOC约束6.3 全局变量更新的“平均投影”需要小心边界在更新 z 的时候我最初写的是直接取所有微网交互功率的平均值再用这个平均值修正每个微网的 z 值。但有一个边界情况如果某个微网的交互功率达到了上限50kW而其他微网还有余量单纯用均值修正可能会导致某些微网的 z 超过其交互功率上限但 z 本身并不受上下界约束z 是一个松弛的参考值真实功率才受约束。最后迭代收敛后所有 P_exchange 都在范围内但如果中间过程中 z 超限会影响 λ 的更新速度。解决办法是在更新全局变量时对 z 也做一个投影限制在交互功率的上下限范围内。虽然理论上 z 不需要投影但实践中投影后收敛更快也更稳定。6.4 并行计算的实现方式和收益分布式优化最吸引人的一点是可以并行。在Matlab中最简单的方式是用parfor替代for i 1:N的循环。这是个小改动但前提是每个子问题不能共享变量solve_subproblem函数的输入输出要明确。实测下来3个微网并行相对串行提升不明显瓶颈在数据拷贝和通信开销。但把微网数量增加到10个、20个时并行收益就明显了。如果有条件配合MATLAB Parallel Computing Toolbox迭代循环内最好只并行子问题求解部分全局变量更新和对偶变量更新保持串行因为那一步依赖上一轮所有微网的结果。6.5 数值容差的设置直接决定迭代次数Gurobi和CPLEX各自有内部数值容差如果设置得太紧比如MIPGap、OptimalityTol都要求1e-9子问题求解时间会显著增加而ADMM外部的收敛容差是1e-4级别子问题求解精度根本不需要那么高。可以把求解器容差适当放宽到1e-6整体计算时间能缩短30%以上而最终结果完全不受影响。碳价、碳排放因子的单位换算也是容易出错的地方。常见的错误是把碳排放因子用kg/kWh和g/kWh混用最后算出来的碳排放量差1000倍在目标函数里占的权重完全不同收敛行为也会千差万别。建议所有单位统一为kW、kWh、kg、元的组合在输入数据文件里做好注释。7. 拓展方向从固定碳价到动态碳价、从确定性到随机性7.1 动态碳价的建模思路前面所有的算例都假设碳价是固定值但实际碳市场中碳价是波动的。把碳价处理为分段变化的参数甚至随机变量会让模型更贴近实际。动态碳价下微网间的交互功率会更加频繁地变化因为碳价高的时候清洁能源多的微网的议价能力更强。在ADMM框架里动态碳价不需要改变算法结构只需要把碳价参数从标量改成时间序列数组子问题内部按时段带入碳价即可。但如果碳价本身带有随机性或预测误差就需要引入鲁棒优化或者随机规划的扩展框架了。7.2 考虑光伏出力不确定性的扩展在实际运行中光伏预测误差是不可避免的。可以把确定性模型扩展为两阶段随机规划第一阶段决定微网间交互功率的交换计划和储能基础运行点第二阶段根据光伏出力的随机场景调整各微网内部的出力分配这个扩展在ADMM框架下也能做只是每个子问题从确定性问题变成两阶段随机优化问题计算量会显著增加。常用处理方法是使用场景法生成若干个光伏出力场景然后每个场景单独做功率平衡目标函数取所有场景的期望成本。7.3 更多的分布式算法对比实验除了ADMM建议在同一套Matlab算例上还可以对比一下下面几种方法一致性ADMMConsensus ADMM没有中央协调器微网间通过通信网络达成一致。适合通信拓扑不是星型的场景。广义目标级联分析法ATC用罚函数处理耦合约束层级结构更清晰但如果罚参数选不好收敛性不如ADMM。完全分布式原始对偶算法如分布式次梯度法对通信和步长更敏感但代码简单适合作为对比参照。这种多算法对比实验做出来论文的贡献点会更充实也可以从计算时间、迭代次数、通信信息量三个维度做公平对比。多微网电能交互配合碳排放约束是一个非常典型的“全局耦合局部异构”的优化问题。ADMM在这个场景下的表现我给一个比较中肯的总结实现难度适中、收敛性有保障、对信息隐私友好、结果精度高是目前工程和学术两端都很稳妥的选择。如果这个项目接下来要继续扩展我会优先考虑做动态碳价和光伏不确定性的鲁棒版本因为这两块在实际工程中的需求最大算法扩展路径也比较清晰。
返回列表