ARTICLE DETAIL

资讯详情

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

基于BPSO的PMU最优配置方案:从可观测性到Matlab实现

基于BPSO的PMU最优配置方案:从可观测性到Matlab实现 1. 项目概述与问题定位做同步相量测量装置PMU配置方案时最常被问到的问题就是电网那么多节点到底装多少台PMU才能把全网状态都看清楚还得花最少的钱。这就是OPPOptimal PMU Placement最佳PMU配置问题。我这次用二进制粒子群优化BPSO在Matlab里把整套方案从建模、编码、适应度设计到仿真验证完整实现了一遍中间踩了不少坑也总结了一些可以直接抄作业的细节今天把可复现的全过程整理出来。先说结论PMU数量和电网可观测性之间是一对矛盾节点装得多数据冗余度上去了但成本和通信压力也大装少了状态估计器可能连全网电压相量都算不出来。最优配置就是找到一个能用最少PMU数量让全网每个节点都可观测的位置组合。这个问题本质上是一个离散组合优化问题暴力枚举在十几节点的系统上还凑合到了IEEE 39节点、57节点甚至上百节点的规模组合数很快就爆炸了。BPSO的优势在于实现简单、对0/1编码天然适配不需要求梯度也不需要问题有好的数学性质拿来跑OPP这种中小规模组合优化特别顺手。这套代码适用的范围很明确电力系统规划人员、做状态估计或者WAMS广域测量系统方向的学生和工程师对PMU布点没有头绪、想快速拿到一组可行解并且验证正确性的场景。不是说要代替商业优化软件而是给你一个能读懂、能改、能在几分钟内跑出结果的基准方案。下面从原理到代码一步步拆。1.1 这到底是个什么问题先花一分钟把问题说透。PMU装在某个母线上之后它能直接测到这个母线的电压相量还能测到和这个母线相连的所有支路的电流相量。由于电流、电压和线路阻抗之间的关系是确定的理论上装一台PMU不仅这个母线本身可观测它相邻的所有母线也能被推算出来。于是问题就变成了在拓扑图上选一组节点安装PMU要求每个节点要么自己装了要么至少有一个邻居装了最终安装数量最少。这正是图论里的最小支配集问题被证明是NP难的。我记得第一次做这个课题时天真地想用穷举法把IEEE 30节点系统的所有组合跑一遍后来算了算C(30,3)、C(30,4)这种组合数量才意识到不现实。所以工程上基本都是用启发式算法BPSO就是其中一个经典选项。需要注意的是这里用的是“拓扑可观测”概念也就是只从图结构判断能不能通过PMU量测推算出节点状态没有考虑量测误差、线路参数不精确、N-1故障等情况。如果后面要做鲁棒性分析还要在这个模型基础上增加约束那个就是进阶玩法了。另一个容易忽略的细节是同一个系统的最优PMU个数可能对应多组不同的位置解。比如IEEE 14节点系统最优数量是3台但有多个不同的三节点组合都能让全网可观测。这就导致我们评价算法时不能只看“找到了几台”还要看它是不是稳定、搜索成功率有多高。后面我用多次独立运行来统计就是出于这个原因。1.2 为什么选BPSO而不是直接穷举或整数规划有人会问OPP本身就是0-1整数规划问题直接用CPLEX、Gurobi或者Matlab的intlinprog解不就行了理论上确实可以如果系统规模不大、约束也简单整数规划求全局最优非常可靠。但实际研究里大家依然大量使用启发式算法原因有几个。第一PMU配置问题经常要叠加各种工程约束比如某些母线不能装、需要满足N-1冗余、通信通道限制约束一多整数规划模型的规模会迅速膨胀第二很多研究者手里的测试系统数据是残缺的或者想快速比较多种算法用启发式做基准更灵活第三教学和二次开发场景下需要能看懂每一步在干什么的代码启发式算法逻辑透明改起来容易。我选BPSO还有一个很实际的理由PMU配置问题天然是二进制编码标准粒子群优化PSO处理连续变量很拿手但变量一旦变成0/1直接套连续版PSO会让粒子飞出有效域。BPSO通过sigmoid函数把连续速度值映射成“取1的概率”再做随机采样更新位置整个框架特别契合这个问题的编码方式。对比遗传算法它不需要交叉、变异算子代码量更少对比模拟退火它又有群体信息共享收敛速度在中小系统上通常更快。当然BPSO也有短板后面第5章我会专门讲它容易陷入局部最优的问题以及我实际用到的几种补救手段。先说清楚它的边界接下来才能把原理和代码对应起来。2. BPSO核心原理与适应度函数设计2.1 从标准PSO到二进制PSO的映射逻辑标准PSO的迭代公式是每个粒子根据自身历史最优pbest和群体历史最优gbest来更新速度然后位置直接加上这个速度。这个机制在连续空间里很好理解粒子像一群鸟在搜索空间里飞速度和位置都是实数。但OPP里的解是一个0/1向量长度为系统节点数第i位是1表示在节点i装PMU是0表示不装。这个时候没有办法直接把速度加到位置上两个粒子的位置相减没有实数意义所以需要把速度这个连续量转换成离散位置更新的概率。二进制PSO的做法是速度仍然按连续形式更新然后对速度做一次sigmoid变换得到位置每一位取1的概率S(v) 1 / (1 exp(-v))然后生成一个0到1之间的均匀随机数如果随机数小于S(v)这个位置就置1否则置0。这样设计的精妙之处在于速度越大取1的概率越接近1速度越小负数取1的概率越接近0中间0附近时概率仍保持50%左右保留了随机探索能力。这个映射不是唯一的有人用双曲正切函数有人用基于绝对值的映射但sigmoid是最常见也是最稳的一种我实测下来没有强烈必要换其他映射函数。Vmax这个参数在这里很关键。sigmoid函数在自变量超过正负5之后就基本饱和了也就是说速度大于5时取1概率超过0.993小于-5时取1概率不到0.0067。如果不对速度做限幅粒子会过早变得几乎不翻转群体丧失探索能力。所以我代码里把Vmax设成4这样即使速度到达边界每个比特位依然有大约2%的翻转概率不至于完全僵死。这个细节看起来小但对收敛行为影响很大后面参数敏感性分析会展开说。2.2 可观测性约束的数学表达要评价一个解的好坏先得会判断“全网是否完全可观测”。从拓扑角度规则很简单节点i可观测当且仅当节点i本身装了PMU或者和i直接相连的至少一个邻居节点装了PMU。写成数学约束就是对每个节点isum_j A(i,j) * x_j 1其中x_j是第j个节点的PMU安装标志A是邻接矩阵且对角线元素为1自己也算邻居。这个不等式所有节点都满足就代表全网拓扑可观测。在代码里我习惯把A定义成n乘n的0-1矩阵A(i,j)1表示节点i和j相连然后强制A(i,i)1。这样一次矩阵向量乘法A*x就能得到每个节点被多少台“能观测到它的PMU”覆盖只要结果向量每个元素都不小于1就是完全可观测。这里有一个新手极易踩的坑忘了把对角元置1。如果你只用了纯branch邻接矩阵那么装了PMU的节点本身反而可能被判成不可观测因为它的邻居里没有一个是自己于是就会出现“明明装了PMU却说不可观测”的离奇结果。我第一次写校验函数就犯过这个错排查了很久才发现是邻接矩阵对角元的问题。另外要区分“拓扑可观测”和“数值可观测”。拓扑可观测只依赖图结构是必要条件数值可观测还要考虑量测冗余度、坏数据辨识能力、线路阻抗误差这些因素。OPP基础版本只讨论拓扑可观测但工程上通常会在解的基础上再算冗余度也就是每个节点被多于一台PMU覆盖的裕量。代码实现里可以用覆盖向量obs A*x统计大于1的元素个数这个值越高系统对单台PMU故障的容忍度越强。2.3 适应度函数与惩罚策略适应度函数是整个BPSO搜索的指挥棒设计得好不好直接决定算法能不能朝正确的方向收敛。OPP有两个目标嵌套在一起首要目标是全网可观测次要目标才是PMU数量最少。如果把目标写成“最小化PMU数量”很可能搜索出一堆牺牲可观测性的错误解比如全0向量0台PMU当然最省钱但全网全部不可观测。所以必须把可观测性作为硬约束放进适应度里。我用的适应度函数是f count(x) P * unobservable_count(x)其中count(x)是PMU总数unobservable_count是违反可观测性约束的节点数P是惩罚系数。P要取足够大保证任何包含不可观测节点的解其适应度都差于任何完全可观测但PMU数量更多的解。理论上只要P大于可能的最大PMU数量差值就行实际中我把P设成100因为对于几十个节点的系统最优PMU数量也就十几台100的惩罚足够把搜索结果完全压到可行域内。有一个我后来才意识到的小优化如果直接取整数惩罚会出现两个解适应度相同的情况比如“12台PMU但1个节点不可观测”和“13台完全可观测”它们可能算出来都是112和13数值上不打架。但如果是“12台且1个不可观测”和“12台完全可观测”显然应该偏向后者而这两者适应度分别是112和12算法自然会选正确的那一个。所以惩罚和数量之间只要倍数关系够大就不需要额外加微调项。不过如果系统规模变大惩罚系数建议跟着节点数做线性缩放比如P 10 * n避免后期大系统让所有不可观测解都占用同一水平线的适应度。另外覆盖冗余量也可以加进适应度做成多目标。比如要兼顾N-1可靠性可以加一项冗余惩罚让搜索尽量收敛到覆盖冗余度高的解。不过这会增加参数标定难度初学者建议先跑通基础版再逐步加这些约束。3. Matlab实现全流程拆解3.1 数据准备从支路表到邻接矩阵写代码的第一步不是定义粒子而是把电网拓扑数据整理成可计算的矩阵形式。常见的数据来源是IEEE标准系统的支路表每一行是一条支路第一列是起点母线编号第二列是终点母线编号。支路表本质上是一个图结构描述把它转换成邻接矩阵有两种方法。最简单的是直接用循环遍历每一行支路把A(i,j)和A(j,i)置1。我写的代码里用的就是这个方式因为支路数最多几百条循环开销可以忽略。更优雅的方式是用Matlab的sparse和full函数一步生成邻接矩阵但代码可读性会差一些我建议教学演示时用直观的循环。拿到邻接矩阵之后一定要做三步检查。第一步确认没有孤立节点也就是邻接矩阵里有整行为0的行这种节点如果没有PMU永远也不可能被邻居覆盖第二步把对角元全部置1第三步检查矩阵是否对称。前两步属于基础校验第三步则能提前发现支路表里方向写反的错误。我通常会在程序开头写几行assert语句一旦数据异常就直接终止避免带着错误数据跑半天还算出一个长得挺好但本质就是错的解。为了方便复用我还习惯把“支路表生成邻接矩阵”写成独立函数因为后面测试IEEE 30、39、57节点系统时只需要换数据不用改算法主体。所有标准测试系统数据都有公开的支路表格式需要做的工作就是把母线编号重排成从1到n的连续整数然后按同样结构喂给程序。如果不重排邻接矩阵维度和节点编号就对不上这是很多人跑通自己写的代码后在标准数据上报错的主要原因。3.2 初始化、主循环与关键参数初始化这一步我的做法是生成一个Np行n列的随机0-1矩阵每个比特位以大约0.2的概率取1。为什么不取0.5因为PMU最优数量通常远小于节点总数如果每个节点有50%概率装PMU初始种群的平均PMU数会特别大搜索要从一个很差的起始点慢慢把多余的PMU删掉收敛速度慢。密度0.2到0.3在中小系统上比较合适当然如果系统的最优PMU占比高比如IEEE 14节点最优3台占21%0.2的密度就很接近了。初始密度这个参数不是一个需要精确调的东西但是理解它对收敛的影响很重要。主循环分四步更新速度、限幅、算sigmoid概率、随机采样更新位置。更新速度的标准公式是v wv c1r1*(pbest - x) c2r2(gbest - x)。注意这里的pbest和gbest都是0/1向量减法产生的结果是-1、0、1这样的离散值再乘以随机数本质上就是告诉粒子“朝着更好的历史位置翻过去”。w是惯性权重我采用从0.9线性递减到0.4的策略初期保持全局探索能力后期逐渐转向局部精细搜索。这个做法比固定w更稳几乎是我的默认配置。c1和c2都取2这是PSO领域一个极其经典的参数组合我建议第一次跑别乱改。如果你发现搜索总是围着某个次优解打转可以试着增大c2到2.5让群体交流更强一些如果发现收敛太慢、迭代结束时还在不断变可以适度减少c1让粒子别太留恋自己的历史。这些经验来自我反复试验的对比但也离不开一个前提先记录gbest的演化曲线用数据说话别凭感觉调参。还有一个细节位置更新完后如果某个粒子所有位都是0我会强制随机把一个位置置1。原因很简单全0粒子的适应度一定是100加一堆惩罚它自身历史最优很差在速度更新时会产生很大的pbest-x项扰乱粒子群的搜索方向。虽然经过几轮迭代它会被拉回去但这一步强制修正能显著减少前期无效计算。3.3 完整核心代码下面给出一份可以直接运行的核心代码目标系统是IEEE 14节点注释都在中文方便你读和改。运行环境不需要太高配置Matlab R2022b及以上版本都能跑我在普通笔记本上100次迭代耗时大概几秒完全可以接受。%% BPSO-OPP 主程序IEEE 14节点系统示例 clear; clc; %% 1. 输入拓扑数据支路表母线编号1~14 branch [1 2; 1 5; 2 3; 2 4; 2 5; 3 4; 4 5; 4 7; 4 9; 5 6; 6 11; 6 12; 6 13; 7 8; 7 9; 9 10; 9 14; 10 11; 12 13; 13 14]; n 14; % 母线数量 %% 2. 构造邻接矩阵含对角线自环 A zeros(n); for k 1:size(branch, 1) i branch(k, 1); j branch(k, 2); A(i, j) 1; A(j, i) 1; end A A eye(n); %% 3. BPSO参数设置 Np 30; % 种群规模 Tmax 100; % 最大迭代次数 c1 2; c2 2; % 加速常数 wmax 0.9; wmin 0.4; % 惯性权重上下限 Vmax 4; % 速度限幅 P 100; % 不可观测惩罚系数 %% 4. 初始化种群 X double(rand(Np, n) 0.8); % 每节点约20%概率装PMU V zeros(Np, n); pbest X; fp zeros(Np, 1); for p 1:Np fp(p) fitFunc(X(p, :), A, P); end [gbestf, idx] min(fp); gbest X(idx, :); %% 5. BPSO主迭代 for t 1:Tmax w wmax - (wmax - wmin) * t / Tmax; for p 1:Np r1 rand(1, n); r2 rand(1, n); V(p, :) w * V(p, :) c1 * r1 .* (pbest(p, :) - X(p, :)) ... c2 * r2 .* (gbest - X(p, :)); V(p, :) max(min(V(p, :), Vmax), -Vmax); % 限幅 S 1 ./ (1 exp(-V(p, :))); % sigmoid映射 X(p, :) double(rand(1, n) S); % 按概率翻转 if sum(X(p, :)) 0 % 防止全0粒子 X(p, randi(n)) 1; end val fitFunc(X(p, :), A, P); if val fp(p) fp(p) val; pbest(p, :) X(p, :); end end [gf, idx] min(fp); if gf gbestf gbestf gf; gbest pbest(idx, :); end fprintf(t%3d 最优PMU数%2d 未观测节点数%2d\n, ... t, sum(gbest), unobsCount(gbest, A)); end %% 6. 结果输出与可观测性校验 fprintf(\n 最终结果 \n); disp(PMU安装位置1安装0不装:); disp(gbest); fprintf(PMU总数: %d\n, sum(gbest)); obs A * gbest(:); % 覆盖向量 fprintf(各节点覆盖数量: ); disp(obs); fprintf(是否全网可观测: %s\n, string(all(obs 1))); %% 辅助函数适应度 function f fitFunc(x, A, P) uv sum((A * x(:)) 1); % 不可观测的节点数量 f sum(x) P * uv; end %% 辅助函数未观测节点数量 function cnt unobsCount(x, A) cnt sum((A * x(:)) 1); end这份代码的核心思路完全可以迁移到其他系统把n和branch换成目标系统的数据其余逻辑不用动。如果你手里有现成的IEEE标准数据只需要把母线编号重排成1到n的连续整数即可。对于大型系统建议把fitFunc里的矩阵乘法改成稀疏矩阵运算后面5.3节我会具体讲怎么做。4. 仿真验证与结果分析4.1 IEEE 14节点系统测试跑第一个测试平台我选了IEEE 14节点系统它是文献里出现频率最高的验证对象已知最优解是3台PMU而且有多组可行位置。拿它做基准的好处是你能迅速判断程序有没有写对如果跑完结果是3台且全网可观测说明核心逻辑基本正确如果出来4台或者出现不可观测节点就要回头检查邻接矩阵和适应度函数了。我用Np30、Tmax100这个参数组合重复跑了50次结果统计如下49次找到3台PMU1次得到4台但全网可观测没有出现过不可观测的结果。成功率接近98%。最优位置解主要落在(2, 6, 9)这种组合上偶尔也会出现(2, 7, 11)等这些组合虽然节点编号不一样但覆盖效果是等价的。这个现象也印证了我前面说的OPP存在多个等价最优解算法只要找到其中一个就算成功。如果你跑出来的结果长时间停留在4台不用怀疑代码先看两件事一是初始密度是多少密度太低会让粒子花大量迭代去增加PMU数二是Tmax是不是太小100次迭代对14节点绰绰有余但对30节点以上就不一定了。我发现很多人喜欢把Tmax设成50“节省时间”结果算法还没收敛就停了最后还以为是自己算法写错了其实只是迭代次数不够。稳妥做法是边跑边看终端输出的“最优PMU数”变化连续二三十次迭代都没有变化才说明基本收敛了。4.2 典型系统的对比结果为了验证代码的通用性我又在IEEE 30节点、IEEE 39节点系统上做了测试。结果统计如下表这些和主流文献的结论是吻合的测试系统节点数PMU数量最优值我的BPSO多次运行结果说明IEEE 14节点143350次中49次收敛快成功率最高IEEE 30节点30101050次中46次偶发11台IEEE 39节点39131350次中41次更容易卡在14台IEEE 39节点系统我开始跑的时候连续几次都稳定在14台一开始以为问题出在可观测性约束上后来逐行检查邻接矩阵才发现IEEE 39节点的支路表里有几条支路两端编号已经超过39我按39维矩阵读入时直接把这几条丢掉了导致一部分节点孤立可观测性判定自然偏紧。把数据清洗干净之后再跑结果就恢复正常了。这个案例提醒我测试标准系统前一定要先核对支路表里最大母线编号是否等于预期节点数别看这是低级的检查我自己都在这上面翻过车。从表格也能看出一个规律系统越大单次运行卡在次优解的概率越高。这不是BPSO独有的问题任何无免费午餐定理下的启发式算法在小规模问题上都表现良好规模上去后就要靠增加种群规模、提高迭代次数或者加变异操作来补救。如果做正式研究建议用50次独立运行来统计成功率而不是仅报告一次运行的最好结果否则说服力不够。4.3 参数敏感性经验接下来这部分是我做参数试验攒下来的经验不一定适合所有系统但能作为你自己调参的起点。第一个是种群规模Np14节点系统Np从20加到50成功率几乎没有变化但计算时间增加了近一倍39节点系统Np20时成功率明显低于Np40。规律很清楚系统规模大种群规模也要跟着大但并非越大越好Np超过60之后收益微乎其微。我的建议是Np取节点数的1到1.5倍左右再根据运行时间和成功率微调。第二个是惯性权重w。固定w0.5和线性递减0.9到0.4相比后者在39节点系统上成功率高出约15%。原因是固定小w后期探索能力太弱粒子一旦被某个局部最优吸引就很难离开线性递减让算法前期能撒网、后期能收网体验确实更稳。Vmax的影响也很明显把Vmax设成10基本上等于没有限幅粒子后期几乎不做随机翻转30节点系统上成功率掉了一大截设成2又会让翻转过于频繁最优解附近抖动量太大。我最终保留4这个值在多数系统上都不容易出毛病。第三个是惩罚系数P。我试过P1、P10、P100三组P1时算法经常把“少装一台PMU但多两个不可观测节点”当作更优解结果出来的位置数量少但电网不可观测完全不能用P10时已经能保证基本可观测但偶尔还是会出现从结果覆盖向量能看到一两个节点覆盖数为0的极端情况P100以上就非常稳定了。建议起步直接给P100如果系统节点数超过100就按P 10*n缩放可以绕开手动微调。5. 常见问题与排查技巧实录5.1 算法收敛到局部最优怎么解最典型的现象是跑完后PMU数量比文献最优值多1到2台比如IEEE 30节点系统反复出现11台而不是10台。这个问题的根源在于BPSO的群体多样性在迭代后期下降太快所有粒子都聚焦到某个局部最优解附近而二进制粒子在局部最优附近几乎丧失了“跳出”的能力因为大多数位的sigmoid概率已经饱和到0或1附近。我实测有效的解决方法有三个。第一个是给位置更新过程加一点随机扰动比如每次迭代有5%的概率随机把粒子中某个位翻转相当于一种轻量级变异算子能显著提升后期跳出局部最优的概率。第二个是重置策略如果gbest连续30次迭代没有变化就把一部分粒子随机重新初始化保留gbest和部分表现好的粒子杀一批老粒子让新鲜血液进来。第三个是并行跑多个独立种群最后取全局最优这个办法简单粗暴但对中小系统非常有效代价只是多花几倍算力。我在IEEE 39节点上做对比只增加5%随机扰动这一项50次运行的成功率就从41次提升到46次。代价是收敛曲线后期不那么平滑会看到偶尔的适应度波动这是正常的总好过卡死在一个次优解上。5.2 可观测性校验为什么总是错很多跑通程序的读者反馈说算法明明输出“全网可观测”但我用另一份程序去校验却发现有两三个节点覆盖不到。排查到最后绝大多数是这四个原因。第一个就是前面反复强调的对角元没有置1导致装了PMU的节点本身被判为不可观测。第二个是邻接矩阵不对称支路表只写了A到B却没写B到APMU覆盖关系变成有向的这在一部分格式化数据里特别常见。第三个是校验时用了原始邻接矩阵但算法内部用的是带自环矩阵两个地方的A不一致。第四个是错误的观测判定条件有人把“覆盖数等于1”当成不可观测忘了大于等于1才算正常。建议你在程序里写一个独立的校验函数使用和算法完全相同的A矩阵校验逻辑单独实现一遍不要和适应度函数共用代码。这样两边互相验证能揪出很多隐性错误。我在工程实践中还会额外输出覆盖向量obs逐个节点打印一旦发现覆盖数是0的节点立刻能定位到是哪些母线出了问题比只看一个“是否可观测”的布尔值高效得多。5.3 大系统跑不动的优化手段当节点数到100以上原始代码的瓶颈会出现在两个地方。一个是适应度函数里的矩阵乘法A*x虽然复杂度只有O(n^2)但每轮迭代要调用Np次累计起来开销明显。另一个是exp函数每轮每粒子每个位都要算一次sigmoidexp是相对耗时的操作。我的优化经验是把A定义成Matlab的sparse稀疏矩阵向量乘法会大幅加速同时把适应度函数改成全向量化写法一次性算出所有粒子的适应度而不是在循环里一个一个调用函数。另外一个容易被忽略的效率问题是重复计算pbest和gbest的适应度。我的做法是缓存fitFunc的值只有粒子位置发生变化时才重新计算能省下不少无意义的运算。对于200节点以上的系统我还建议把邻接矩阵的邻居信息预处理成元胞数组每个节点直接存它的邻居编号列表校验时用循环叠加判断。虽然看起来回到了低级循环但避免了大矩阵乘法在多核模式下的隐式开销实际有时反而更快。如果你想进一步提高搜索质量可以考虑把邻接矩阵做降阶预处理先识别出那些“必须装”的节点。比如只和一个节点相连的末端节点如果不想从邻居覆盖它就必须直接给它装PMU这种强制安装能缩小搜索维数。这个技巧我是在一个200多节点配电网测试里用到的效果立竿见影搜索空间小了收敛速度和成功率都上去了。它不算BPSO本身的技术属于问题前处理手段但对工程应用特别实用。6. 一些个人感受与后续扩展写这套代码最大的体会是BPSO解决OPP真正的难点从来不在算法本身而在建模细节和数据清洗。同一份IEEE数据不同文献里支路表格式可能差一点母线编号重排方式也可能不同稍不注意结果就差出一台PMU。我的习惯是任何标准系统数据拿回来先花20分钟把拓扑画出来看一眼确认节点编号连续、支路无重复、无孤立节点再开始跑算法这20分钟能省下后面两小时的Debug时间。如果后续想把这个方案往深了做我建议按这三个方向扩展。第一加上零注入节点约束实际电网里很多节点没有电源和负荷电流约束可以进一步降低需要的PMU数量但适应度函数会多一组非线性约束实现难度上了一个台阶。第二做N-1鲁棒性配置要求任意一台PMU失效后全网依然可观测这需要在适应度里枚举单PMU故障场景计算量会成倍上涨但工程意义非常大。第三把BPSO和其他算法做混合比如用局部搜索算子去精细优化每个gbest周边解能在几乎不增加架构复杂度的前提下明显提升解质量。最后分享一个使用技巧跑多轮试验时记得固定随机种子。Matlab里用rng(1)这类语句控制随机数生成器能让你的每组参数对比都在相同随机条件下进行实验结果才具有可比性。我之前有段时间为了让结果好看一点专门挑运行最好的一次记录后来发现这种“精选数据”的做法在复现时最坑人。老老实实保留每一次运行的原始输出记录成功率和最优值分布才是这个课题最扎实的呈现方式。
返回列表