我最近两年主要精力基本都压在基于串行并行ADMM算法的主从配电网分布式优化控制上。之所以盯上这个方向,纯属被现场逼的。分布式光伏渗透率一上来,配电网的电压越限、线路重载问题就开始冒头;而真要做一个全网优化控制,数据分散在不同系统、不同台区,连基本模型都对不齐,集中式优化根本算不动。后来我把目光转到了分布式优化控制,用ADMM把整体问题拆到主从各区域,让每个区域自己算,只在边界交换少量信息。中间把串行和并行两种模式都实现了,也踩了不少坑。
这篇文章我会从算法原理、主从建模、串行与并行实现、参数调优到工程落地的坑,完整拆开讲一遍。适合正在做配电网分布式优化、研究ADMM应用,或者准备把自己手头的大规模优化问题改成分布式求解的工程师和研究生参考,代码思路可以直接拿去做仿真复现。
1. 项目到底在解决什么问题
1.1 集中式优化在大规模配电网里为何先卡住
配电网优化控制传统上走的是集中式路线:把整个馈线的拓扑、负荷、光伏、储能数据汇总到一台主站,建一个全网模型,用商业求解器跑全局优化。小网络时代这没什么问题,可规模一大,三个麻烦会同时冒出来。
首先是数据壁垒。营销系统管用户和分布式光伏,配电自动化系统管开关和潮流,调度系统管主网侧指令,这几个系统的数据往往不在一个物理网络里,甚至不是一个部门在维护。要做全网集中优化,得先把数据全部汇聚到一个模型里,这个前提在现场经常就不成立。
其次是模型规模。一个地级市的配电网动辄几千上万个节点,如果再把三相不平衡、低压台区模型加进去,全局优化模型的变量和约束规模会非常恐怖,商业求解器也未必能在调度周期内给出结果。就算算出来了,网络拓扑一变,全网模型又得重新维护。
还有更硬的限制:实时性。配电网运行状态是时变的,光伏出力和负荷都在波动,优化控制需要分钟级甚至秒级响应。集中式计算把所有任务压在一台主站上,一旦通信或计算出现瓶颈,整个控制周期就废了。分布式优化控制正是在这个背景下被推上前台——每个区域用自己的数据算自己的局部问题,只在边界上交换少量协调变量。
1.2 分布式优化控制为什么绕不开ADMM
分布式优化的语言很简单:把一个大问题切成多个小问题,各自求解,再通过协调机制达成全局一致。但在配电网这种强耦合的物理系统里,切出来的子问题并不是完全独立的,区域之间的联络线功率、边界节点电压天生互相牵扯。
要把这种耦合关系处理好,可选的算法框架其实不多。ADMM(交替方向乘子法)是目前最实用的一种,原因很直接。
第一,ADMM对问题结构的要求相对宽松。子问题只要能写成“局部目标加二次惩罚项”的形式,内部函数可以是非线性的,甚至可以用商业求解器去解。这对电力系统来说特别重要,因为配电子问题里充满了潮流方程、设备上下限、储能SOC这些复杂约束。
第二,ADMM的协调机制非常轻量。每个迭代周期,各区域只需要把边界变量的影子值传出去,拿回一个更新后的全局变量,再更新一轮对偶变量。通信量是KB级别,对现有配电自动化系统的带宽完全友好。
第三,ADMM有比较成熟的收敛性和残差判断体系。原始残差和对偶残差可以分别刻画“区域间一致性”和“最优性”的逼近程度,调参和判断收敛都有明确抓手。对于工程落地来说,这一点比很多黑箱式启发算法靠谱得多。
当然ADMM不是银弹,后面我会专门讲它在配电网应用里的各种翻车现场和对应解法。
1.3 主从结构:从电网拓扑到算法架构的天然呼应
配电网的物理结构天然就是主从式的。一个变电站带多条馈线,一条馈线带若干台区,台区下面再接分布式电源和负荷,层层辐射。通信系统也基本沿这个结构组网,主站和子站之间是上下级关系,子站之间通常不走直接链路。
这种结构落到优化模型里,正好可以对齐ADMM的经典形式:一个主区域当协调者,负责全局变量的汇聚;多个从区域各管各的子问题,负责局部优化。主区不需要知道每个从区的完整数据,从区也不需要把自己的隐私信息上报,两边只在边界上交换“联络线有功、无功、边界电压”这几个有限的量。
从数学上看,这种主从架构也非常自然。全局优化问题可以拆成主区子问题和从区子问题的叠加,它们之间的耦合只在主从联络线边界上。ADMM的全局变量更新由主区完成,从区只负责自身的局部变量迭代,天然就形成了分布式控制闭环。
而且在工程实施上,主从架构意味着改造量最小。主站计算中心可以直接承担协调者角色,各台区边缘计算终端运行从区子问题,通信链路沿用现有主从通信网络,不需要为算法额外搭一套复杂的分布式通信拓扑。
2. 串行并行ADMM的核心原理与设计选择
2.1 ADMM三步迭代:拉格朗日与全局一致思想
不把ADMM的数学骨架讲清楚,后面所有调参经验都会变成玄学。我用最精简的方式描述一下。
我们最终要解的全局问题,可以写成所有区域目标函数的求和,同时每个区域有一组局部变量,并且这些局部变量在边界上要和全局变量保持一致。
min Σ f_i(x_i),s.t. x_i = z, i = 1..N
这里的 z 是全局一致变量,x_i 是各区域在边界上的局部影子变量。注意这个“影子变量”很关键:它不代表区域内部的全部状态量,只是那些需要与相邻区域对齐的边界量。
ADMM的迭代分为三步。第一步,所有区域各自求解自己的子问题:
x_i[k+1] = argmin f_i(x_i) + (ρ/2) * ||x_i - z[k] + u_i[k]||^2
这一步里,每个区域的局部目标函数 f_i(x_i) 是整个分布式优化里最灵活的部分,可以包含网损、成本、惩罚项等。二次项的作用则是把局部变量拉向当前全局变量,同时通过对偶变量 u_i 修正偏差方向。
第二步,主区收集所有 x_i[k+1] 和对偶变量信息,更新全局变量。
z[k+1] = (1/N) * Σ (x_i[k+1] + u_i[k])
对于边界变量来说,这一步就是求平均值,把各区域不一致的地方抹平。
第三步,各区域更新对偶变量:
u_i[k+1] = u_i[k] + (x_i[k+1] - z[k+1])
对偶变量像是一个“记账本”,它记录了这个区域上一次迭代中与全局变量之间的偏差,下一次迭代时用这个偏差去修正子问题的优化方向。
三个步骤循环迭代,直到原始残差和对偶残差都低于阈值。整个过程可以用一个类比来记:每个区域像是一个独立核算的小组,先各自算自己的方案,然后把对外口径统一,算不准的地方通过罚款项一点点修正,最终达成全网一致的运行方案。
2.2 串行ADMM实现:像流水线一样顺序推进
串行ADMM严格按区域顺序更新子问题。假设区域编号1到N,一次完整迭代内,先解区域1,再解区域2,依此类推,直到区域N解完,最后才统一更新全局变量和对偶变量。
这种模式很像流水线:A工位干完,把半成品传给B工位,B工位拿到的是最新结果,干完再传给C工位。后一个区域在求解时,前面区域的结果已经更新过了,这种信息即时性正是串行模式的主要优势。
在配电网场景里,串行模式有个特别吸引人的特点:迭代次数通常会比并行少。原因是区域之间的耦合信息传递更及时,区域A刚算完的边界功率结果,马上就能影响区域B的下一轮子问题,不需要像并行模式那样等一个完整周期。
但代价也很明显:单次迭代的墙钟时间等于所有子问题求解时间之和。如果区域数量多,或者某个区域的子问题时别复杂,整体计算时间会被明显拉长。而且这种模式天然是顺序计算,很难充分利用边缘计算终端的多线程或多机并行能力。
需要强调一点:串行ADMM里对偶变量的更新时机有两种做法。一种是每个子问题解完立即更新该区域对偶变量;另一种是等所有子问题解完再统一更新。前者信息利用更充分,收敛更快;后者实现更简单,和并行代码框架切换更顺。我在实际代码里用的是前者,也就是最常用的Gauss-Seidel式更新。
2.3 并行ADMM实现:像多工位一样同步作业
并行ADMM是标准教科书里ADMM的标准形式。每个迭代周期,所有区域同时求解自己的子问题,全部完成后汇总到主区,更新全局变量,再统一更新对偶变量,进入下一轮。
类比一下就是多个工位上的工人各自独立干活,干完一起把成果交到组长那里,组长统一对账后,再通知大家下一轮怎么干。工位之间不互相直接通信,消息都通过组长中转。
并行模式的优势是单次迭代的耗时基本取决于最慢那个区域。如果各区域计算能力均衡,而且能够真正并行部署,整体计算效率会远高于串行模式。这也是它更适合“每台区一个边缘计算终端”这种架构的原因。
但并行模式有一个隐藏问题:所有区域每轮都要等最慢的那个。如果某台区模型特别大或者边缘终端性能差,它就成了整个算法的木桶短板。更尴尬的是,通信也是一个同步点,任何一条链路抖动,这一轮迭代就只能等待。
ADMM的全局一致性更新在并行模式下数学性质很漂亮,理论收敛性结果更完备,调试起来也更有底气。不过实际工程中“理论标准”不是唯一选择。并行模式要求各区域能同时计算,如果算力资源有限,所谓的并行其实也串行化了,那反而会白白增加通信开销,不如直接上串行。
2.4 串行还是并行:按计算资源与通信条件选择,不搞一刀切
我把两种模式的关键差异整理成一个表,方便大家对照自己的实际场景做选择。
| 对比维度 | 串行ADMM | 并行ADMM |
|---|---|---|
| 单次迭代耗时 | 各子问题耗时之和 | 最慢子问题耗时 |
| 区域间信息更新 | 后序区域可用前序区域最新结果 | 所有区域只能等上一轮结果 |
| 迭代次数趋势 | 区域耦合强时通常更少 | 标准理论框架下稳定 |
| 计算资源要求 | 单台串行也够用 | 要求各区域能真正并行计算 |
| 通信同步压力 | 每一步依赖上一步结果,链路断则卡 | 必须等所有区域回报,同步等待更明显 |
| 典型适用场景 | 区域少、子问题规模差异大 | 区域多、边缘算力均衡 |
在主从配电网里,如果从区数量在3到5个左右,而且各台区的模型规模和求解难度差异较大,我建议优先试串行模式。原因很简单:并行模式下每轮都要等最重的那个区域,如果它本身计算量远大于其他区域,并行带来的收益会被木桶效应吃掉。
如果从区数量超过8个,各台区硬件配置接近,通信链路也稳定,那并行模式大概率是更优解。它能把计算压力摊到多个边缘节点上,整体吞吐能力更强。
还有一个很容易被忽略的点:串行和并行在代码实现上切换起来并不复杂,核心框架一样,只是子问题调度方式不同。我建议项目初期把两种模式都实现,然后在一个固定算例上对比,用数据说话,不要拍脑袋选择。
3. 主从配电网分布式优化控制的建模与实现要点
3.1 配电网分区建模:哪些变量进子问题,哪些变量进协调层
主从配电网的分布式建模,第一个问题就是:区域边界画在哪,哪些变量进子问题,哪些变量进协调层。
区域的划分通常遵循两个原则。第一是电气耦合强度,联络线两侧的功率交互就是耦合所在,把强耦合的环节留在同一个区域内,可以降低协调层的压力。第二是管理边界,一个台区、一个园区或者一条馈线的管理主体相对独立,按管理主体划分不仅符合实际,也便于处理数据壁垒问题。
划分完之后,每个区域内都有自己的局部优化问题。局部变量包括区域内的光伏出力、储能充放电功率、可调负荷调节量、节点电压、支路功率等。进入协调层的则是边界联络线上的关键量,比如:
- 主从联络线有功功率
- 主从联络线无功功率
- 边界节点电压幅值
举个例子,一个从区受上级主区供电的功率,从区的本地模型里会把它作为变量;主区的全局优化模型里也有对应变量。ADMM的协调层通过让这两个值相等,来保证两个区域对联络线功率的理解完全一致。
在代码层,我习惯把边界变量单独抽出来,作为每个子问题里的“影子变量”,和区域内部状态量分开处理。这样做的理由是:ADMM迭代时只需要对边界变量做一致性处理,内部变量可以完全留在线实时求解器里,减少通信和协调的复杂度。
3.2 潮流模型的取舍:优先用SOCP封装子问题
配电网分布式优化的难点,很大程度集中在潮流模型选择上。如果直接用完整非线性潮流方程,子问题就是非凸问题,ADMM的收敛性理论会失去根基,实际迭代时也容易在局部最优附近来回震荡。
我在项目里最终用的是SOCP(二阶锥规划)松弛。DisfFlow方程描述辐射状配电网的潮流关系非常合适,形式如下:
P_j = P_i - r_ij * l_ij - p_jQ_j = Q_i - x_ij * l_ij - q_jv_j = v_i - 2*(r_ij*P_i + x_ij*Q_i) + (r_ij^2 + x_ij^2)*l_ij
配合松弛条件v_i * l_ij >= P_i^2 + Q_i^2,整个潮流约束是凸的,而且对配电网是精确松弛。这样每个子问题都能保持凸优化结构,ADMM外层收敛有了理论保障,内部的潮流精度也够用。
为什么不进一步简化成线性DistFlow?线性化在纯负荷模型里精度尚可,但一旦加入分布式光伏大范围反送功率,还有储能充放电切换,线性模型会低估电压越限风险,优化出来的控制策略执行后往往对实际电压改善有限。SOCP的求解成本比线性模型高一截,但换来的是可靠性,这笔交易在配电网控制里值得。
每个区域内部采用SOCP子问题后,子问题本身用现成的凸优化求解器处理即可。把分布式ADMM外面的迭代框架,和区域内部商业求解器的强大求解能力结合起来,这种“外层分布式、内层集中式”的混合结构是目前工程落地的主流做法。
3.3 ADMM参数标定:rho、松弛因子与停止阈值
ADMM调参是门手艺活,经验值非常重要。下面几个参数是我在几个不同规模算例里反复验证过的。
ρ是步长参数,作用是平衡原始残差和对偶残差的收敛速度。ρ太小,对偶变量每次只走一小步,全局变量更新缓慢,整体迭代次数大幅增加。ρ太大,局部变量被二次惩罚项束缚得太紧,对偶残差会剧烈震荡,甚至出现迟迟不收敛的情况。从工程经验看,配电网分布式优化的ρ可以从5到20之间起步,然后根据残差曲线微调。
更有效的做法是引入自适应ρ。每迭代若干轮,计算原始残差和对偶残差的比例,如果原始残差远大于对偶残差,就把ρ乘一个大于1的系数;反过来就除以系数。这本质上是给ADMM装了一个巡航控制。我实测下来,自适应ρ能让迭代次数在多数算例里减少20%到40%。
松弛因子 α 也很值得利用。全局变量更新时可以加入松弛处理,本质上就是在“完全对齐”和“略微超调”之间找一个更好的平衡点。α在1.5到1.8之间效果都不错,收敛速度通常能提升10%以上。我还是推荐用一个固定值,省心。
停止阈值方面,我一般把绝对容差设在1e-4到1e-3,相对容差1e-4。需要提醒的是,阈值设太严会让最后几十轮迭代都在消除无关紧要的数值抖动,浪费大量计算资源。配电网控制本身就是跟实时性赛跑,该宽松时就宽松。
3.4 边界通信设计:轻量、可靠、有超时兜底
分布式ADMM的上层设计再好,通信环节不处理干净也一样会翻车。边界通信的核心诉求就三条:轻量、可靠、耐受故障。
轻量意味着一次迭代交换的数据量必须很小。主从区域只需要传递边界有功、无功、电压幅值这类标量信息,一个从区通常就是十来个浮点数,按字节算也就几百字节。千万不要在这里传整个区域内所有节点的状态量,那样会把分布式优化的通信优势完全浪费掉。
可靠意味着数据格式和通信协议要稳定。通信协议的选型,如果主站和从区之间走的是配电自动化网络,用MODBUS或者IEC 61850类通信协议更顺;如果是新建的分布式边缘计算网,推荐用轻量级消息总线或者gRPC。我在仿真到半实物联调过程中发现,gRPC在传输稳定性上明显更省心,断线重连和超时控制也更容易实现。
超时兜底非常关键。实际网络中不可能保证每次都同步。我的工程策略是:主区广播全局变量后启动超时计时,如果某个从区未能在规定时间内返回子问题结果,就把该从区上一轮的x值作为本轮x参与全局变量更新,同时给该区域打上标记。这样算法不会因为单点故障卡死,只是该区域的协调精度暂时下降,故障恢复后自动回到正常状态。
4. 实操过程:从仿真到代码实现
4.1 小型主从算例与参数设定
为了把代码逻辑讲清楚,我设计了一个极简的主从配电网算例。主区M代表一个变电站节点,两个从区A和B分别表示两个台区。
- 从区A:含一组光伏,额定出力0.5 MW,一个0.2 MW的普通负荷。
- 从区B:含一个储能系统,额定容量0.3 MW/0.6 MWh,一个0.3 MW的普通负荷。
- 主区M:连接上级电网,可通过联络线向A、B两个从区供电,购电成本系数高于本地新能源发电成本。
边界变量为主区M到从区A、B的两条联络线有功功率,记为 p_A 和 p_B。优化目标是最小化总购电成本加弃光惩罚加储能损耗惩罚。为了让ADMM的收敛过程更直观,我把各区域的目标函数设成了二次函数形式:
f_i(p) = a_i * p^2 + b_i * p
这样就构成一个有N=3个区域、2个边界变量的标准分布式优化问题。别看它简单,ADMM在串行和并行模式下收敛节奏的差异,在这个例子上就能看得清清楚楚。
4.2 并行ADMM的实现:同步收敛主干代码
下面给出并行ADMM的主干伪代码。实际工程中,solve_subproblem对应的是每个区域内部调用SOCP求解器求解局部优化问题,我这里省略了内部模型的完整展开,重点展示协调层逻辑。
def parallel_admm(nodes, edges, max_iter, rho, alpha, eps_abs, eps_rel): # 初始化全局变量z和对偶变量u z = {e: 0.0 for e in edges} u = {i: 0.0 for i in nodes} x = {} for k in range(max_iter): # 第一步:所有区域并行求解子问题 for i in nodes: x[i] = solve_subproblem(i, z, u[i], rho) # 第二步:主区汇聚,更新每个边界对应的全局变量 z_new = {} for e in edges: region_list = [i for i in nodes if e in boundary_edges[i]] z_new[e] = sum(x[i][e] + u[i][e] for i in region_list) / len(region_list) # 第三步:各区域更新对偶变量,alpha是松弛因子 for i in nodes: u[i] = { e: u[i][e] + alpha * (x[i][e] - z_new[e]) for e in boundary_edges[i] } # 收敛判断 r_orig = max( abs(x[i][e] - z_new[e]) for i in nodes for e in boundary_edges[i] ) s_dual = max( abs(rho * (z_new[e] - z[e])) for e in edges ) if r_orig < eps_abs and s_dual < eps_abs: break z = z_new return x, z这个实现里最关键的点是第二步的 z_new 更新。它不是简单把所有x[i]取平均,而是针对每个边界变量e,把与该边界相关的所有区域的对偶变量和影子变量一起求和再平均。这是保证边界一致性的核心公式。
4.3 串行ADMM的实现:逐区域更新代码
串行ADMM的代码和并行版本高度相似,区别只在于更新顺序。串行版本会在每个子问题求解完成后立刻更新该区域相关的全局变量,再继续下一个区域。
def sequential_admm(nodes, edges, max_iter, rho, alpha, eps_abs, eps_rel): z = {e: 0.0 for e in edges} u = {i: 0.0 for i in nodes} x = {} for k in range(max_iter): # 严格按顺序逐个求解子问题 for i in nodes: x[i] = solve_subproblem(i, z, u[i], rho) # 每个子问题解完后,立即更新该区域相关的全局变量 for e in boundary_edges[i]: region_list = [j for j in nodes if e in boundary_edges[j]] z[e] = sum(x[j][e] + u[j][e] for j in region_list) / len(region_list) # 立即更新该区域对偶变量 u[i] = { e: u[i][e] + alpha * (x[i][e] - z[e]) for e in boundary_edges[i] } # 收敛判断同并行版本 r_orig = max( abs(x[i][e] - z[e]) for i in nodes for e in boundary_edges[i] ) s_dual = max( abs(rho * (z[e] - z_prev[e])) for e in edges ) if r_orig < eps_abs and s_dual < eps_abs: break z_prev = z.copy() return x, z注意串行版本每解完一个区域就更新 z 和 u,后续区域进入求解时会直接拿到前面区域的最新结果,这种信息即时性让迭代次数明显减少。但也看到,代码里多了一步z_prev的保存,用于对偶残差计算,这是因为z不是整轮统一更新的,需要单独记住上一轮值。
4.4 实测收敛对比:迭代次数和墙钟时间谁更重要
在4.1那个小型算例上,我分别跑了串行和并行版本,记录到一组非常有代表性的数据。串行模式迭代56轮收敛,并行模式迭代71轮收敛,串行在迭代次数上优势明显,大约少了20%。
但如果看墙钟时间,情况会反转。并行模式的单轮耗时是所有区域同时求解后取最大值,即使迭代次数多,总墙钟时间反而更短。串行模式虽然迭代少,每个区域都要依次等待,总时间更长。
| 指标 | 串行ADMM | 并行ADMM |
|---|---|---|
| 迭代次数 | 约56轮 | 约71轮 |
| 单轮平均耗时 | 约0.9秒 | 约0.4秒 |
| 总墙钟时间 | 约50秒 | 约28秒 |
我在这个算例上得到的结论是:考核指标选“迭代次数”会误导工程决策,真正要优化的是墙钟时间。串行模式适合在“区域个数少但是子问题计算时间差距很大”的场景使用,因为此时并行模式的木桶效应会把这个优势彻底吃掉;并行模式则适合算力均衡、可以真正并行部署的场合。
5. 常见问题与工程排坑记录
5.1 收敛性折腾记录:参数与初始化的复盘
我踩得最深的一个坑是ρ参数选择。最开始在一个12节点的测试系统里跑,ρ取10,结果原始残差下降得挺快,但对偶残差怎么压都压不下去,全局变量在目标值附近来回震荡。当时一度怀疑是ADMM在非凸问题上失效了,后来才发现就是ρ太大惹的祸。
把ρ降到1之后,振荡明显缓解,但迭代次数又暴涨了,跑了200多轮还没收住。最后靠的是自适应ρ方案:每20轮检查一次原始残差和对偶残差比例,偏差超过3倍就调整ρ。这个方案在大多数算例上都能稳定收敛。
初值问题也值得单列一条。ADMM最怕从一个离真解太远的点出发,前期那种来回“拉扯”会消耗大量迭代次数。我建议在每次优化开始前,先用上一次滚动优化的解做热启动。如果系统刚启动没有历史解,就先跑一次相对粗糙的集中式潮流计算,把边界变量初值算出来再进入迭代,效果立竿见影。
5.2 标幺值与边界变量符号:最隐蔽的两个坑
很多人做分布式优化时会忽略标幺值问题。主区用10kV基值,从区用0.4kV基值,两边传给协调层的电压和功率数据如果不统一到同一个基准值系统,ADMM会一直处在“永远收敛不了”的状态。这个问题症状不明显,看起来像参数没调好,实际却存在于建模环节。我的做法是在分区建模阶段就强制约定:所有区域统一用相同的标幺值基准,尤其是边界变量的基准值必须全网一致。
边界变量符号是另一个隐蔽的坑。主区看向从区,功率方向是从主区流向从区为正;从区看向主区,功率方向可能就反过来。两个区域对同一根联络线功率的理解,可能出现符号相反。解决方式是提前定义好“功率正方向”,每个区域的边界变量都按这个方向建模,否则对偶变量更新会在符号上互相打架。
这种问题在仿真里可能因为数值对称而侥幸收敛,但在硬实时场景里一定会暴露。建议写一个脚本,在第一次迭代前自动检查所有边界变量的维度、符号、单位,建立一致性校验。这个检查脚本我后来长期保留,每次新增区域时都会跑一遍。
5.3 通信与并发实现里的实际妥协
我在半实物仿真阶段遇到的主要问题是通信不同步。并行模式要求各从区在同一轮内上报结果,但只要有一个台区的网络延迟稍大,整个迭代就卡在等待状态。最初我用的是严格的同步等待策略,结果某台区一次网络闪断,优化进程直接卡了5分钟,实时控制根本没法接受。
后面改成了超时淘汰+结果预测策略:主区等待超时后,如果某个从区本轮没有返回结果,就用上一轮该区域的结果顶替,同时把该区域的“参与权重”临时置为零。这样虽然会暂时牺牲一点全局一致性,但至少算法不会死锁。
还有一个工程细节:每个区域的子问题求解器要设置内部最大迭代时长,不能任由某个区域在子问题里无限迭代。我通常把子问题求解时间上限设为整体迭代周期的三分之一,超时就返回当前可行解。原因是ADMM外层迭代本身就能容忍子问题的一定偏差,子问题解得太精确,对整体收敛速度的贡献边际效应并不高。
5.4 往MPC、数据驱动方向扩展的可行性
这个项目跑顺之后,我一直在想它还能往哪走。目前比较看好的一个方向是和模型预测控制结合。ADMM作为滚动优化内部的求解引擎,每个控制周期内迭代若干轮,把MPC的多步优化问题分布式求解,这样每个从区都可以在自己的控制终端里完成预测和优化,主区只需协调边界。对储能调度和光伏出力调控这类时变场景很有意义。
另一个可探索的方向是用数据驱动的方法辅助ADMM的初值预测。既然热启动能大幅减少迭代次数,那就可以用历史数据训练一个轻量模型,根据当前负荷、光伏出力和历史边界变量,预测下一轮全局变量的近似值。这样能进一步压缩迭代次数,让分布式控制的实时性更好。
还有就是把主从结构扩展到微电网群。一个主微网带若干子微网,拓扑结构和主从配电网高度相似,ADMM的协调框架几乎可以平移过去。唯一需要额外处理的是微网孤岛切换时的拓扑变化,这会引入离散决策,目前的ADMM框架还不直接支持,需要在上层做模式切换逻辑。
如果让我再从头做一遍这个方向,我会把串行和并行模式在项目第一天就同时建立起来,准备好标准算例和对比脚本。这样当现场实际条件明确时,可以直接通过数据选择模式,而不是靠经验猜测。ADMM的参数ρ也没有一劳永逸的答案,每次换网络结构或者新增一台储能,都可能需要重新标定一次。这些经验真心希望能帮你少折几次腰。