从实际工程角度来讲,分布式电源的选址定容是个典型的组合优化难题——装在哪、装多大,这两个问题直接决定了配电网运行是否经济、电压是否合格、线路是否过载。传统做法多靠经验试算,碰上稍微复杂一点的网络基本就抓瞎了。而多目标遗传算法恰好能在这个场景里派上大用场,它天然适合处理这种离散决策变量加多指标冲突的问题。这篇文章就围绕"基于多目标遗传算法的分布式电源选址定容"这条主线,把我实操中的建模思路、算法参数整定、踩坑记录一起聊透,尤其适合正在做配电网规划、综合能源系统优化或者刚接触智能算法的研究生和一线工程师参考。
1. 问题拆解:分布式电源选址定容到底在优化什么
1.1 从工程需求反推数学模型
选址定容问题的本质,是把分布式电源当成一组可以主动控制的决策变量,塞进一个现有的配电网拓扑里,让整个系统在某些指标上达到最优。这里的决策变量有两类:一是接入节点编号,属于离散整数变量;二是接入容量,通常是连续的或者按档位取整。这两类变量叠加在一起,解空间呈指数级膨胀,想靠枚举穷举完全不现实。
工程上最关心的目标一般逃不出这几个:系统网损最小化、电压偏差最小化、分布式电源投资运行成本最小化,有时还有环境效益最大化。这些目标之间往往存在冲突,比如想降低网损,可能就得加大DG接入容量,投资成本就上去了;想改善电压分布,DG的位置可能就得往线路末端放,但末端接入又可能引发反向潮流和保护配合问题。多目标优化的意义就在于,不再强行把这些指标压成一个单值,而是求解出帕累托前沿,让决策者根据实际偏好去挑方案。
我见过不少初学者上来就写一个加权求和的目标函数,把网损、电压、成本三个量直接加起来。这种做法不是绝对不行,但问题在于权重的选取没有客观依据,而且非法语量纲差异巨大,动辄一个量就到10的4次方,另一个量还在0.01量级晃悠,加权后小的那个直接被淹没,优化等于白做。真正稳妥的做法是保持多个目标函数独立,用多目标算法去解。
1.2 为什么挑遗传算法而不是粒子群、模拟退火
选址定容的解空间里既有离散量又有连续量,而且非线性程度高。粒子群算法在连续优化上表现出色,但碰到整数决策变量就需要额外的取整和修正机制,处理不当很容易丢失搜索方向。模拟退火收敛稳定,但单点搜索的串行特性让它在大规模网络(比如上百个待选节点)面前效率偏低。
遗传算法出生的基因就决定了它适合这种场景:种群并行搜索天然覆盖多组候选方案,交叉变异算子能自然地操作离散编码(比如节点编号用整数编码后交叉),同时它也不依赖目标函数的导数信息,非凸、不连续的问题照样能解。配合非支配排序和拥挤度距离,还能在收敛性和多样性之间达成平衡,这也是NSGA-II在同类工具中出镜率最高的原因。
2. 多目标遗传算法的核心机制与选型逻辑
2.1 非支配排序、拥挤度距离与精英保留
NSGA-II能成为这类问题的默认选项,靠的是三个关键机制。
第一个是非支配排序。每一个个体(一套选址定容方案)在目标空间里都能算出一组目标值,如果一个方案在所有目标上都不劣于另一个方案,且至少有一个目标严格更优,那它就支配对方。算法按照支配关系把种群分成多个层级,第一层就是当前种群的非支配解,后续层级逐层排除。排序的目的很清楚:让帕累托前沿上的个体获得更高的生存概率。
第二个是拥挤度距离。同一层级的个体之间,如果挤在目标空间的某一片小区域,多样性就差。算法为每个个体计算它在目标空间中与邻居的距离,距离大的个体代表周边空缺区域,优先保留。这保证了帕累托前沿能尽量铺开覆盖,而不是聚在一个局部。
第三个是精英保留策略。每一代进化完成后,把父代和子代合并成一个临时种群,统一进行非支配排序和拥挤度选择,优秀的父代个体不会因为进化过程中的随机波动被淘汰。这相当于给好方案上了个保险,避免"辛辛苦苦找到的好解又被后面的坏解挤掉"这种尴尬局面。
2.2 编码策略与遗传算子的工程适配
编码方式直接影响算法性能。选址定容里最常见的做法是整数编码加实数编码混合——假设待选节点有33个,每个DG用一个基因位表示,取值在1到33之间,对应节点编号;容量基因用实数表示,范围根据变压器容量和线路载流能力设定。也有人在容量部分用二进制编码,但位数太多会导致染色体过长,搜索效率反而下降,所以我个人更倾向用实数编码,配合模拟二进制交叉和多项式变异。
关于交叉算子,SBX分布指数设成20是经验值,效果比较稳。变异概率不能太大,我一般控制在0.05到0.1之间,过大容易把已经收敛的个体破坏掉。还有一个不太被重视的细节:节点编号基因用整数交叉后,如果父代两个个体的节点编号完全一样,交叉就退化了。建议在交叉操作里加一个判断,如果两个个体的整数段完全相同,就强制对这部分做一次局部变异,保证种群活跃度。
3. 分布式电源选址定容的数学模型构建
3.1 目标函数怎么定才不会打架
我在实际项目中采用的目标函数包含三个:
第一个是系统网损最小化,表达式为f1 = Ploss,代表所有支路的有功损耗总和。这个值直接反映降损收益,也是电网公司最关心的指标之一。基准系统(比如IEEE 33节点标准配网)不接DG时的网损大约在202千瓦左右,接入DG之后如果能压到150到160千瓦,降损效果就很可观了。
第二个是电压偏差最小化,表达式为f2 = Σ(|Ui - Uref| / Uref),其中Ui是节点i的实际电压幅值,Uref取标幺值1.0。配电网的电压质量是硬约束,DG接入后如果电压偏差反而变大,那这个方案再省电也不能要。需要提醒的是,电压偏差目标的计算中,潮流计算必须收敛后才有效,如果潮流计算直接发散,这个个体应该直接淘汰,而不是给它一个很大的惩罚值——因为发散状态下的目标值没有任何物理意义。
第三个是综合经济成本最小化,表达式为f3 = CDG + CO&M + Cbuy。CDG是分布式电源的年化投资成本,CO&M是年运行维护成本,Cbuy是系统从上级电网购电的年费用。DG容量建得越大,投资运维成本越高,但购电费用会下降,这里本身就存在一个经济平衡点,需要通过优化去找。
这三个目标的量纲差异很大,网损和成本都是千瓦或者万元级别,而电压偏差是标幺值的累加,常常只有0.1到0.5之间。多目标算法不需要合并它们,这正好是它相对于加权单目标法的优势所在。
3.2 约束条件的处理方式直接决定可行性
约束条件分两类处理。
等式约束就是潮流方程,也就是Pf + PDG - PL = 0和Qf + QDG - QL = 0在平衡节点的前提下成立,这个靠调用潮流计算程序自动满足,约束处理无需额外操心。
不等式约束要麻烦一些。节点电压幅值必须限制在0.95到1.05(标幺值)之间,支路电流不能超过载流量上限,DG总装机容量不能超过系统总负荷的一定比例(一般是20%到30%)。对于这些约束,我采用的处理思路是罚函数法加修复机制的结合——先判断个体是否越限,越严重的就给一个递增的惩罚系数,加到各个目标值上;如果越限特别严重(比如潮流直接发散),则直接标记为不可行解,不参与非支配排序。
但光有罚函数不够,因为罚得轻了不可行解会混进前沿,罚得重了又会拖慢收敛。我的做法是额外加一层修复机制:对电压越限的个体,先计算越限程度,在解码阶段把DG容量往小修一点;对DG接入容量超限的个体,直接截断到上限。这样大部分个体在诞生初期就被"掰正"了,罚函数只处理少量漏网之鱼,收敛速度明显更快。
4. 实操全流程:从搭建仿真到输出帕累托前沿
4.1 仿真环境与基础数据集准备
我用的是MATLAB环境,配电网潮流计算部分调用Matpower工具箱,遗传算法部分自己写NSGA-II框架。整体流程分四步:数据准备、编码初始化、进化迭代、结果解码输出。
数据准备阶段最容易被忽视,也最坑。IEEE 33节点标准系统的参数网上到处都有,但不同版本之间可能会有出入,节点间的连接关系、线路单位阻抗、基准电压这些必须严格统一,否则算出来的网损和潮流分布互相差一大截。我习惯先把数据导入之后做一个简单的潮流校验,如果根节点注入功率和全网负荷加网损对不上,就说明数据有错,得先修数据再继续往下走。
另外,DG的运行功率因数也要提前设定。我一般设定为0.95滞后,也就是发有功的同时也吸收一定无功,这样对电压支撑更有利,但也别设成1.0,因为太理想的条件会掩盖实际运行中的问题。
4.2 NSGA-II关键参数设置与迭代策略
种群规模我设为100,最大迭代次数200代。这个参数组合在33节点系统上规模适中——种群太小多样性不够,帕累托前沿稀稀拉拉分布不完整;种群太大计算量增长明显,但33节点场景里200代跑完大约也就十几分钟,完全可以接受。
交叉概率设为0.9,变异概率0.05,交叉分布指数20,变异分布指数20。这些参数是从多次实验中总结出来的相对稳健组合。有一点值得留意:判断收敛不能只看迭代次数,我通常会每隔10代记录一次当前种群的非支配解数量,如果连续20代这个数字没有上升,就说明种群已经进化不动了,这时候即使没到200代也可以提前停机,节省算力。
潮流计算在每一代中要对每个个体调用一次,100个个体跑200代就是20000次潮流计算。Matpower在33节点系统上单次大约几毫秒,总耗时还在可接受范围内。如果换了更大规模的网络(比如119节点或者实际馈线),我建议先用并行计算工具箱把种群内个体的潮流计算并行化,这个优化能让整体耗时下降一半以上。
4.3 结果可视化与前沿解的实际判读
进化结束后,先把帕累托前沿的所有解画成三维散点图,三个坐标轴分别是网损、电压偏差、成本。一个合格的前沿应该分布在目标空间的左下方,呈现出接近于凸曲面的分布形态。如果前沿在某个目标方向上缺失一大片,说明针对性搜索不足,需要增加那个方向上的变异概率或调整目标值的缩放范围。
有个直接可用的判读经验:前沿两端各取一个极端解,优先看两点。一端是网损最小的方案,这个方案通常DG接入容量较大、接入位置较分散,电压改善也相对明显;另一端是成本最小的方案,往往DG接入较少,网损和电压指标会差一些。实际工程选择可以采用模糊隶属度法或者折中解方法,从所有前沿解里挑一个距离理想点(各目标分别取最优值构成的虚拟点)最近的点。这个点在三维空间里是到原点的欧氏距离最小,但要注意各目标的归一化,否则成本这个数量级最大的目标会主导距离计算,选出来的解毫无实际意义。
5. 常见问题与排查技巧实录
5.1 帕累托前沿退化或缺失的对策
现象就是画出来的前沿点很少,甚至只有一个点。最常见的原因是目标函数的量纲差异导致某个目标在排序中占据绝对主导地位,比如成本是10的4次方量级,网损和电压在它面前完全不起作用,最后选出来的方案全是成本优先。解决思路是把各目标在做非支配排序前先做个归一化预处理,让各自的最小值和最大值映射到0到1区间,排序时看不出原始量纲的权重差异。
还有一个容易被忽略的问题:种群初始化时方案分布太均匀,所有个体的DG接入位置和容量都在一个很小的范围内。这样不管怎么进化,搜索空间都被局限住了,前沿自然铺不开。初始化时建议用均匀随机抽样的方式,让每个个体的接入点位尽可能分散,最好覆盖整个网络拓扑的不同区域。
5.2 潮流不收敛与约束越限如何处理
潮流不收敛分两种情况。一种是DG容量设得过大,节点注入功率超过了系统承受能力,导致潮流方程的雅可比矩阵奇异。这种情况要在解码生成初始个体时就设一个容量上限,比如DG总容量不超过系统总负荷的30%,从源头杜绝极端个体的诞生。另一种是个体对应的网络结构有孤立节点或开环运行情况,这时需要检查拓扑数据,确保所有节点都在连通域内。
电压约束越限的处理我用的是混合策略。先做一次潮流计算,把越限节点找出来,如果越限幅度极小(比如电压只有0.949),直接靠罚函数拉回来;如果越限明显(比如低于0.9),就调整该个体对应的DG容量基因,向减小的方向偏置,然后再重新做潮流计算。这个修复循环最多执行三次,三次后仍越限就放弃修复直接罚死。实测下来,这个混合策略比纯罚函数方法在前沿覆盖度上好了不少。
5.3 算法早熟与参数敏感性的经验总结
早熟表现为迭代没几代,整个种群的目标值就完全一致了。原因是种群多样性流失太快,好一点的做法的重启动机制来缓解——每隔一段时间,用当前最优解的邻域重新生成一批随机个体,注入主种群。这些新血个体虽然目标值不一定好,但基因组合不一样,能给进化提供新的搜索方向。
关于参数敏感性,我给一个经验速查表供参考:
| 参数 | 推荐范围 | 参数偏大时的表现 | 参数偏小时的表現 |
|---|---|---|---|
| 种群规模 | 80到150 | 计算慢,但前沿稳定 | 前沿稀疏,容易漏解 |
| 交叉概率 | 0.85到0.95 | 搜索快但可能丢好解 | 收敛慢,进化迟缓 |
| 变异概率 | 0.03到0.08 | 收敛困难,前沿震荡 | 容易早熟,多样性差 |
| SBX分布指数 | 15到25 | 子代接近父代,搜索保守 | 子代偏离大,破坏性强 |
| 多项式变异指数 | 15到25 | 变异幅度小 | 变异幅度大,解易跳飞 |
这套参数在33节点系统上表现稳定,但换到其他网络时不要直接照搬,建议先跑10代做一次灵敏度分析,看看各参数上下浮动20%的解集差异,再做针对性调整。
6. 从仿真到工程落地的经验之谈
仿真模型建得再好,落不了地也是白搭。选址定容的最终交付物从来不是一个帕累托前沿图,而是一份标注了具体接入位置、接入容量、预期效益的实施方案文档。我的习惯是选完折中解之后,在仿真模型上做一次时序化校验——把实时负荷曲线和DG出力曲线装进去,按小时步长跑一整天的潮流,看看电压波动和线路负载率是否都在安全范围内。这一步看似多余,但实际上相当有必要,因为稳态的单一工况评估根本暴露不了午间DG出力高峰和夜间负荷低谷期的反向潮流风险。
对配电网规划人员来说,这份方案可以直接作为规划报告的核心章节,配合投资估算和收益率计算形成完整的可研材料。对研究生来说,这套流程可以扩展的方向也很多,比如把时序性纳入多目标模型、考虑DG出力的不确定性、加入储能联合规划等等。我在跑完大量仿真后越来越确信一件事:算法只是工具,真正决定方案质量的还是对工程约束的理解深度,而这只能在一次次试算和纠错中积累起来。