拓冰建站拓冰建站
首页 / 资讯中心 / 正文

配电网分布式电源选址定容的多目标优化与NSGA-II实现

做分布式电源选址定容这个项目说穿了就是回答配电网规划里一个特别实在的问题10千伏馈线上要接光伏、风机或者小型燃气轮机到底接在哪几个节点、每个点装多大容量才能让网损最小、电压最稳、投资回报又划算。这三个目标经常是拧着的——DG装得越靠近负荷中心降损效果越好但好位置往往伴随着地价贵、接入条件复杂容量装得越大削峰填谷潜力越大但投资成本和反向潮流风险也一起蹿上去。传统优化算法遇到这种“多目标离散变量非线性潮流”的混合问题经常束手无策所以我最后把方案定在了多目标遗传算法Multi-Objective Genetic Algorithm, MOGA上用NSGA-II作为主力框架去做非支配排序搜索。这篇文章把我从模型搭建、算法选型到代码落地、结果解读的完整过程都翻出来讲一遍适合正在做配电网规划课题的研究生也适合刚接触智能优化算法、想把它用在电力系统方向上的工程师参考。1. 项目要解决的工程问题与整体思路1.1 选址定容的本质配电网规划中的双变量组合优化先说清楚“选址定容”这四个字到底在优化什么。选址就是从配电网的若干个候选节点里挑出DG的接入位置定容就是给每个接入点分配一个合适的装机容量。这两个变量不是独立的同一个节点装200千瓦和装800千瓦对整个网络的潮流分布影响完全不一样同样容量装在馈线中段和装在线路末端效果也是天壤之别。举个最常见的IEEE 33节点算例系统一共33个节点、32条支路如果候选节点取第2到第33号共32个假设最终要装3台DG每台容量有20个离散档位那么可行方案的数量大约是C(32,3)×20³超过3800万种。这还只是个小型配电网实际配电网节点数量动辄上百工程上根本不可能靠穷举把每个方案都算一遍。更麻烦的是每评估一个方案都要跑一次潮流计算而潮流约束本身是非线性的这导致整个问题变成了混合整数非线性规划MINLP传统分支定界法在这种规模下计算开销极其感人。所以这个项目从一开始就走启发式路线用遗传算法的种群搜索去覆盖这个巨大的解空间把“每个方案都要算潮流”当作适应度评估函数让算法在迭代中自动找到一批足够优秀的候选方案。1.2 为什么必须是“多目标”三个目标函数互相矛盾最初我尝试过把所有目标用权重系数加成单目标跑了一轮发现一个很尴尬的现象权重稍微变一下最优解就从一个极端跳到另一个极端。这就逼着我去正视问题本身的多目标属性。在这个项目里我设置了三个核心优化目标最小化系统有功网损DG接入后应当改善原有馈线的损耗水平最小化节点电压偏差DG应该起到电压支撑的作用而不是制造过电压最小化综合成本包括DG投资、运行维护、网损费用也就是要让“降损和稳压的好处”能覆盖“装DG花的钱”。这三个目标之间天然存在矛盾想要网损最小通常要把大容量DG装在重负荷节点附近但重负荷节点的土地和接网条件往往更苛刻成本更高想要电压偏差最小可能在末端节点装小容量DG更有效但那样对整条馈线的降损贡献又很有限。我把这三个目标放进一张表里看它们的偏好差异优化目标目标方向对选址的偏好对容量的偏好有功网损越小越好靠近高负荷密度区域与负荷水平匹配避免反向潮流电压偏差越小越好电压偏低或线路末端节点适度容量防止过电压综合成本越小越好接网条件好的节点容量档位与设备标准匹配如果只优化一个目标等于把工程上的真实权衡拍扁了得到的方案在落地时往往顾此失彼。所以我决定使用多目标优化拿到一整个帕累托前沿让决策者根据实际情况去选。1.3 算法选型为什么是遗传算法而不是数学规划从数学结构上看选址定容问题同时包含离散变量节点编号、容量档位和连续变量潮流方程里的电压幅值、相角而且潮流约束是非凸的。这个特性决定了传统梯度类算法其实很难施展要么需要求导要么需要把非凸问题做大量松弛松弛之后解出来的结果往往已经偏离了原始问题。遗传算法的优势在于它根本不需要求导。它只需要一件事能对一个个体一组选址定容方案进行适应度评估而这个评估恰好在工程上是可以做到的——跑一次潮流、算一次成本和电压偏差就行。至于目标是离散的还是连续的、约束是线性的还是非线性的在进化搜索框架下面反而不是核心困难。多目标版本则在这基础上多做了两步非支配排序和拥挤度距离计算让种群在朝着帕累托前沿推进的同时还能保持解集在目标空间里分布的多样性。2. 数学模型目标函数、约束与编码设计2.1 目标函数的具体定义与归一化处理目标函数是整个优化的“尺子”尺子没做好后面算法再漂亮也没有意义。我在项目里的三个目标函数定义如下。有功网损目标 f₁f₁ Σⱼ Rⱼ × (Pⱼ² Qⱼ²) / Uⱼ²其中 j 遍历所有支路Rⱼ是支路电阻Pⱼ和Qⱼ是支路末端流过的有功和无功功率Uⱼ是支路末端电压。这个式子是配电网损耗的近似计算式足够用于方案比较。电压偏差目标 f₂f₂ Σᵢ (Uᵢ − U_ref)²i 遍历所有负荷节点U_ref 取1.0标幺值。用平方和而不是最大偏差是为了同时惩罚多个节点的越限问题避免算法把电压“平均化处理”。综合成本目标 f₃f₃ C_inv C_oam C_loss − B_dg其中 C_inv 是DG投资的等年值按使用寿命分摊到每年C_oam 是年运行维护费用C_loss 是网损对应的电价成本B_dg 是DG年发电量按电价折算的收益。用等年值而不是总现值是为了和年网损费用处于同一时间尺度避免量纲错位。三个目标的量纲和数量级差异非常大网损可能是一两百千瓦电压偏差是10⁻³量级的平方和成本则是几十万量级的金额。NSGA-II做非支配排序的时候不依赖目标绝对值大小但在最终方案挑选和可视化时需要做归一化我采用的方法是先跑两轮单目标优化记录每个目标的最大最小值再做线性归一化。注意电压偏差目标千万不要只用最大母线电压偏差MAX|Uᵢ−1|那会丢失“整体电压水平差但某一点刚好合规”的大量信息我在早期版本里吃过这个亏最后改回了平方和形式。2.2 约束条件集合做配电网规划约束条件必须跟实际物理过程对齐否则解出来就是“纸上谈兵”。潮流约束每个节点的注入功率必须满足有功和无功平衡方程这是最底层约束用前推回代法求解节点电压约束U_min ≤ Uᵢ ≤ U_max本项目取0.95~1.05 p.u.也是国标对10kV配电网的常规要求支路电流约束Iⱼ ≤ Iⱼ,max防止DG接入后反向潮流导致线路过载DG容量约束P_DG,i ∈ {0, ΔP, 2ΔP, …, P_DG,max}每台DG容量必须落在离散档位上渗透率约束ΣP_DG ≤ α × P_load_sumα一般取15%~30%防止DG总容量远超区域负荷造成大量倒送功率。约束处理上我采用“硬约束罚函数修复算子”组合对电压越限和电流越限直接施加一个足够大的惩罚量加到适应度函数上对容量越界和总渗透率越界则直接在基因层面修复把容量缩到可行范围内。2.3 决策变量编码与离散化处理编码方式直接影响搜索效率。我采用了一个混合整数编码个体基因分前后两段前半段表示DG接入节点每个基因位是一个整数取值范围是候选节点集合例如IEEE 33节点系统的2~33号节点1号节点通常是根节点和松弛节点不装DG后半段表示对应节点的容量档位也是整数每个档位代表50kVA。举个例子如果规划方案允许装3台DG一个个体就是[12, 25, 31, 200, 500, 300]含义是在12号节点装200kVA、25号节点装500kVA、31号节点装300kVA。按照这个编码规则种群初始化时必须处理三件事节点不重复、容量不为负、容量总和不超过渗透率上限。节点重复会导致一个位置装多台机组这在工程上不是一个独立方案会在后面增加重复修理容量总和超限则直接判定为不可行个体。2.4 为什么拒绝线性加权帕累托支配与帕累托前沿很多第一次接触多目标优化的人会问三个目标加起来搞个权重不就行了为什么还要搞非支配排序这么麻烦问题在于线性加权法只能找到帕累托前沿上的凸部解。当帕累托前沿呈凹形或者非凸形状时线性加权组合无论怎么调整权重都找不到中间那些折中解。更现实的问题是权重系数在工程上根本没有合理依据——你没法跟电网公司说“网损占0.4、电压占0.3、成本占0.3”这个权重是物理定律推导出来的它只是拍脑袋。多目标遗传算法换了个思路不人为设定权重而是通过“支配关系”比较个体优劣。解X支配解Y的口径是X在所有目标上都不差于Y并且至少有一个目标严格优于Y。算法最终保留下来的是整条帕累托前沿也就是一系列“没有办法在不牺牲某个目标的前提下改善另一个目标”的方案。决策者最后从这些方案里挑才符合工程实际的决策逻辑。3. 多目标遗传算法选型与NSGA-II实现要点3.1 主流多目标进化算法横向对比多目标进化算法领域几个成名方案我都有过实际使用体验对比如下算法核心思路优点短板NSGA-II快速非支配排序 拥挤度距离收敛性和多样性均衡实现简单高维目标下拥挤度度量会退化MOEA/D将多目标分解为若干单目标子问题计算效率高前沿分布均匀分解权重和聚合函数对问题敏感SPEA2外部存档 强度支配值解集精度高鲁棒性好归档集更新和剪枝逻辑复杂度高三个算法我都跑过相同算例综合看NSGA-II在目标数为3、种群规模50~80的场景下性价比最高这也是它在电力系统文献里被用得最多的原因。网上资料多、Debug容易对新手比较友好。3.2 本项目选择NSGA-II的理由选择NSGA-II不是因为它“流行”而是因为它有几个特性跟选址定容问题非常匹配。第一是非支配排序可以在一次比较中区分所有个体的帕累托层级让我们能同时保留多个互不支配的优秀方案正好满足“既要降损又要稳压又不超预算”的多目标需求第二是拥挤度距离机制保证解群不会堆在帕累托前沿的某一个角落而是尽量铺满整个前沿这对最终方案挑选至关重要第三是精英保留策略父代种群和子代种群合并后统一筛选确保每一代最好的个体不会丢失收敛稳定性明显好于老式GA。从实现复杂度来讲NSGA-II的核心循环不到两百行和潮流计算模块解耦后可以独立调整优化器参数这对项目迭代很重要。3.3 关键算子细节选择、交叉与变异NSGA-II的进化算子我做了针对性的适配选择算子锦标赛选择每次随机抽两个个体先比较帕累托层级rankrank小者胜出层级相同比较拥挤度距离距离大者胜出。这个策略同时兼顾收敛性和多样性。交叉算子使用模拟二进制交叉SBX分布指数eta_c取15~20。交叉后的容量值按四舍五入修正到容量档位上。变异算子使用多项式变异分布指数eta_m取20左右。对于节点编号这类整数变量变异就是随机替换成候选节点集里的另一个节点并同时检查重复。这里有个工程细节交叉变异产生的子代经常会存在非法解比如两个DG装到了同一个节点。我的做法是先做修复再评估适应度而不是简单地把非法解扔掉。扔掉等于浪费这一次评估预算修复算子则能在保留遗传信息的同时让个体回到可行域收敛速度提升明显。3.4 潮流计算内核选型前推回代法优于牛顿法选址定容问题里适应度评估的核心是潮流计算每一代要跑几十上百次一次潮流算得慢整个优化就得等很久。配电网通常是辐射状网络在这种结构上我用的是前推回代法而不是通用电力系统软件里更常用的牛顿-拉夫逊法。前推回代法的思路分两步前推从末端节点向根节点方向计算各支路功率或电流回代从根节点向末端节点方向计算各节点电压幅值然后反复迭代直到电压修正量小于阈值通常1e-5 p.u.。在辐射状配电网中这个方法的收敛性很好而且无需形成雅可比矩阵单次计算速度比牛顿法快一个量级。DG的接入模型在潮流计算里也有讲究。DG在绝大多数选址定容研究中被建模为PQ节点给定有功出力和功率因数比如0.95滞后这样既符合实际逆变器控制方式又不会让潮流计算因为PV节点处理而变得过重。如果后续要计及DG的电压支撑能力再升级成PV节点模型即可。4. 在IEEE 33节点系统上的完整实现过程4.1 算例系统参数配置项目以IEEE 33节点系统作为标准算例这是辐射状配电网优化领域用得最多的公开测试系统。系统基准电压12.66kV总负荷有功3715kW无功2300kvar一条主馈线带若干分支。预设DG候选节点为第2~33号节点规划安装数量为3台单台容量离散档位从50kVA到800kVA每步50kVA功率因数固定0.95。原始不加DG的基准网损约在202kW附近电压最低点在18号节点附近大约0.903p.u.属于“电压偏低且网损偏高”的典型待优化场景。这个背景数据先跑出来后后面所有优化结果都以它为基线对比。4.2 主流程与核心代码骨架整个优化流程按下面这个顺序执行初始化种群随机生成节点和容量基因对每个个体运行前推回代潮流计算网损、电压偏差、成本三个目标值对种群进行快速非支配排序得到每个个体的帕累托层级计算拥挤度距离锦标赛选择父代执行SBX交叉和多项式变异生成子代父代与子代合并重新排序选取前N_POP个体组成新一代重复步骤2~6直到达到最大迭代代数输出最后一代的帕累托前沿。核心代码骨架用Python写出来大概是这个感觉import numpy as np N_POP 60 MAX_GEN 150 N_DG 3 CAP_STEP 50 # kVA CAP_MAX 800 # kVA CAND_NODES list(range(2, 34)) def init_population(): pop [] for _ in range(N_POP): nodes np.random.choice(CAND_NODES, N_DG, replaceFalse) caps np.random.randint(1, CAP_MAX // CAP_STEP 1, N_DG) * CAP_STEP pop.append(np.hstack([nodes, caps])) return pop def evaluate(ind): u, loss forward_backward_sweep(ind) f1 loss f2 np.sum((u - 1.0) ** 2) f3 annual_cost(ind) return np.array([f1, f2, f3]) def nsga2_main(): pop init_population() for gen in range(MAX_GEN): fits np.array([evaluate(ind) for ind in pop]) ranks fast_non_dominated_sort(fits) dists crowding_distance(fits, ranks) offspring genetic_operators(pop, ranks, dists) pop elitist_replacement(pop, offspring, fits) return pareto_front(pop)注释里那三个函数fast_non_dominated_sort、crowding_distance、genetic_operators都是NSGA-II的标准模块实现时注意排序和距离更新的顺序先按目标值排序再按前沿层级计算拥挤度。4.3 参数调试记录与最终配置参数调试我做了十几轮试算最后稳定在这组配置上种群规模N_POP60迭代代数MAX_GEN150这个规模在普通四核电脑上大约需要几分钟到十几分钟取决于潮流计算速度交叉概率0.9变异概率0.1交叉概率高可以加速优良基因组合变异概率保持在低位防止种群震荡容量档位50kVA候选节点32个单台容量上限800kVA总渗透率上限30%。从结果看典型帕累托前沿上多数方案的网损降低幅度在35%~47%之间电压偏差下降25%~60%这和文献中同类算例的结果区间基本一致。需要说明的是如果增加候选DG数量或提高渗透率上限前沿整体会往更优方向移动但每次潮流评估的负担也会同步上升属于典型的“效果与算力”权衡。4.4 潮流不收敛的修正策略前推回代法在大多数情况下很稳但DG容量过大时馈线某些区段可能出现严重反向潮流导致迭代震荡甚至不收敛。项目里的应对措施有两个一是在潮流迭代时引入阻尼因子第k1次迭代的电压用 U_new × α U_old × (1−α) 平滑α取0.5~0.7牺牲一点收敛速度换取稳定性二是对DG容量超过节点负荷数倍的个体在适应度评估前先做预检如果推进功率超过该节点馈线热稳极限直接标记为不可行不进入潮流求解。注意前推回代法对初值不太敏感但起始电压统一设成1.0p.u.的“平启动”效果最好。不要用上一轮DG方案的电压结果做初值因为不同方案下潮流分布可能完全不同反而容易震荡。5. 结果解读帕累托前沿与方案权衡5.1 怎么读帕累托前沿优化跑完得到的不再是“唯一最优解”而是一条由几十个互不支配方案组成的前沿。在三维目标空间里前沿通常是一张曲面但分析时我更习惯两两目标配对投影来看。以网损和成本为例帕累托前沿呈现出明显的“下降一段后趋于平缓”的形态网损从基准202kW降到120kW的阶段成本增长非常平缓说明这时DG选址的改善空间大、边际收益高但继续追求从120kW降到110kW成本曲线开始陡增说明需要装上更大容量的DG才能压榨出最后那一点损耗性价比已经很低。电压偏差和网损之间则存在近似正相关但不完全线性通常网损改善幅度大的方案电压偏差也跟着改善因为损耗大和电压偏低本质上是同一批“潮流路径不合理”造成的。但仍有部分方案在相同网损水平下电压偏差差异较大这就是选址位置的差异同样装3台DG装在主干线中段和装在末端分支对末端电压的支撑效果完全不同。5.2 从帕累托集合到最终落地方案的选取拿到一整条帕累托前沿后工程决策者不可能把几十个方案都拿去立项。项目最后采用基于模糊隶属度的折中解选择方法。具体的做法是对第j个解在第i个目标上的满意度按最小值隶属度函数计算μᵢ_j (fᵢ_max − fᵢ_j) / (fᵢ_max − fᵢ_min)这个式子的含义是某个目标值离该目标的最优值越近满意度越接近1然后对每个解把所有目标的满意度求和取总满意度最大的方案作为最终推荐方案。这个方法的优点是公平它不偏向任何单一目标。实际算例中选出的折中解通常是3台DG分别装在某几个中后段节点容量取500kVA上下网损降幅约40%电压最低点从0.903提升到0.94以上成本回收期在可接受范围内。如果决策者更看重某一项指标也可以用TOPSIS或者带权重的满意度方法改变最终选择整个项目结构完全支持这种灵活性。5.3 与单目标优化的差异感受跑单目标优化时三个目标分别优化会得到三个截然不同的“最优解”最小网损解往往DG总容量较大、成本很高最小成本解则倾向于少装甚至不装DG最小电压偏差解倾向于在末端装小容量DG对网损改善有限。这三者互相打架任何单独拿出来都不太让人满意。把这三个解放进多目标框架对比会发现它们通常只是帕累托前沿上的三个端点真正的价值在于前沿中段那一大片折中解。这也坚定了我在项目里的判断多目标优化不是“花活”而是问题本身结构决定的需求。6. 实操中常见问题速查与避坑建议6.1 潮流计算不收敛最常见的现象是前推回代迭代次数达到上限后电压误差依然不达标。排查顺序是先检查DG容量是否远超节点负荷再检查是否有支路阻抗数据填错最后检查末端负荷是否为零空载末端接入大容量DG最容易发散。解决方案是施加阻尼因子、调低单点DG容量上限、或者删除末端空负载节点作为候选接入点。6.2 种群早熟与多样性不足如果发现帕累托前沿上的解越来越少最后集中到一个小区域说明种群多样性丢了。我的调试经验是优先检查拥挤度距离计算是否正确尤其是对不同前沿层的个体是否分别计算其次把变异概率从0.1调到0.15左右并引入每隔20代对当代种群做一次局部扰动的小机制。6.3 节点重复与非法编码交叉算子作用于整数编码的节点基因时很容易产生两个DG在同一节点的情况。修复算子的做法是检测到重复节点后保留其中一个另一个随机替换成当前个体中没有出现过的候选节点。同时要留意基因后半段的容量也要跟着节点一起交换否则会出现“位置换到2号节点容量还留在原来节点上”的错位问题。6.4 运行时间与评估预算分配多目标遗传算法的开销大头几乎全在潮流评估上。种群60、迭代150代加上父代子代合并实际潮流评估次数在15000次左右单次前推回代如果超过0.01秒总时长就会很可观。我最终优化的做法是在潮流函数上做了向量化一次评估一个小型配电网的所有节点电压避免循环逐支路计算。对于更大规模的配电网建议评估预算控制在2万次以内先用粗粒度容量档位快速收敛再用细粒度档位在最优前沿附近做局部精搜。6.5 常见问题速查表问题现象主要原因推荐处理潮流迭代不收敛DG容量过大导致反向潮流强阻尼因子0.6降低单点容量上限帕累托前沿解过于聚集拥挤度计算错误或变异率过低检查排序代码变异率调至0.15节点重复、容量错位交叉算子生成非法基因修复算子去重容量随节点联动结果每次运行差异较大随机种子影响、种群规模不足种群加到80多次运行取前沿并集单次评估速度过慢潮流函数未向量化逐支路循环改成数组运算压缩内部循环最后再分享一个习惯是我跑这种随机优化项目踩过坑之后总结的不要在单次运行结果上画帕累托前沿下结论至少用3到5个不同随机种子各跑一遍把多次运行得到的非支配解合并再做一遍全局非支配排序。这样能剔除掉靠运气冒出来的“伪前沿”同时让最终解集对初始种群的依赖降到最低。做工程验证不是做论文配图稳定重现比单次好看重要得多。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门