资讯动态

基于BPSO的电力系统PMU最优配置:Matlab实现与全网可观性验证

发布时间:2026/10/16 1:45:45 来源:尧图企业网站定制
做电力系统广域测量相关项目的时候最容易被低估的一个前置问题就是PMU装在哪几条母线。这个问题的学术说法叫OPPOptimal PMU Placement最优PMU配置翻译成大白话就是在保证全网能观的前提下让同步相量测量单元PMU的安装数量尽量少。这看起来只是一个设备规划问题但本质上是组合优化系统规模一大手算直接失效。我当时用二进制粒子群优化BPSO把这套流程写成了Matlab代码从建模、求解到验证都有完整的实现路径这篇文章就按这个思路完整梳理一遍。适合刚接触PMU配置的电气专业学生也适合想把BPSO用到类似0/1组合优化场景的工程师参考。1. 问题建模先搞懂“一台PMU能覆盖多少母线”1.1 PMU的观测范围为什么能“辐射”到相邻母线在展开优化算法之前得先把PMU的观测模型讲清楚否则后面所有的约束都是在空中楼阁。PMU会同时测量所在母线的电压相量以及与该母线相连的支路电流相量。因为电流在输电线上流动时电压会沿线降落所以只要知道了本端电压和电流再结合线路阻抗参数就能通过欧姆定律推算出对端母线的电压相量。换句话说一台PMU不只让它所在的母线“能观”还让所有与它直接连接的相邻母线“顺带能观”。这是一个非常关键的拓扑特性也是为什么可以不用在所有母线都装PMU的根本原因。用电力系统调度里的话说PMU本身所在的母线叫“直接可观”相邻母线叫“间接可观”两者叠加起来只要全网每一条母线都至少满足其中一个条件就实现了全网拓扑可观。实际做规划时还会遇到一种情况通过变压器连接的多电压等级母线理论上有不太一样的电气量关系但OPP研究的起步阶段基本都按“母线-线路”的图模型处理把变压器支路视为普通线路只保留拓扑连接关系。这么做的好处是模型足够干净后续如果要加入线路参数、互感约束再在代码框架上扩展就行。1.2 全网可观的数学表达如果把电网的母线当作图的顶点线路当作图的边那么OPP问题可以写成非常简洁的整数线性规划形式决策变量x_i ∈ {0, 1}表示母线i是否安装PMU目标函数minimize J ∑ x_i也就是安装总数最小约束条件则是每条母线至少被一台PMU“覆盖”一次。这里的覆盖可拆成两层母线本身装了PMU覆盖自己某个相邻母线装了PMU通过电流推算间接覆盖它。用矩阵表达就是A·x ≥ 1。这里的A是一个n×n的邻接矩阵n是母线总数。A对角线元素全为1对应“自己装PMU覆盖自己”如果母线i和母线j之间有线路则A(i,j)A(j,i)1。A·x得到的是一个长度为n的向量每个分量表示对应母线被多少台PMU覆盖。只要所有分量都大于等于1全网就可观。举个最简单的四母线链式网络例子母线1-2-3-4依次相连邻接矩阵A的对角线都是1A(1,2)、A(2,3)、A(3,4)以及对称位置都是1。如果安装方案是x[1 0 0 1]即母线1和母线4装PMU那么A·x的结果里母线1被自己覆盖、母线4被自己覆盖、母线2被母线1覆盖、母线3被母线4覆盖四个分量全部≥1全网可观成立。这个例子后面可以用来人工验证算法非常直观。1.3 为什么不用穷举或直接写整数规划很多人会问这个问题规模也不大写个循环枚举不就行了问题是n条母线就有2的n次方种组合IEEE 14节点系统是16384种勉强能枚举到了IEEE 118节点系统那就是2的118次方任何一台普通计算机都扛不住。这就是典型的NP-Hard组合优化问题。当然也可以用现成的整数规划求解器比如在Matlab里调intlinprog约束写起来也确实不难。但实际做项目的时候我优先选了启发式算法原因有几个工程场景里OPP经常要叠加各种约束比如N-1可靠性、PMU通道上限、通信覆盖范围整数规划模型每加一个约束可能就要重新推导很久启发式算法的编码和解码逻辑很直观约束改动直接在适应度函数里加判断就行团队或学生拿到一套启发式代码后改造成其他类似的选址、布点问题也很容易。在启发式算法里我最终选了二进制粒子群优化。对比下来它的优势很明显BPSO的位置向量天生就是0/1和“装/不装PMU”的决策变量一一对应不需要像遗传算法那样再设计染色体编码规则同时它比模拟退火的参数少比遗传算法的调优过程温和。下表是我做选型时的一个对比算法与0/1决策的匹配度参数数量局部搜索能力工程改造成本整数规划间接需要建模转换少精确解约束修改需要重新建模模拟退火一般少一般中等遗传算法需要额外设计编码多较弱中等BPSO天然匹配中等较弱但可通过精英保留增强低2. 二进制粒子群优化从连续空间的鸟群行为说起2.1 标准PSO的更新逻辑标准粒子群优化的思想源于对鸟群觅食行为的模拟。一群鸟在一个空间里找食物每只鸟不知道食物在哪但知道自己的当前位置和迄今为止自己找到过的最好位置也知道整个群体里所有鸟找到过的最好位置。于是每一只鸟的飞行方向就由三个因素共同决定自己当前的飞行惯性、飞向自己历史最优位置的拉力、飞向群体历史最优位置的拉力。用数学公式表达假设粒子i在第t代的位置是x_i(t)速度是v_i(t)那么下一代的速度和位置分别按下面两个式子更新v_i(t1) w·v_i(t) c1·r1·(pbest_i - x_i(t)) c2·r2·(gbest - x_i(t))x_i(t1) x_i(t) v_i(t1)其中w是惯性权重控制粒子保持原来运动方向的程度c1和c2分别是自我认知和社会认知的学习因子r1和r2是[0,1]之间的随机数给搜索过程引入随机扰动。pbest_i是粒子i的历史最优位置gbest是整个群体的历史最优位置。刚接触PSO的人可能觉得这些参数很抽象其实可以把w理解成“一个人做决定的保守程度”w越大越坚持自己原来的方向c1是“对自己经验的信任程度”c1越大越容易回到自己以前找到的好地方c2是“对群体经验的信任程度”c2越大越容易向别人学习。整个算法就是在“个性化探索”和“群体共识收敛”之间找平衡。2.2 位置必须变成0和1怎么办标准的PSO是为连续变量设计的但OPP的决策变量是“装还是不装”只有0和1两个状态。直接把连续速度加到整数位置上位置会飘到2.3、-0.7这种无意义的值所以需要把速度从“位移增量”改造成“取1的概率”。BPSO的核心做法是先把速度v通过sigmoid函数压缩到(0,1)区间S(v) 1 / (1 exp(-v))然后把S(v)解释为“该维度取1的概率”。当S(v)大于一个随机生成的阈值时该维度取1否则取0。等价地在代码里可以写成x_new 1 / (1 exp(-v)) rand这里有几个值得注意的细节。当v等于0时S(v)等于0.5表示取0或取1的概率各一半粒子仍然保持较强的探索能力当v很小时S(v)趋于0位置倾向于稳定在0当v很大时S(v)趋于1位置倾向于稳定在1。如果没有对速度做限制v超过一定范围后S(v)会无限接近0或1概率饱和粒子几乎不再翻转这会导致算法过早收敛。因此实现BPSO时一定要给v设置上限常见做法是限制v_max在4到6之间对应S(v_max)约为0.98既保证概率有区分度又不会直接锁死搜索方向。2.3 BPSO为什么天然适配OPP在OPP里每个粒子的位置向量直接就是候选安装方案向量的每一位对应一条母线。算法每更新一次位置就能直接代入全网可观性约束做检验不需要编码解码的中转层这是我觉得BPSO最舒服的地方。还有一个隐性好处是速度本身携带了历史信息。虽然位置变成了离散的0/1但速度仍然是连续量它保存了“这个维度历史上偏向1还是偏向0”的趋势。比如某个维度当前值是0但速度是正数说明它有向1移动的倾向速度是负数说明它继续停留在0的概率更大。这种连续信息和离散状态的结合让BPSO在保持粒子群协作机制的同时也能在二值空间里保持足够的随机探索能力。不过BPSO不是万能的它也有早熟问题。当群体最优解很早就确定下来所有粒子都会被拉向同一个方向容易错过隐藏在远处的更好解。后面讲实现的时候我会专门说怎么用精英保留、局部邻域搜索这些手段来缓解。3. Matlab实现从邻接矩阵到完整BPSO循环3.1 先把电网数据整理成邻接矩阵在写优化循环之前第一步是把电网拓扑数据转化成Matlab能直接算的邻接矩阵。最简单的方式是手工维护一个线路表每一行表示一条支路的两端母线编号。以14节点系统为例线路表长这样lines [ 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; ];注意Matlab的索引从1开始所以这里的编号一定不能出现0。得到线路表后邻接矩阵可以这样构造function A buildAdjacency(n, lines) A eye(n); % 对角线置1对应“自己覆盖自己” [m, ~] size(lines); for k 1:m i lines(k, 1); j lines(k, 2); A(i, j) 1; A(j, i) 1; % 无向边需要双向置1 end end这里最容易踩的坑是忘记把对角线置1。如果对角线全部是0就会导致“装了PMU的母线本身反而不可观”这种逻辑错误算法永远搜不到可行解。另一个坑是线路表只写了单方向比如只写了1-2没写2-1如果代码里没有双向置1邻接矩阵就不对称可观性判断会出现漏覆盖。3.2 全网可观性判断函数拿到邻接矩阵A和某个粒子的安装方案x后可观性判断只需要一行矩阵乘法function [flag, cover] isObservable(x, A) cover A * x(:); % 每个母线的覆盖次数 flag all(cover 1); % 所有母线至少被覆盖一次 endA·x的意义在1.2节已经解释过cover是一个n维向量cover(k)表示母线k被多少台PMU覆盖。理论上讲只要cover(k)≥1母线k就是可观的。这里额外补充一个判断细节如果某条母线被0台PMU覆盖说明它在候选方案里完全失去观测是不可行的。很多人在验证团队代码的时候会发现一个问题算法明明报告“已找到可行解”但人工手算却发现某条母线根本没被任何PMU覆盖。这种问题多半出在cover向量的结果判断上比如把“cover 1”当成是否可观的判断条件结果漏掉了“等于1也可观”的情况或者是把A乘反了用了A的转置。所以要养成手动标注一组已知可行解进行交叉验证的习惯这是后面第6章要展开说的重点。3.3 BPSO主循环框架主循环的核心流程是固定的初始化粒子群评估所有粒子的适应度更新个体最优和全局最优然后按BPSO的速度位置更新公式产生下一代重复直到满足迭代次数或收敛条件。初始化的时候有一个很影响收敛效率的细节。OPP的解通常是稀疏的也就是安装母线数量远小于母线总数如果初始位置用0.5的随机阈值生成很多粒子会变成“几乎所有母线都装PMU”的离谱解虽然可行但意义不大。更合理的初始化是让每位为1的概率在0.1到0.15之间这样初始种群的大多数个体靠近可行解区域收敛速度会明显加快。代码可以写成nPop 30; % 粒子数 nVar 14; % 母线数14节点系统示例 x rand(nPop, nVar) 0.85; % 每个维度取1的概率约0.15 v zeros(nPop, nVar);适应度函数是算法和OPP问题对接的关键。目标函数是安装数量越少越好但必须满足全网可观。处理“不可观但安装数很少”这种情况有很多种策略我用的是惩罚函数法如果解可行适应度 sum(x)即PMU总数如果解不可行适应度 sum(x) (n - 全网可观母线数) × penalty。这里penalty取值要足够大保证任何一个“不可观但安装数少”的解都比任何一个“全网可观但安装数多”的解差。实践下来penalty取n母线总数甚至更大比较稳妥。比如14节点系统一个安装了2台PMU但只覆盖了10条母线的解适应度会变成2 4×14 58远远大于一个正常3台PMU的可观解。如果penalty设得太小算法很可能为了追求安装数少而容忍失观导致最后搜出来的结果根本不可用。主迭代部分的核心代码如下maxIter 100; wMax 0.9; wMin 0.4; c1 2; c2 2; vMax 5; pbest x; % 个体历史最优位置 pbestFit inf(nPop, 1); gbest zeros(1, nVar); % 群体历史最优位置 gbestFit inf; for iter 1:maxIter w wMax - (wMax - wMin) * iter / maxIter; % 惯性权重线性递减 for i 1:nPop % 评估当前粒子 fit sum(x(i, :)); [flag, cover] isObservable(x(i, :), A); if ~flag lossCount sum(cover 1); fit fit lossCount * nVar * 10; end % 更新个体最优 if fit pbestFit(i) pbestFit(i) fit; pbest(i, :) x(i, :); end % 更新群体最优 if fit gbestFit gbestFit fit; gbest x(i, :); end end % 更新速度和位置 for i 1:nPop r1 rand(1, nVar); r2 rand(1, nVar); v(i, :) w * v(i, :) c1 * r1 .* (pbest(i, :) - x(i, :)) ... c2 * r2 .* (gbest - x(i, :)); v(i, :) max(min(v(i, :), vMax), -vMax); sig 1 ./ (1 exp(-v(i, :))); x(i, :) sig rand(1, nVar); end end注意两个细节。速度更新里用的是“pbest - x”和“gbest - x”在0/1空间里这个差值的含义是“历史最优和当前位置的差异方向”比如某个维度pbest是1而当前x是0差值就是1会给该维度一个正向速度刺激让它更容易翻转为1。位置更新用“sig rand”而不是“sig rand”概率上差别很小但从随机数分布角度来说大于号能让S(v)0时严格保持为0状态减少不必要的翻转抖动。3.4 结果输出与人工核对算法跑完后最好把安装母线编号和每个母线的覆盖次数一起打印出来installed find(gbest 1); cover A * gbest(:); disp([最优安装母线数量: , num2str(length(installed))]); disp([安装母线: , num2str(installed)]); disp(各母线覆盖情况:); disp(cover);为什么要把覆盖次数打出来因为有时算法会输出“全能可观但母线数量不是理论最少”的解这时候看到cover向量就能很清楚地知道哪些位置覆盖冗余比较大人工调整时也更有依据。比如某个母线被3台PMU覆盖说明其中1~2台属于“锦上添花”型覆盖可以考虑去掉相关PMU再重新验证这种现场微调在工程汇报里非常有用。4. 从基础版到进阶N-1约束、冗余度和零注入节点4.1 任意一条线路断开后全网仍可观基础版OPP只保证正常运行方式下全网可观但电网运行中最常见的威胁就是某条线路跳闸。一条线路断开后原本通过该线路间接可观的母线可能会失去观测所以工程上更关心的是任意一条线路退出运行全网依然能观。这就是N-1条件下的OPP问题。实现方法不复杂在可观性判断里加一层循环逐个模拟线路断开即可function flag isObservableN1(x, A, lines) flag true; for k 1:size(lines, 1) A_temp A; i lines(k, 1); j lines(k, 2); A_temp(i, j) 0; A_temp(j, i) 0; [flag_temp, ~] isObservable(x, A_temp); if ~flag_temp flag false; break; end end end这段代码的含义很直白把每一条线路分别从邻接矩阵里临时抹掉再检查一次全网可观性。只要有任何一条线路断开后出现失观母线整个安装方案就不合格。加入N-1约束后PMU数量通常会明显上涨。以某些文献常报的14节点系统为例基础OPP典型解是3台但加上N-1约束后往往要增加到5台甚至更多。这不是算法变差了而是约束变强了原本可以依靠单条线路间接可观的地方现在必须保证有两条以上的覆盖路径。需要特别说明的是这里的“N-1”指的是线路断开后拓扑依然可观并没有考虑PMU设备本身故障。如果还要考虑PMU装置失效那约束会更严格常见做法是要求每条母线至少被2台PMU覆盖这正好引到下一个话题。4.2 用冗余度控制可靠性与成本前文里cover向量其实就是每个母线的冗余观测次数cover(k)等于多少就说明母线k同时被多少台PMU“看”着。如果希望某条关键母线即使丢一台PMU也能继续可观就要求cover(k) ≥ 2这就是最小冗余度约束。在BPSO框架里加这个约束非常直接只需要在isObservable的判定条件里把“cover 1”改成“cover Rmin”flag all(cover Rmin);Rmin是人为设定的最小冗余次数。Rmin1就是普通OPPRmin2就是“重要母线双覆盖”的可靠配置。实际做规划的时候我不会一上来就要求全网所有母线都Rmin2因为那样PMU数量会涨得很猛。比较好的做法是先跑一版Rmin1的解然后用cover向量找出哪些母线覆盖次数低针对关键走廊上的母线单独提高冗余要求实现差异化可靠配置。这种“算法出基础解、人工加约束复核”的工作流在实际项目里比一键生成完美方案更稳因为调度侧往往对某些特定通道有额外的运行要求这些很难全部写进公式里。4.3 零注入节点的诱惑与代价电力系统里有一类母线既没有发电机也没有负荷只有线路从它这里经过这种母线叫零注入节点Zero Injection BusZIB。利用基尔霍夫电流定律只要与零注入节点相连的母线电压都已知理论上可以反推出该节点的电压从而省掉一台PMU。这个技巧在文献里经常被提也确实能把最优PMU数量压得更低比如某些系统能从3台降到2台。但我建议初学者先别急着在基础版里加零注入节点。原因有三个第一零注入节点的约束是条件性的需要对“相邻母线全部可观”做逻辑判断这种判断写进适应度函数以后代码可读性下降很快第二零注入节点的精确性依赖网络参数和电流测量相位实际工程里的误差问题和遥信缺失会让理论省下的PMU变得很脆弱第三大部分调度部门更愿意用“每台PMU直接覆盖相邻母线”这种简单透明的规则方便运行人员理解方案为什么这么配。真正做研究或者写论文的时候零注入节点可以作为对比分析项展示算法在更复杂约束下的表现。做工程交付我倾向于先用基础N-1版保证可靠再评估是否值得引入零注入优化。5. 测试验证与参数调优跑通不等于跑对5.1 用已知最优解的小系统做基准测试写优化算法最怕的一件事就是程序跑得很欢快结果却是错的。所以我的习惯是先在一个小系统上做基准验证确认程序的正确性之后再放到大规模系统上跑。四母线链式系统的已知最优解是2台PMU装在一端和另一端即可。跑BPSO时如果输出安装数量为2同时覆盖向量全部≥1说明核心逻辑是通的。然后可以换九节点系统、十四节点系统做多组验证。几个常见测试系统的参考结果见下表测试系统母线数BPSO收敛到的PMU数量补充说明四母线链式网络42最简验证用例可人工交叉核对九节点三相系统93~4经典结果随是否考虑ZIB略有差异十四节点标准系统143一组典型可行解为母线2、6、9三十节点标准系统3010~12文献常见范围考虑N-1会更高以十四节点系统为例母线2、6、9这组解在母线2安装PMU后可覆盖母线1、2、3、4、5在母线6安装PMU后可覆盖5、6、11、12、13在母线9安装PMU后可覆盖4、7、8、9、10、14。三个装置组合起来全网络每个节点至少出现在一个覆盖集合里这就是很典型的三台PMU全网可观的方案。拿到这类基准结果后验证代码时直接用这个方案代入isObservable函数检查输出再对比BPSO跑出来的安装数是否一致。5.2 参数设置的实际经验BPSO参数调优是绕不开的话题但我的经验是参数的第一目标不是追求“最优”而是追求“稳定可复现”。以下这组参数是团队跑多个测试系统后总结的通用开局方案参数推荐取值说明粒子数nPop30~60节点越少越可以小30节点以上建议40以上最大迭代次数maxIter50~100小系统50足够大系统适当加大惯性权重w0.9线性降到0.4前期重探索后期重收敛学习因子c1、c22.0PSO经典取值问题不大速度上限vMax4~6防止sigmoid过早饱和初始位置取1概率0.10~0.15贴近OPP解的稀疏性惯性权重从大到小递减的思路相当于前期让大家在搜索空间里飞得野一点多发现几片“优秀区域”后期再集中精力细化搜索。设计成线性递减而不是固定值是因为固定权重会让后期收敛速度变慢如果w始终很大粒子会一直在全局范围徘徊迟迟不落在最优解附近。关于粒子数量很多入门资料喜欢把粒子数设成一百甚至两百但在OPP这种小规模决策问题里30个粒子加100次迭代已经能在十四节点系统上稳定找到3台PMU的方案。粒子数过大的直接后果是每次迭代都做几十次可观性判断如果是N-1版本还要在isObservable内部嵌套几十条线路遍历计算量成倍增长收益却不明显。5.3 收敛曲线与早熟判断跑完一次优化后把历代最优适应度记录下来画一条收敛曲线。正常情况应该是前20代快速下降之后缓慢下降到稳定值。如果出现一种典型异常前几代适应度就降到某个值然后整整50代都不再变化说明算法很可能陷入了早熟搜到的是局部最优而不是全局最优。处理早熟最简单有效的办法是“多随机数种子重跑”。OPP这类问题的解空间里往往存在多组等优方案换个随机种子经常会撞出另一组同数量的解能明显增加对全局最优的信心。如果重跑10次结果都稳定在同一个安装数量那么这个数量基本可信如果不同种子跑出来的数量有波动就要考虑是不是惩罚系数、粒子数设置出了问题。还可以在循环末尾加一个局部精搜步骤对gbest里的每一个安装位做“尝试删除”操作删除后重新检查可行性如果删除后仍然全网可观就更新gbest然后再对每个未安装位做“尝试添加”操作如果添加后可行但代价不划算就忽略。本质上是做一次简单的邻域搜索弥补BPSO后期局部细化能力偏弱的问题。这个改进通常能让最优解的安装数量再降一个台阶尤其是在系统规模较大的时候效果更明显。6. 常见问题与排查技巧实录我在跑这套代码和帮别人审代码的过程中遇到过不少重复出现的问题整理成一份速查表现象可能原因处理办法每次运行结果都不一样随机算法本身就不稳定固定随机种子或设置多随机种子重跑取最优永远找不到全网可观的解邻接矩阵对角线没置1检查Aeye(n)是否执行找到的PMU数量比理论最优多可能是参数导致局部收敛增加粒子数或迭代次数尝试局部精搜适应度函数出现负数覆盖向量计算用错逻辑检查A*x的维度和符号安装数量更低但不可观惩罚系数太小调大penalty确保不可行解适应度远大于可行解线路表索引报错母线编号从0开始Matlab索引必须从1开始N-1验证失败未逐个线路断开检查确认isObservableN1里A_temp更新正确这里挑三个最值得展开的问题细说。第一个典型的坑是“惩罚函数把算法带偏”。如果把penalty设成固定常数5那么一个“安装了1台PMU但漏掉很多母线”的不可观解适应度可能是1 漏观数×5而一个“安装3台PMU全网可观”的正确解适应度是3。漏观数只要为1前者适应度6反而比正确解3差不了多少甚至有可能会污染种群。所以我前面强调penalty要取n×10这种量级让任何不可观解在适应度上完全失去竞争力。第二个高频问题出现在“重复编号的线路表”。如果线路表里i,j和j,i同时存在构造邻接矩阵时不会报错但计算量会虚高而且部分断线仿真的逻辑会变得混乱。最好在生成线路表时就约定每条支路只保留小号在前、大号在后的顺序避免重复边。第三个是“验证某个解是否可行”的正确姿势。除了看flag还要自己手算一遍覆盖关系。比如拿到某个算法输出后先画出安装母线的集合再逐个看与它相邻的母线手工统计一次被覆盖的区域然后用程序打出的cover向量比对。这种做法虽然土但在算法落地阶段是绝对必要的。我还见过一个隐藏很深的错误函数里用了A的转置A导致计算出来的覆盖关系变成了反向传播结果全错但由于某些系统的邻接矩阵是近似对称的看起来又好像正确只有手算才能发现。实际使用中我习惯再加一道“随机多起点验证”。既然BPSO是随机算法那评估一个改进方案是否有效就不能只跑一次。我会固定五个不同的随机种子每个种子跑完整流程记录五次的最优数量、迭代次数的平均值。如果一个新参数只在某一个种子下表现好而在其他种子下恶化那说明是运气而不是实力如果新参数在五个种子下都稳定优于旧参数那才值得采用。结尾这套BPSO做OPP配置的方案我前后在好几个测试系统上反复调过最大的感想是这类组合优化项目的瓶颈往往不是算法不够高级而是问题建模和约束校验是否严谨。先把全网可观的逻辑用邻接矩阵吃透再谈粒子群参数的优化永远是对的顺序。还有一个心得体会跑出来最小安装数量以后不要急着写进报告先人工复算一遍覆盖矩阵。有一次我自信满满地拿着算法结果去汇报结果对方随手画了个拓扑图就指出一条母线没有覆盖路径当场翻车原因就是邻接矩阵里有一条线路没双向置1整个结果都建立在错误模型上。从那以后任何优化结果都必须先过“人工验证覆盖矩阵”这一关。如果你是第一次接触这个课题建议按四母线链式系统跑通再到九节点、十四节点系统逐步验证。想进一步扩展可以在isObservableN1的基础上加入“重要母线Rmin2”的差异化冗余配置然后把零注入节点的逻辑作为对比项加上去。这样一层层叠加之后你对OPP的理解和BPSO代码的掌控都会扎实很多。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑