1. 配电网里“有功-无功”协同问题的本质
1.1 为什么有功和无功不能在同一个模型里分家
做配电网相关工作的朋友应该都遇到过这种场景:你辛辛苦苦跑完一段优化程序,只输出一个最优解,拿给运行班组一看,对方第一句话就是“这个投切方案今天用不了”。不是因为算法错了,而是工程里根本没有所谓的唯一最优解——设备可能检修、负荷预测有偏差、某些操作对开关寿命有损耗。这也就是我后来从“找一个最优解”转向“找一组有差异、可备选的优质解”的原因,也是“小生境粒子群算法”在配电网“有功-无功协调优化”里真正能发挥价值的地方。
先说清楚,为什么配电网里有功和无功没法像输电网那样拆开处理。输电网线路的电阻与电抗之比(R/X)通常很低,有功功率与无功功率之间的耦合较弱,传统分析里可以近似解耦,分别用不同的手段去调。但配电网的线路电阻占比较高,很多馈线段甚至R/X接近1甚至更高,此时线路上的有功损耗、电压降落、无功流动是纠缠在一起的。举个例子,一条馈线末端电压偏低,你只靠增加无功补偿未必能完全解决问题,因为线路电阻上已经落掉了很多电压;反过来,如果调整分布式电源的有功出力,又会影响整体潮流分布,进而改变无功的流向。
“协调”这个词指的就是这种耦合关系。在有分布式电源接入的配电网里,问题更突出:光伏逆变器、风电变流器本来有能力输出无功功率,但传统的控制策略往往只做最大功率跟踪,把剩余的无功容量白白浪费掉。同时,分布式电源功率过大时,又会引起反向潮流、末端电压升高。把有功和无功放在同一个优化模型里统筹考虑,才能既让电压不越限,又能把网损压下来。
1.2 从数学性质看为什么这个优化难做
从数学上看,配电网有功-无功协调优化是一个典型的非凸、非线性、混合整数优化问题。非凸性来自潮流方程本身以及网损、电压偏差这些目标函数的表达;混合整数体现在决策变量既包含连续量(分布式电源出力、无功输出),又包含离散量(变压器分接头档位、电容器组投切组数)。约束条件中还有大量不等式约束——节点电压上下限、支路电流限值、设备出力范围等。
这类问题压缩到任意多项式时间都找不到精确解,实际工程里通常依赖两类方法:一类是数学规划方法,比如内点法、分支定界、半定松弛,另一类是元启发式算法,比如遗传算法、粒子群算法、差分进化算法。内点法对初始点比较敏感,处理离散变量需要先松弛再映射回整数,映射之后经常出现“伪整数解”——也就是松弛解和真实可行解之间看得出差距;启发式算法没有这些问题,但它们的共同弱点是容易“早熟”,也就是种群早早收敛到某一个局部区域,把其他同样优秀的区域全部忽略掉。
还有一个工程场景里容易被忽略的数学问题:目标函数常常不是单峰的。在配电网中,不同的电容器组投切组合、不同的变压器分接头档位、不同的分布式电源出力配比,完全可能对应数值非常接近的优秀解,但它们对应的设备状态却天差地别。如果算法只想着“找到最优的那个点”,它天然会把所有个体往一个峰上拉,最终给你一个“数字最优但现场不可行”的结果。
1.3 工程现场的第二个需求:要备选方案,而不是唯一答案
我在实际项目里观察到一个规律:运行方式评审阶段,真正需要的不是一匹“最瘦的马”,而是一组“都能跑的马”。某个设备可能近期要计划检修,某个变压器不允许频繁调档,某些区域在下个时段负荷增长很快,这些因素在优化模型里很难完全量化,所以工程技术人员更希望算法输出若干个差异明显、性能接近的候选方案,再由人来结合边界条件拍板。
这就引出了小生境(Niche)技术。小生境原本是生态学概念,指一个物种在生态系统中所占据的特定资源空间。放在优化算法里,它的核心思想是:让种群里不同的子群分别盯住解空间里不同的峰,既保持一定的独立性,又通过信息交流保证全局收敛能力。这样一来,算法跑完以后得到的不是“一个最优解”,而是“一群互有差异的优质解”,每个解对应一套真实的设备运行状态。在我看来,这才是配电网优化问题的本质需求——协调的最终目标不是数学上的唯一极值点,而是工程上可执行的一批方案。
2. 标准粒子群为什么会“集体溺水”,以及小生境怎么把人捞上来
2.1 一个简短的PSO复习
标准粒子群优化(PSO)的更新公式相信大多数读者都不陌生:
速度更新: v_i(t+1) = w * v_i(t) + c1 * r1 * (pbest_i - x_i(t)) + c2 * r2 * (gbest - x_i(t))
位置更新: x_i(t+1) = x_i(t) + v_i(t+1)
其中w是惯性权重,c1和c2是学习因子,r1和r2是[0,1]之间的随机数,pbest_i是个体历史最优位置,gbest是整个种群的全局历史最优位置。
这套机制的本质,是用“个体记忆”和“社会记忆”共同引导粒子飞向越来越好的区域。问题恰恰出在“社会记忆”上:gbest是一个全局信息,它像一块强力的磁铁,不断把所有粒子往自己所在的位置拉。只要gbest在一段时间内没有改善,周围的粒子就会密集聚集在它附近,整个种群在决策空间中的覆盖范围迅速缩小。
2.2 小生境的本质:让一组粒子盯住一个峰,而不是全体盯一个峰
配电网优化里的多峰环境,用大白话来说,就是同一个优化目标下存在着多个“山头”。标准PSO跑起来之后,谁先找到一个不错的山头,谁就成了gbest,然后全队的粒子都往那个山头飞,其他山头上的也许更好的解就被系统性丢弃了。
小生境技术就是针对这一点做文章。它把“整个种群共享一个gbest”的思路,改成“让不同子群各自保留自己的局部最优”。每个子群就像一个物种,占据一个山头,群落之间通过距离或适应度关系互相排斥,保持一定的分离度。这样做的好处有两层:第一,探索面更广,不容易漏掉真正的全局最优——因为不同子群不会在迭代初期就全部挤到一起;第二,迭代结束时,每个子群可以分别输出自己的最优解,自然形成一组有差异的候选方案。
这里要特别强调一个容易误解的点:小生境粒子群并不是简单地“跑多次PSO然后把结果收集起来”。它是在同一个群体里通过适应性机制自发形成子群,子群之间既有竞争也有交流,计算效率比多次独立运行要高得多,而且子群之间的信息迁移还能避免某个子群掉进过差的局部区域。
2.3 NPSO与标准PSO的差异对比
下面这个表格是我在测试算例里反复对比后得出的直观印象,不是理论推导,但对方案选型很有参考价值。
| 对比维度 | 标准PSO | 小生境PSO(NPSO) |
|---|---|---|
| 全局搜索能力 | 中上,容易受gbest牵引 | 强,多个子群并行探索 |
| 最终输出解的数量 | 通常只有一个最优解 | 一簇相互分离的候选解 |
| 收敛速度 | 前期快,后期可能停滞 | 前期稍慢,中期加速 |
| 早熟风险 | 高,粒子易聚团 | 低,子群间有排挤机制 |
| 适合的问题类型 | 单峰或弱多峰问题 | 强多峰、多工程备选场景 |
| 调参难度 | 较低 | 较高,需关注小生境半径 |
标准PSO当然也可以用来解配电网优化问题,很多论文里也这么用。但如果你做过实际运行方式分析,就会发现它给出来的答案“很脆”:稍微改一点负荷数据,最优方案可能跳到完全不同的电容器组合上,缺乏稳定性。NPSO因为同时保留多个峰上的解,某个峰受负荷波动影响后,另外几个峰上的备选方案还能顶上,这种稳定性在工程评审里是非常重要的隐性价值。
3. 三种小生境机制的对比:我在配电网算例里逐个试过
3.1 排挤机制(Crowding)
排挤机制的思路很朴素:每一代更新后,把新粒子和种群中随机抽出来的一部分个体做相似度比较,如果新粒子与某个旧粒子在决策空间中距离很近,就用新粒子替换旧粒子。这样做的效果是,新生成的粒子如果与某个已有群体高度相似,它就很难“加塞”成功,从而保护了那些人烟稀少的区域。
排挤机制的优点是不需要修改适应度函数的计算公式,实现简单,计算开销小。但它在配电网问题上有一个明显的短板:替换方向不容易控制。如果比较群体大小CF设置得太小,稀有种群可能被误替换掉,多样性反而下降;设置得太大,计算量又上来了。而且排挤机制本质上是一种“防守型”策略,它防止种群过度聚集,却不主动引导子群去定向搜索未探索的区域。
3.2 适应度共享(Fitness Sharing)
适应度共享是另一条完全不同的思路,也是我在多个算例里用得最多的一种。它的核心是修改个体的适应度值:先计算粒子i与种群中其它粒子之间的欧氏距离,再根据共享函数s(d_ij)计算共享度,如果两个粒子靠得越近,共享度越高,最终把原始适应度做如下修正:
shared_fitness_i = raw_fitness_i / sum_j s(d_ij)
在共享函数中,距离小于阈值σ_share的粒子之间会互相“摊薄”适应度。换句话说,挤在一堆的粒子,即使它所在的区域本身条件很好,群体优势也会被摊薄;独自呆在偏远区域的粒子,哪怕条件稍差,相对适应度也会被抬高。这样一来,自然选择的压力会迫使粒子向不同的区域分散。
适应度共享在多峰函数上很有效,但它对σ_share这个参数比较敏感。σ_share设得过大,所有粒子都被当成同一簇,算法退化成标准PSO;设得过小,每个粒子几乎不共享,失去了“排挤”的意义。我在配电网算例中的经验是,先跑一次标准PSO观察粒子的距离分布,再取距离分布的分位数作为σ_share的初始值,这样可以避免纯靠猜。
3.3 物种形成(Speciation)
物种形成机制更接近生态学里“物种”的原意。算法周期性地根据粒子之间的距离把种群划分成若干“物种”,每个物种内部保留一个种子(通常是该物种内适应度最好的粒子),然后物种内部按标准PSO方式更新,物种之间互不干扰。有时候还会设计“迁移算子”,让不同物种的种子互相交换信息。
物种形成的优点是每个子群内部的局部搜索能力有保障,不会出现适应度共享那样“所有粒子都挤在中间地带”的模糊状态。缺点是划分物种本身需要额外的距离计算和聚类逻辑,比如物种划分频率、种子更新规则、物种最大数量这些都要单独设计。一旦参数没配对,可能会出现物种数量震荡、种子反复切换、算法无法稳定收敛的情况。
3.4 我的选择与理由
综合做过的算例,我最终采用的是“适应度共享+物种形成”的组合思路:先用共享适应度机制在种群层面让粒子散开,再在每次迭代时以当前适应度排名靠前的粒子为种子,划分出若干个物种,每个物种内部用标准PSO的速度-位置更新公式进行局部搜索。结构上,共享机制负责“全局排挤”,物种机制负责“局部收敛”,两者互补。
这个组合的一个好处是比较稳健。配电网优化问题的变量空间不是特别高维(通常是几十维),但多峰特性非常明显,组合机制既不会像纯排挤那样容易误伤稀有粒子,也不会像纯适应度共享那样在后期缺乏局部收敛动力。如果你刚开始接触NPSO,我建议先从适应度共享入手,跑通了以后再叠加物种形成,不要一上来就上全套,否则出了问题不好定位是哪个环节的锅。
4. 目标函数、约束与编码:从物理问题翻译成优化问题
4.1 有功-无功协调优化的目标函数
在配电网环境下,最有代表性的两个优化目标是有功网损最小和节点电压偏差最小。有功网损直接反映经济运行水平:
Ploss = Σ i,j (I_ij^2 * R_ij)
这里的I_ij是支路电流幅值,R_ij是支路电阻,求和遍历所有支路。电压偏差则反映电能质量:
V_dev = Σ i |V_i - V_ref|
其中V_ref是参考电压,通常取额定电压或1.0标幺值。
实际使用中,我习惯把两个目标加权成一个综合指标。权重怎么定?如果你的场景更关注经济运行,就把网损权重调大;如果现场电压越限问题严重,就把电压偏差权重调大。比较稳妥的做法是先分别跑一次单目标优化,看两个目标各自的量级,再用量级的反比作为权重初始值。比如网损优化结果约150kW,电压偏差优化结果约0.35标幺和,那么权重比可以设置在0.35比150附近,这样两个项对总适应度的贡献基本相当,不会出现某一个目标把另一个完全淹没的情况。
4.2 约束条件:一个都不能少
约束条件里,潮流方程是最底层的物理约束。配电网一般呈放射状或弱环状,电阻比较大,我习惯用前推回代法求解潮流:先假设各节点电压为额定值,从末端向首端推支路功率,再根据首端电压从首端向末端回代求解各节点电压,反复迭代直到收敛。前推回代法对放射状网络收敛速度快,编程也简单,非常适合嵌在优化算法里每次评估都调用。
其他约束包括:
- 节点电压上下限:通常要求0.95~1.05标幺,现场可能有差异化要求;
- 支路电流限值:不能超过导线载流量;
- 变压器分接头档位:只能在有限离散档位之间变化,且分接头动作次数在工程上有约束;
- 电容器组数:每组容量固定,只能整组投切;
- 分布式电源有功、无功出力范围:逆变器无功容量受视在功率限制。
这些约束里,无功出力的可行域尤其要小心。光伏逆变器的无功调节能力不是一个固定区间,而是和当前有功出力相关的一个圆:Q_max = sqrt(S_max^2 - P_current^2)。如果忽略这个约束,优化算法很可能选出“理论上存在、实际上逆变器发不出来”的无功设定点。
4.3 决策变量的编码策略
配电网协调优化的决策变量可以分成两类:连续变量(DG有功削减量、DG无功输出)和离散变量(电容器组档位、变压器分接头档位)。我采用的编码方式是构造一个实数向量,向量长度等于连续变量数加离散变量数。位置更新时,所有维度都按实数处理,但评估目标函数前,离散维度用四舍五入取整,再换算成实际的设备档位。
这种编码方式实现简单,但它有一个副作用:离散维度的“四舍五入”会让适应度函数出现锯齿状跳变,粒子在连续空间里走一小步,映射到离散空间后设备状态可能完全变了个样。后面我会在第6节专门讲怎么处理这个坑。
约束处理我选择了罚函数法加可行性优先规则。对越限的约束量计算一个惩罚值,乘以惩罚系数加到适应度上。惩罚系数不能太小,否则算法会频频送出越限解;也不能太大,否则惩罚项淹没了真实目标,优化变成了“找内点”的游戏。我在算例里常用的做法是:先设一个较小的惩罚系数,观察潮流越限节点数量在迭代过程中的变化,如果越限节点始终不减少,就把惩罚系数按2倍步长往上调,直到越限量在迭代后期能稳定收敛到可接受的水平。
5. NPSO求解配电网优化的完整流程与伪代码
5.1 总体计算流程
整个求解过程可以拆成下面几个模块,每个模块单独测试,最后再串起来跑。
第一步是初始化种群。我建议用拉丁超立方采样代替纯随机均匀分布,因为配电网决策变量维数不高但范围差异很大,比如DG有功出力可能是0到2MW,而电容器档位只有0到10,拉丁超立方能在高维空间里更均匀地覆盖各个维度。
第二步是对每个粒子做潮流计算。把粒子解码得到的设备状态代入网络,运行前推回代潮流,得到节点电压、支路功率和网损。如果潮流不收敛,说明当前解已经完全偏离可行域,直接给一个很大的适应度惩罚值,不让它参与后续的竞争。
第三步是计算共享后的适应度。先计算粒子之间的欧氏距离,再按共享函数修正适应度。这里要提醒一下,距离计算最好在归一化后的决策空间中进行,否则量纲不同会导致距离被量级大的维度主导,共享机制就失效了。
第四步是更新速度与位置。对每个粒子,按标准PSO公式更新,然后处理边界越限问题,对离散维度取整,对连续维度如果超出边界就采取“边界吸收”策略,也就是直接把越限维度的值拉到边界上,同时把对应速度分量置零,避免粒子反复冲出边界。
第五步是更新小生境信息。根据共享机制和当前种群的分布,识别出若干物种,更新每个物种的局部最优以及整个种群的全局最优。
第六步是检查收敛条件。我一般设两个条件:达到最大迭代次数,或者全局最优连续若干代没有明显变化。要注意,在NPSO里全局最优的波动比标准PSO大,因为物种划分会带来信息交互的振荡,判断“没有明显变化”时常需要设置一个相对宽松的阈值。
5.2 伪代码:可以直接落地实现
下面这份伪代码是我在测试算例中实际使用的逻辑骨架,去掉了一些工程细节,保留核心流程,方便你对照实现。
# 初始化 pop = latin_hypercube_sampling(bounds, pop_size) vel = zeros_like(pop) pbest = pop.copy() pbest_fitness = [inf] * pop_size # 小生境参数 sigma_share = calculated_from_distance_distribution(pop) for gen in range(max_gen): # 1. 解码并计算潮流,得到原始适应度 raw_fitness = [] for i, particle in enumerate(pop): decoded = decode(particle) # 离散维度取整 pf = power_flow_solver(decoded) if not pf.converged: raw_fitness.append(HUGE_PENALTY) continue raw_fitness.append(weighted_loss(pf)) # 2. 适应度共享修正 shared_fitness = fitness_sharing(pop, raw_fitness, sigma_share) # 3. 更新个体最优和全局最优 for i in range(pop_size): if shared_fitness[i] < pbest_fitness[i]: pbest[i] = pop[i].copy() pbest_fitness[i] = shared_fitness[i] gbest_idx = argmin(shared_fitness) gbest = pop[gbest_idx].copy() # 4. 物种形成:按距离聚类,保留每个物种的最优种子 species = form_species(pop, shared_fitness, species_radius) # 5. 标准PSO更新,物种内使用自身最优种子引导 for i in range(pop_size): local_best = species_best_for_particle(species, i) vel[i] = w * vel[i] + c1 * r1 * (pbest[i] - pop[i]) + c2 * r2 * (local_best - pop[i]) pop[i] = pop[i] + vel[i] pop[i] = enforce_bounds(pop[i], bounds) pop[i] = snap_discrete_dims(pop[i]) # 6. 动态调整惯性权重、小生境半径 w = 0.9 - 0.5 * (gen / max_gen) sigma_share = adaptive_sigma(pop, sigma_share, gen) # 结果聚合 solutions = collect_non_overlapping_solutions(pop, pbest_fitness, sigma_share)从这段代码可以看到,NPSO在标准PSO的基础上增加了三个关键模块:适应度共享计算、物种形成、以及基于小生境信息的局部引导。每个模块都有独立的作用,不建议省略。
5.3 参数取值建议
对于配电网有功-无功协调优化问题,参数我建议按下面这个表格的范围来设置,再根据具体算例微调。
| 参数 | 建议取值 | 说明 |
|---|---|---|
| 种群规模 | 40~80 | 决策变量多时可取到100 |
| 最大迭代次数 | 100~300 | 前推回代潮流较快时可适当增加 |
| 惯性权重w | 0.9线性衰减到0.4 | 前期权重高利于全局搜索,后期低利于局部收敛 |
| 学习因子c1/c2 | 1.5~2.0 | 一般取1.496作为经典值 |
| 小生境半径sigma_share | 归一化空间的0.1~0.2 | 先统计距离分位数再定 |
| 惩罚系数 | 按约束量级逐步调整 | 原则是越限解不能成为最优 |
| 潮流不收敛惩罚值 | 1e6量级 | 需要足够大,又不能溢出 |
5.4 在标准33节点配电网算例上的结果解读
我在一个经典的33节点放射状配电网算例上做了验证,系统包含一个主变电站、32条支路,在其中几个节点接入分布式光伏电源,并配了若干组可投切电容器和一台有载调压变压器。优化目标是有功网损最小加电压偏差最小,决策变量包括光伏有功削减量、光伏无功输出、电容器组档位、变压器分接头档位。
标准PSO单次运行的结果是:收敛到一组解,网损从原始状态下的约200kW降到约140kW,电压偏差也有明显改善,但如果你尝试修改其中某一个光伏节点的出力,整个方案的网损会立刻反弹。NPSO跑完之后,程序聚出三个差异明显的峰:一个峰对应光伏有功削减较少、电容器多投一组,网损最低但分接头动作较频繁;另一个峰对应变压器分接头档位变化少,更温和;第三个峰是电压偏差最小的方案,网损稍高但电压曲线更平坦。三个方案的目标值差距在5%以内,但设备运行方式差异很大,正好可以作为不同运行场景下的备选。
收敛过程上,NPSO前30代左右因为物种形成机制需要适应和划分,最优值下降速度不如标准PSO,但随着共享机制发挥作用,后续收敛到更优区域的概率明显更高。对我而言,算法多花几十代迭代换来的不是单点最优,而是一组可交付工程讨论的方案,这笔账非常划算。
6. 调参经验、常见坑与改进方向
6.1 潮流不收敛时的“限幅惩罚”技巧
NPSO在迭代初期会生成大量极端粒子,尤其是离散维度取整后,可能形成严重违反物理规律的潮流条件,导致前推回代法不收敛。我的处理办法是给潮流不收敛的解赋予一个很大的正数作为适应度,但要注意这个正数不能是Python里的浮点数最大值,否则后续适应度共享计算时容易出现数值溢出,产生NaN,整个种群就崩了。我习惯用1e6这样的显式大数,并且把共享修正后的适应度做一个限幅,比如不超过1e7,保证数值计算稳定。
还有一个经验:不收敛的解不一定完全没有信息量。如果只是轻微不收敛,可以把前推回代循环里最后一次迭代的电压偏差作为参考信息,而不是直接一刀切判死刑。比如设置一个“接近收敛”的阈值,让这类粒子返回一个比真的不收敛粒子的惩罚稍小一点的值,这样算法仍然保留了一部分朝向可行域的梯度信息。
6.2 小生境半径的设定:先统计,再拍板
我在第3节提到过,σ_share设不好会让NPSO退化成标准PSO或者失去群体协作能力。最有效的做法是:先用标准PSO跑20~30代,记录每对粒子之间的欧氏距离分布,把统计得到的25%~30%分位数作为σ_share的起点;然后再试几个相邻值,观察最终输出的解集中不同解之间的距离是否保持在一个合理的范围。
如果输出解的欧氏距离普遍小于σ_share,说明共享压力不够,粒子最终还是聚到了一起,需要适当调小σ_share;反过来,如果解的分布太散,甚至出现明显的低质量解,说明共享机制把种群过于“摊薄”,局部收敛能力不足,需要调大σ_share。也可以采用动态策略:迭代初期σ_share设置大一些,让粒子快速散开;迭代后期逐渐减小,让每个子群专注于自己的峰。
6.3 整数变量取整带来的“锯齿效应”
这个坑我在编码环节提到过,这里具体说下解决思路。离散维度取整后,粒子在连续空间里移动很小距离,映射到离散设备档位后可能跳变一档,造成适应度值突然变好或变坏。这种“锯齿效应”会让粒子群的更新方向严重失真,甚至出现两个位置相差极小的粒子,适应度值却一个在天上一个在地下,导致小生境距离计算失去意义。
我的处理技巧是给离散维度维护一个“连续影子变量”,每次评估前才取整,评估后的适应度暂时挂到取整后的位置上。另外一个更实用的补救措施是在取整后做一次局部搜索:对于电容器组和变压器分接头这类低维度离散量,把当前档位分别加减1档,取这三个方案中最优的那个作为当前粒子的评估结果。这个小技巧会让每轮评估多跑几次潮流,但换来的是适应度曲面的连续性大幅提升,粒子更新方向更可信。
6.4 可扩展的两个方向
第一个方向是多目标化。加权单目标的好处是简单,代价是你需要预先设定权重,而且权重设置会直接影响最终解落在哪个区域。改为多目标版本后,算法可以输出一组非支配解集,让决策者直观看到网损和电压偏差之间的帕累托权衡关系,不同运行偏好下可以直接从解集里挑方案,不必重新跑优化。对小生境粒子群来说,多目标的扩展也相对自然——每个物种内部可以维护一个小范围的帕累托前沿,物种之间的共享机制依然有效。
第二个方向是和深度代理模型结合。配电网规模一大,比如跑到几百个节点、几千个负荷点,每代几百次潮流计算的总耗时就很可观了。一个自然的加速方案是先用深度学习网络学习潮流计算的输入输出映射,用网络输出代替一部分前推回代计算,只在关键候选点才调用精确潮流验证。这样做的风险是代理模型误差可能让算法误判峰的高矮,所以对精度敏感的应用场景需要保守使用,或者把代理模型作为粗筛选,再用精确计算确认最终候选解。
6.5 从算法回看工程:一个方案的“可交付性”
再说一点代码之外的体会。NPSO跑出的解集里,有的方案网损不是最低的,但设备动作最少;有的方案电压曲线最平,但网损稍微高了点。项目评审时,这些方案不是拿来“选最优”的,而是拿来“做比较”的——让运行人员结合检修计划、负荷变化趋势、设备寿命损耗这些模型外因素来拍板。这种由算法提供多样性、由人来最终裁决的协作模式,在实际项目里比“算法直接给一个答案”要顺得多。
所以,如果你也是做配电网优化相关工作的,我的建议是:别只盯着小生境粒子的数学形式,多想一想它输出解集之后怎么和工程决策衔接。算法本身不复杂,复杂的是让一组数字真正变成现场可执行的操作方案。NPSO在这个环节帮了大忙,因为它天然地保留了多个选择,而不是满怀自信地给你唯一答案。