去年做配电网故障恢复系统的时候客户那边给我留了个印象挺深的场景一条10千伏馈线差出故障变电站开关跳闸下游一大片商户和居民楼都停了电。调度员对着配网图一条条看联络开关靠经验估算哪些负荷能转出去折腾了快四十分钟才给出方案中间还因为两台配变容量不够被现场驳回过一次。后来我们基于粒子群算法做了一套故障重构辅助决策模块同样场景下十几秒就能算出一组满足安全约束的开关组合供电恢复范围还比人工方案多覆盖了两个台区。这篇文章就围绕这场“智能自救”展开说说配电网故障重构问题怎么建模、粒子群算法如何落地以及我在仿真和工程实践中踩过的那些坑。适合刚接触配电网优化的同学、做调度自动化系统的工程师还有想了解元启发式算法实际应用的算法岗朋友。1. 先搞清楚故障重构到底在“重构”什么东西1.1 配电网的运行方式和故障后的“自救”逻辑配电网和输电网最大的区别在于输电网一般是网状结构、各种环网而配电网通常设计成闭环但实际运行中开环运行。什么意思呢就是从变电站出来的一段段线路中间会设置很多分段开关这些开关平时是闭合的而在不同馈线之间、变电站之间还有一些联络开关这些开关平时是打开的。整个配电网就被这些常开、常闭开关切成一棵棵“树”保证每个负荷都只从一个电源方向获取电能。一旦某处发生永久性故障比如电缆被施工挖断、架空线被雷击变电站出口断路器会先跳开把故障电流切掉。紧接着保护人员要找到故障点然后拉开故障点两侧的分段开关把故障段隔离出来。到这里其实只完成了一半工作——隔离只是不让故障扩大但故障点下游原本由这条馈线供电的非故障区域还在停电这些用户能不能恢复供电取决于能不能通过合上某些联络开关、拉开某些分段开关把负荷“转移”到其他正常的馈线上。这个重新组合开关状态的过程就叫故障重构。它恢复的不只是“电有没有”——还得看目标馈线能不能带得动电压能不能满足要求合环会不会引起保护误动开关动作次数会不会太多。本质上这是一个把全部负荷重新分配到若干正常电源下的组合优化问题。所谓“智能自救”就是让算法代替人工去飞快地试出那个最优的开关组合让配电网在被故障打击之后能自己找到一种新的运行方式。1.2 为什么人工方案往往做不好这件事这里我想多说一句因为我见过太多调度员对算法的不信任。他们觉得我自己干了二十年哪条线能转、哪个开关不能动心里门儿清你一个程序能比我强事实上在小网架、单故障的情况下人工经验确实够用。但配电网的规模一大问题马上就失控了。一个中等规模的配电网络分段开关联络开关加起来可能达到几十甚至上百个每个开关的状态只有“开”和“关”两种理论组合数就是2的开关数量次方。人工只能在脑子里根据几条主干联络线去尝试几个少数方案覆盖面非常有限。而且人工评估一个方案的时候最多看看电流容量够不够很少会重新算一遍完整潮流因此经常出现“电压掉得厉害、末端用户其实没法正常用电”这种表面恢复、实际没恢复的情况。换句话讲故障重构的搜索空间是离散、高维的目标函数里面又有潮流约束、电压约束、辐射状约束这些非线性、强耦合的限制。这类问题用枚举或者线性规划会非常吃力而粒子群算法这种基于种群智能的元启发式方法恰恰适合在巨大的组合空间中快速找到较优解。它不保证全局最优但保证在可以接受的时间里给出一个可行且明显优于人工经验的方案——工程上这就够了。2. 粒子群算法凭什么能接下这个“重构”的活2.1 鸟群觅食模型个体经验与群体信息的一场协作粒子群算法的核心思想讲出来很好接受。设想有一群鸟在一片区域里找食物食物分布在哪谁也不知道每只鸟只知道当前位置的食物浓度有多高。最笨的方法是每只鸟在自己附近一寸一寸地找但聪明一点的做法是鸟群内部互相通报信息每只鸟既往自己曾经找到过的最好位置飞也参考整个群体目前发现的最好位置飞同时再保留一部分自己探索新方向的意愿。放到算法里每个“粒子”就对应一个候选解即一组开关状态。每个粒子在搜索空间中有一个位置向量和一个速度向量。每一轮迭代粒子根据三个信息更新自己的位置粒子自己历史最优位置叫做个体极值 pBest整个种群目前找到的最优位置叫做全局极值 gBest自己上一轮的速度也就是惯性。标准的速度更新公式大家都很熟了v(t1) w·v(t) c1·r1·(pBest - x(t)) c2·r2·(gBest - x(t))x(t1) x(t) v(t1)其中 w 是惯性权重控制粒子保持原有飞行趋势的程度c1、c2是学习因子分别控制向个体极值和全局极值学习的强度r1、r2是 [0,1] 均匀分布的随机数给搜索引入随机性。这个公式妙就妙在粒子既不会一直闷头按自己的路线走也不会一窝蜂全被当前最优解带走而是在探索和收敛之间维持一个动态平衡。2.2 配电网故障重构里PSO比遗传算法和模拟退火好在哪我在早期调研阶段其实对比过三种元启发式算法遗传算法GA、模拟退火SA和粒子群算法PSO。说实话它们都能做但工程实现的舒服程度差很多。算法主要机制配电网重构里的典型问题我的评判遗传算法选择、交叉、变异二进制串编码容易产生大量不可行解交叉变异算子对拓扑约束破坏严重需要频繁修复实现比较繁琐可用但代码量和参数调试成本高模拟退火单点邻域搜索按概率接受劣解搜索效率偏低对初值敏感大规模网络容易卡在局部并行能力弱不适合在线场景粒子群算法速度-位置更新群体信息共享没有复杂遗传算子编码方式可以采用基于“基本环”的整数编码天然规避辐射状约束实现简单收敛速度快综合性价比最高这不是说PSO完美无缺它在处理高维离散问题时容易早熟收敛也需要对连续空间的速度公式做离散化改造。但坦率讲配电网故障重构的目标函数本身就存在很多局部最优任何算法都只能逼近。相比GA那一堆交叉概率、变异概率、种群代沟等参数PSO需要调的参数只有惯性权重和两个学习因子上手难度低太多了。所以我的结论是如果团队没有深厚的算法定制能力优先选PSO做基座后续再叠加热重启、混沌初始化这些改进策略性价比最高。3. 故障重构的数学模型目标函数和约束不是一回事3.1 目标函数多目标怎么揉成一个可优化的量先明确一点故障重构想追求的事情有多个。一是失电负荷最小。故障隔离之后还有多少负荷没恢复这是供电可靠性的直接指标。算配电网恢复方案时最先要保证的就是“能多恢复一户是一户”。二是网损最小。恢复供电不是把开关随便合上转供路径越长线路损耗越大经济性越差。三是开关动作次数最少。调度员最反感那种理论上很漂亮、却要求现场人员连续操作几十个开关的方案。每次合分操作都有误操作风险检修人员来回跑也耽误时间。四是电压质量尽量好恢复后所有节点电压不能越限最好还能离额定值近一些。工程上通用的做法是线性加权求和把多目标转成单目标F w1·P_unrecovered w2·Ploss w3·N_switch w4·V_deviation其中 P_unrecovered 表示未恢复负荷的有功功率总和Ploss 表示网络有功损耗N_switch 是开关动作次数原状态和重构后状态不同的开关数V_deviation 是所有节点电压偏差的某种累加。这里权重的取值需要结合供电局的考核指标来定如果是迎峰度夏保供电项目失电负荷的权重就要调高如果客户很看重调度操作安全开关动作次数的权重就要加大。我个人建议权重先正常拍一组然后拿历史故障案例反推校验比直接闭门造车靠谱得多。3.2 约束条件辐射状约束才是真正的“大boss”目标函数决定方案“好不好”约束决定方案“能不能用”。故障重构里约束条件不少我按重要性排个序。第一层是潮流平衡约束。恢复后的网络必须满足有功、无功平衡也就是发电出力和负荷消耗在各节点上要守恒。这个约束本身不是不等式但它决定了后续电流、电压的计算基准。第二层是节点电压约束。中国配电网一般要求10千伏系统电压偏差在额定电压的±7%以内也就是10.5千伏左右到9.3千伏左右。光伏/风电接入后部分地区还要考虑电压波动。这一条是硬约束算出来超限直接判为不可行解。第三层是支路容量约束。每条线路和每个开关都有额定载流量转供路径不能超过设备允许电流。尤其要注意的是夏季负荷高峰期线路裕度很小方案很容易卡在这个约束上。第四层是最容易被新手忽略、也最容易出问题的辐射状约束。配电网正常运行时不允许出现环网也不允许出现孤岛除非是计划性的微网孤岛运行。数学上网架必须是一棵连通的树或者若干棵连通的树每个电源带一片树状负荷。很多同学在实现PSO的时候用一串二进制位来表示所有开关的状态0代表断开1代表闭合然后跑去算潮流。结果算出来的网络可能带着环或者有一堆孤岛最后发现大部分粒子都是不可行解算法完全没法收敛。我在后面第5节会专门讲怎么通过编码设计来规避这个问题这里先记住一句话辐射状约束不是靠罚函数“罚出来”的而是要靠编码设计从一开始就“不产生”环和孤岛。4. 粒子群故障重构的工程实现编码、流程与参数4.1 编码设计从二进制到“基本环整数编码”刚开始做这个项目的时候我用的也是二进制编码。每个粒子是一串0/1长度等于开关总数量。测试下来发现效果很差原因有两个一是搜索空间太大一个100个开关的网络就有2的100次方种组合粒子群体几千个撒进去跟大海捞针一样二是可行性太差粒子更新一步之后开关状态一变拓扑结构就乱了随便一查不是成环就是孤岛。后来我换成了基于基本环的整数编码。这个方法在配电网重构的论文里很常见思路其实不复杂对每次闭合一个联络开关形成的网络网络里会形成一个唯一的环这个环就叫基本环。为了让网络恢复辐射状每个基本环里至少要有一个开关断开。假设网络里有m个联络开关那么一次完整的重构需要把网络分成若干个连通树一般要保证断开的开关数量和基本环数量有一定对应关系。具体编码方式是这样的不直接给每个开关编0/1而是给每个基本环编号粒子的每个维度存储“该环中哪一个开关被选为断开的开关”。这样一来每个环天然保证断开一个开关成环的问题从编码层面就被消灭了一大半。剩下的孤岛和连通性问题再通过潮流前的一个连通性检查函数来处理。这样做的效果立竿见影同样的种群规模二进制编码的可行解比例可能不到5%而整数编码的可行解比例可以拉升到50%以上。编码是影响元启发式算法实用性的第一因素这一点我怎么强调都不为过。4.2 完整流程从故障信息输入到恢复方案输出我把整套流程按工程实现的顺序整理一遍方便大家直接照着搭输入网架拓扑数据和实时负荷数据确定故障位置并完成故障隔离生成当前停运状态下的非故障失电区域。建立基本环列表。预先把网络中闭合联络开关后可能形成的基本环求出来作为粒子编码的字典。初始化种群。种群规模一般取20到60个粒子按整数编码随机生成初始位置同时限制断开的开关尽量在失电区域的边界附近提高初始解质量。对每个粒子解码成具体开关状态组合先执行连通性检查再调用潮流计算模块计算目标函数F值。更新每个粒子的pBest和种群的gBest。如果当前解不可行直接给一个较大的惩罚值保证后续更新不会偏向不可行区域。按PSO速度位置公式更新粒子。由于编码是整数型的这里把速度映射为“位置是否发生变化”的开关概率常用的做法是用sigmoid函数把速度转成概率再按概率决定是否切换当前断开的开关编号。迭代循环直到达到最大迭代次数或gBest连续50代不再变化。输出最优开关组合、恢复区域列表、节点电压分布和预计网损生成调度操作票草稿。这个流程里最容易忽视的就是第4步的顺序。先连通性检查、后潮流计算能节省大量不必要的时间开销因为孤岛或环路方案的潮流本来就没有物理意义。4.3 参数怎么设我实测下来比较稳的一组取值粒子群算法的参数没有“绝对最优”一说但基于我在多个测试算例IEEE 33节点、IEEE 69节点以及一个实际118节点配网模型上的对比实验可以给出一组很稳的起步参数种群规模30到60。太小容易早熟太大计算时间长且收益递减。最大迭代次数200到500。PSO收敛很快一般的配电网算例在200代以内就能收敛。惯性权重 w建议采用线性递减从0.9降到0.4。前期大权重强调探索后期小权重强调局部精修比固定值0.7效果明显更好。学习因子c1 2.0c2 1.5。让粒子初期更多参考自身经验避免种群里某个早期次优解把大家全带偏。速度上限 Vmax限制每次更新改变的维度数量一般设置为编码维度数的10%到20%。没有上限的话粒子会在解空间里来回乱跳。另外我强烈推荐在前期加入“离散扰动”机制每迭代几十代随机把部分粒子的某些维度重新初始化。这个简单操作对跳出局部最优非常有效算是我自己加的私货效果比那些花哨的混沌映射还好用。5. 实际项目中的坑从仿真到真机踩过的雷5.1 辐射状约束检查数闭合开关个数根本不够前文说了我倡导在编码层解决环的问题但连通性问题还是躲不掉。最常见的错误是有人写闭合开关数 节点数 - 电源数就认为网络是辐射状的。这个条件只是“必要不充分条件”——一个带孤岛的网络闭合开关数也可能碰巧满足这个等式。比如一条馈线首端断开后面带一个变电站的负荷整个区域通过联络开关从另一条馈线得电但原馈线上还有一段独立的小负荷岛这个小岛和主网没有任何电气连接。从开关数量上看可能刚好满足“树”的边数条件但网络根本不连通。正确做法是解码开关状态后先用深度优先搜索DFS或广度优先搜索BFS从每个电源节点出发遍历标记所有能到达的节点。遍历完后如果网络中还有未标记的带电负荷节点就说明存在孤岛方案直接判不可行。这一步计算量不大但必须放在潮流计算之前。5.2 潮流算法选择前推回代和牛顿法的边界配电网重构里最常见的是前推回代法实现简单、收敛性好对辐射状网络特别友好。我一开始直接用这个后来系统里接入了分布式光伏和一个并网储能电站一下就出问题了前推回代法处理PV节点需要特殊处理不然总是算不收敛或者算出来电压虚高。后来我换成了牛顿-拉夫逊法。节点类型处理得更通用对弱环网也有一定容忍度。代价是对初值敏感初始化不好容易发散。我的解决办法是把两种算法都封装起来用网架结构自动选择纯辐射状无分布式电源的用前推回代有PV节点或闭环校验用牛顿法。这不是什么高端技巧但工程上很实用——不要指望一个算法打天下。5.3 最优解不等于可用方案开关动作次数的“现实暴力”这是我认为最值得拿出来说的一个坑。算法给出的全局最优解从数学角度非常漂亮恢复所有失电负荷、网损最小、电压全合格。但仔细一看这个方案需要操作18个开关也就是现场有两种选择要么派好几组检修人员同时赶赴不同开关位置操作时间大大增加要么让一组人跑断腿。调度员拿到这种方案的第一反应一定是拒绝还会顺便质疑你这个系统到底靠不靠谱。所以我在目标函数里把开关动作次数的权重提得很高并且增加了一个上限约束例如“恢复方案中开关动作次数不得超过8次”。如果发生了求不出解的情况再放开这个上限但至少要给出“原因说明”让调度员知道多操作的几个开关换来了多少恢复收益。后来我们更进一步采用两阶段策略第一阶段先求一个动作次数最少的快速恢复方案目标是让尽可能多的负荷尽量快地恢复供电第二阶段在已恢复的基础上再考虑是否需要继续优化网损和电压如果收益不显著就不动。这套策略上线后调度员对系统的采纳率明显提高因为他们看到的是符合现场经验的“活儿少、恢复多”的方案。6. 从离线仿真到在线辅助决策工程师视角的落地思考6.1 算得快不够还得算得稳在线重构的工程约束实验室里跑一个粒子群算法几秒钟出结果很兴奋。但到了真实调度自动化系统里情况完全不一样。故障重构模块要接入实时数据总线读取SCADA采集的开关状态、负荷曲线、设备参数还要在故障隔离后第一时间启动计算并且要求在秒级到分钟级内给出方案。这里我给一个非常实际的建议不要指望在线实时跑一遍完整的PSO。我们做的系统里预先离线计算了大量典型运行方式的故障预案比如冬季大负荷、夏季大负荷、某条馈线检修方式等等。故障发生时先匹配最接近的预案再用粒子群算法做局部修正相当于把“冷启动”变成“热启动”。这样算法只需要在预案基础上搜索少量开关状态变化速度和稳定性都能大幅提升。另外如果网络规模实在太大可以按变电站或馈线区域做解耦故障重构时先分析故障点所在的供电分区只在受影响的分区及其联络馈线范围内搜索不全局重算。这个策略能把搜索空间缩小一个量级。6.2 分布式电源接入后故障重构从“恢复供电”变成“恢复最优运行”现在配电网里光伏、储能、小型燃机越来越多电源不再只是变电站这侧的一个方向了。故障重构的模型也要跟着升级分布式电源在孤岛状态下能不能继续带负荷涉及微电网孤岛运行策略并网状态下的输出功率如何和网架重构协同优化涉及多时段优化和不确定性处理。粒子群在这里依然有空间但建议对每个粒子的适应度评估加上时序仿真因为光伏出力随风和云实时波动不能只算一个静态点。我们现在的做法是把一天的出力曲线离散成96个时段故障重构时计算每个时段的潮流再累加形成目标函数。计算量大不少但这是新型配电网绕不开的需求。6.3 系统能否被调度员接受往往取决于“解释能力”最后说一个很多人不重视但非常重要的事情算法输出一个方案调度员凭什么信你如果只有一个“最优开关组合”的数字结果没有中间过程调度员很难真正用起来。我们在软件界面上加了一版类似“建议与理由”的辅助信息例如本方案优先恢复了哪几个台区的供电哪一条馈线预留了多大裕量为什么不转到某开关如果动了某个开关会有什么风险。这部分其实不是粒子群算法的核心但却是项目真正落地的“最后一公里”。我的体会是智能优化算法输出的是解但调度员需要的是决策建议加可追溯的依据。把粒子群的搜索结果翻译成调度员能看懂的操作逻辑比优化算法本身还要花心思。做这个项目前后也有一年多的时间要说最大的收获倒不是粒子群算法本身多么强大而是我意识到对一个组合优化问题来说数学模型的正确性大于算法的花哨程度编码设计的合理性大于参数调优的精细度约束条件的处理可行性大于收敛速度的追逐。现在你如果让我评估一套故障重构方案能不能用我可能不会先问“你用的什么算法”而是先问“你的编码产生不可行解的概率有多高、约束检查在不在潮流之前、开关动作次数有没有跟调度员确认过”。粒子群算法确实帮我们解决了一个实际的问题但真正让它好用起来的是围绕算法做的那一圈工程化细节。
阅读完成 · 觉得有帮助?