粒子群算法在分布式光伏配电网优化配置中的MATLAB实战

发布时间:2026/9/15 4:14:25
粒子群算法在分布式光伏配电网优化配置中的MATLAB实战 这两年分布式光伏装机的速度有多快干配电网的人应该都有体感——台区光伏渗透率从3%涨到30%可能只需要一年半载。光伏一多问题就跟着来电压越限、线路重载、网损不降反升、逆变器频繁脱网。这些现象背后有一个共同的源头性指标分布式光伏接入配电网的“位置”和“容量”到底怎么选。很多项目里“光伏配网优化配置”这个问题听起来简单实际做起来坑不少。手动试算根本算不完整穷举几十上百个候选节点也容易把自己绕晕。这时候智能优化算法就派上用场了而在工程和学术圈里被用得最多的就是粒子群算法Particle Swarm Optimization, PSO。这篇文章我打算把整个“光伏遇上粒子群”的实战过程完整拆一遍从算法原理、配电网建模、目标函数搭建到基于MATLAB的代码实现、常见问题排查全都聊透。无论你是电气工程专业的学生、做电网规划设计的工程师还是准备数学建模竞赛的参赛者这套完整链路应该都能帮你少走不少弯路。1. 粒子群算法核心机制为什么它适合做配电网优化1.1 从鸟群觅食到寻优计算PSO的底层逻辑粒子群算法的灵感来自鸟群觅食行为。设想一群鸟在一片区域里找食物每只鸟都不知道食物在哪但它们能感知自己当前距离食物有多远。最有效的策略是什么是每只鸟一边记住自己飞到过的最好位置一边参考群体里目前最接近食物的那只鸟的位置然后综合这两个信息调整自己的飞行方向和速度。把这套逻辑搬到数学里每一个“鸟”就是一个粒子对应优化问题里的一组候选解。粒子在解空间里有个位置向量 x还有个速度向量 v。每一轮迭代粒子按照两个“吸引力”来更新自己的速度一个是自身历史最优位置 pbest另一个是全局历史最优位置 gbest。更新完速度再根据速度更新位置如此反复直到收敛到足够好的解。这里面的核心公式是速度更新v wv c1r1*(pbest - x) c2r2(gbest - x)位置更新x x v其中 w 是惯性权重控制粒子保持原速度的程度c1 和 c2 是学习因子分别控制向个体最优和全局最优学习的强度r1 和 r2 是[0,1]之间的随机数用来增加搜索的随机性。这套机制的优势其实特别朴素它不像梯度下降那样需要目标函数可导也不像穷举法那样要遍历全部组合。配电网优化配置的目标函数往往是网损、电压偏差这些跟潮流计算耦合在一起的非线性表达式根本没法写出显式的梯度粒子群这种“无梯度启发式搜索”反而是最自然的选择。1.2 参数整定经验惯性权重、学习因子与种群规模PSO虽然上手容易但参数调得好不好收敛速度和结果质量能差一个数量级。我自己的实操经验是这么几个要点惯性权重w是这家伙里面最敏感的一个参数。 w大粒子飞行速度快全局探索能力强不容易掉进局部最优w小局部精细搜索能力强但容易过早收敛。常见的做法是让w从0.9线性降到0.4对应迭代前期多探索、后期多开发。我见过很多代码一上来就固定w0.7也不是不行但遇到多峰函数容易卡住。学习因子c1、c2通常取2.0或者取c1c21.5左右。实际上c1和c2的比值会左右粒子的行为c1比c2大太多每个粒子就只顾着找自己的路群体协同弱c2比c1大太多所有粒子都往同一个方向追容易早熟。我在做配电网优化时一般把两者设为1.8到2.0之间效果比较稳妥。种群规模一般取20到60。很多人觉得粒子越多越好实际上对33节点配电网这种中等规模的优化问题30个粒子跑100代就完全够用了再多只会增加潮流计算次数、拖慢速度。最大速度Vmax这个细节经常被忽略。如果不限制速度上限粒子一个跨步就飞出可行域后面全靠边界拉回来搜索效率非常低。我一般把Vmax设成决策变量取值范围宽度的10%左右。1.3 连续问题到离散选址优化编码的关键改造原始PSO是为连续变量设计的但配电网光伏优化配置是个混合整数问题光伏装在哪几个节点是离散的“选位”装多大容量又偏向连续或者落在离散的容量档位上。这里一定要做编码改造。常用做法是“实数编码 取整映射”。比如系统有33个节点候选安装节点编号是1到32去掉电源节点那位置部分直接用实数编码迭代时四舍五入取整映射到候选节点编号上。容量部分则可以直接是连续变量单位是kW或MW。这种改造方式实现简单、不需要改变PSO主体逻辑工程上最常用。要注意的是取整操作会让粒子在边界附近产生重复映射——比如2.4和2.6都会被映射到节点2上这会浪费一部分搜索能力。应对办法是在适应度函数里做去重处理或者对同一个节点重复映射的情况施以轻微惩罚。2. 配电网光伏优化配置的数学模型构建2.1 决策变量怎么定义位置、容量与组合编码优化配置问题的决策变量本质上是“装哪些节点、每处装多少”。假设系统有N个候选节点最多允许安装M个光伏电站那一个粒子的编码向量可以表示成X [x1, x2, ..., xM, p1, p2, ..., pM]其中x1到xM是安装位置对应候选节点编号p1到pM是对应的安装容量kW。如果某个位置的安装容量为0就表示这个位置不装等效于少装了一个电站。这里有个工程细节值得强调候选节点集的选择不是“全节点都拿来优化”。我习惯先用潮流计算做个灵敏度分析看看哪些节点对系统网损和电压最敏感再从中挑选10到20个候选节点。这样能大幅缩小搜索空间优化速度和稳定性都更好。2.2 目标函数设计从网损、电压到综合经济性配电网光伏优化配置是个典型的多目标优化问题。不同项目的侧重点不同但我总结下来最常见的三个目标函数是最小化网络损耗。 表达式是 Ploss Σ(i,j) Gij (Vi² Vj² - 2ViVjcosθij)其中Gij是支路电导Vi和Vj是节点电压幅值θij是相角差。光伏接入后会改变潮流分布如果位置和容量得当可以降低网损如果安排得不好反而会让某些线路重载、网损升高。最小化电压偏差。 表达式是 ΔV Σ|Vi - V_ref|。分布式光伏出力高峰时如果接入点靠线路末端很容易把电压抬到1.05 p.u.以上影响电能质量。电压偏差目标就是尽量让各节点电压都贴近额定值。最大化经济收益或最小化年综合费用。 这里要统计光伏的投资成本、运维成本、发电收益包括上网电量和节省的购电费用再折算成年值。投资回收期也是很多项目实际关心的指标。多目标怎么处理我推荐最简单也最稳妥的“加权和归一化”法。先把每个单目标分别优化一次取各自的最优值作为基准然后把目标写成无量纲加权和的形式。权重怎么定看项目说话如果是偏电网运行的项目网损和电压偏差权重给大点如果是偏投资回报的项目经济性指标权重大点。2.3 约束条件这些物理边界决定了方案是否可行优化出来的方案必须是一个物理上可运行的方案这就是约束条件的作用。配电网光伏配置的典型约束有以下几类潮流方程约束。 每个节点都要满足有功和无功功率平衡方程。这是所有配电网分析的底层约束不管用什么算法优化最终都要过潮流计算这一关。节点电压约束。 通常要求0.95 p.u. ≤ Vi ≤ 1.05 p.u.。实际工程中不同电压等级的允许偏差范围不同但做学术和仿真建模时这个范围最通用。支路电流约束。 每条支路的电流不能超过载流量上限否则会过热或者保护误动。在辐射状配电网中这个约束往往比电压约束更容易被触发。光伏安装总容量约束。 一般用渗透率表示光伏总安装容量不能超过配变容量的某个比例比如30%、50%或者80%具体看配电网的消纳能力。单节点容量约束。 单个节点的光伏接入容量不能超过该节点上级变压器的容量或线路热稳定极限还要考虑逆变器本身的容量档位。处理约束的方法上我比较推荐罚函数法对越界的方案在适应度函数里叠加一个惩罚项。只要惩罚系数取得足够大PSO自然会把搜索方向拉到可行域内。不过惩罚系数的取值需要调太大容易让粒子的目标函数失真太小又起不到约束作用这个分寸要靠多跑几次实验来掌握。3. 光伏出力特性与配电网潮流仿真建模3.1 光伏出力模型光照、温度与功率输出的换算逻辑光伏出力计算是整个优化的基础输入。我平时最常用的简化模型是P_pv η * S * I * [1 - 0.005*(T_cell - 25)]其中η是光伏组件效率S是组件总面积m²I是光照强度kW/m²T_cell是电池板温度°C。这个模型把逆变器效率和MPPT跟踪效率等细节打包在一个综合效率里工程精度完全够用。实际数据获取上要注意一点光照强度是随机变量不能只用一组典型值。处理办法是做典型场景分析——分晴天、多云、阴天三种典型日每种给定光照曲线然后分别计算优化方案的适应度再按概率加权求和。这样优化出来的配置方案不是一个“只对晴天最优”的极端方案而是综合天气条件下的全局最优方案。3.2 网络与负荷建模IEEE 33节点系统怎么用起来配电网优化领域最经典的基础网络是IEEE 33节点系统很多论文里的仿真都是拿它做的。这个网络有33个节点、32条支路额定电压12.66kV总负荷约3.7MW加上2.3Mvar是典型的辐射状配电网。用IEEE 33节点系统做光伏配置优化的好处是很明显的一是数据公开、结果可复现二是网络规模适中跑PSO加潮流计算很快三是它提供了比较充裕的调节空间光伏接入前后电压和网损都有明显变化适合验证算法效果。负荷建模上我一般会在基础负荷之上叠加一个日负荷曲线。比如把节点负荷乘以一个随时间变化的系数——夜间0.5、白天0.8、傍晚峰值1.2之类的典型日模式。光伏出力最大的中午时段与负荷低谷重叠这是配电网电压抬升问题最严重的时段优化时必须把这个场景算进去。3.3 潮流计算选型前推回代法还是牛顿-拉夫逊法配电网潮流计算的方法选择直接影响优化算法的运行效率。辐射状配电网中前推回代法是优先选择——它利用网络的辐射状结构先假设节点电压为额定值从末端往前推算出支路电流/功率再从首端往回推算出各节点电压迭代到收敛。这个方法实现简单、内存占用小、计算速度快且对辐射状网络有非常好的收敛性。牛顿-拉夫逊法则更通用适合含环网的复杂结构但每次迭代都要计算雅可比矩阵计算量大不少。如果网络里除了光伏还有微网、储能等设备或者网络合环运行那用牛顿-拉夫逊法会更稳妥。MATLAB环境下我通常会直接调MATPOWER的内置潮流函数或者自己写一个前推回代法函数。自己做的话要特别注意节点编号顺序和支路数据的方向设置不然很容易在推导支路层级的父子关系时出错。3.4 仿真验证层次从潮流计算到波形级仿真优化配置算完之后不能直接拍板还需要验证方案在电磁暂态层面的可行性。我习惯分两层做第一层是潮流计算层验证用PSO求得的配置方案重新跑一次潮流检查电压、网损、线路电流这些稳态指标是否满足约束。这一层在MATLAB里就能完成。第二层是动态仿真层验证用Simulink或者simplusgt这类国产配电网仿真工具搭建包含光伏逆变器、负荷、线路的拓扑对比优化前后电压波形、有功无功输出、并网电流谐波等。逆变器的控制策略比如PQ控制、V/f控制对动态响应影响很大这一层主要看的是“稳态优化方案在动态过程里会不会出问题”。4. 基于MATLAB的PSO配电网优化配置完整实现4.1 程序架构设计把“寻优”和“评估”分层解耦整个优化程序的架构我强烈建议做模块化拆分。上层是PSO寻优模块负责更新粒子位置、速度、评估适应度下层是潮流计算模块接收一组配置方案算出对应的网损、电压等指标回传给上层。这两层之间的接口就是一个候选解向量和一个评估结果标量。这样的分层设计好处很多第一潮流计算和PSO可以分开测试定位问题更高效第二以后想从PSO换成遗传算法或灰狼算法只需要替换上层模块第三如果后续要处理更大的配电网系统下层潮流模块可以无缝替换成更复杂的求解器。4.2 核心代码实现粒子群主循环与适应度计算先看PSO主循环的代码。这里我用MATLAB实现一个基础的PSO框架%% PSO 参数初始化 nParticles 30; % 粒子数 maxIter 100; % 最大迭代次数 dim 2 * nPV; % 决策变量维度位置容量 wMax 0.9; wMin 0.4; % 惯性权重上下限 c1 1.8; c2 1.8; % 学习因子 % 初始化粒子位置和速度 pos zeros(nParticles, dim); vel zeros(nParticles, dim); for i 1:nParticles pos(i, 1:nPV) randi([1, 32], 1, nPV); % 光伏位置候选节点 pos(i, nPV1:end) rand(1, nPV) * maxCap; % 光伏容量0~上限 vel(i, :) zeros(1, dim); % 初始速度为0 end pbest pos; % 个体历史最优 pbestVal inf(nParticles, 1); [gbestVal, gbestIdx] min(pbestVal); gbest pbest(gbestIdx, :); %% 主迭代循环 for iter 1:maxIter w wMax - (wMax - wMin) * iter / maxIter; % 惯性权重线性递减 for i 1:nParticles % 速度更新 r1 rand(1, dim); r2 rand(1, dim); vel(i, :) w * vel(i, :) ... c1 * r1 .* (pbest(i, :) - pos(i, :)) ... c2 * r2 .* (gbest - pos(i, :)); % 限制速度范围 vel(i, :) max(min(vel(i, :), vMax), -vMax); % 位置更新 pos(i, :) pos(i, :) vel(i, :); % 位置越界约束 pos(i, 1:nPV) round(min(max(pos(i, 1:nPV), 1), 32)); pos(i, nPV1:end) min(max(pos(i, nPV1:end), 0), maxCap); % 适应度评估 fitness evalFitness(pos(i, 1:nPV), pos(i, nPV1:end), sysData); % 更新个体最优和全局最优 if fitness pbestVal(i) pbestVal(i) fitness; pbest(i, :) pos(i, :); if fitness gbestVal gbestVal fitness; gbest pos(i, :); end end end end这段代码里几个要点我得特别说明位置向量前nPV个元素是光伏位置用randi初始化并四舍五入取整确保落在有效节点编号范围内后nPV个元素是对应容量。速度更新里的r1和r2是逐维独立的随机向量这是必要的——如果整个向量共用一个随机数所有维度的更新步调会完全相同搜索能力大打折扣。再说适应度函数evalFitness它承担着整个优化的“评价大权”function f evalFitness(loc, cap, sysData) % 1. 更新系统数据在指定节点接入光伏 sysData.pvLoc loc; sysData.pvCap cap; % 2. 调用潮流计算前推回代法 result backwardForwardSweep(sysData); % 3. 计算目标函数网损 电压偏差 罚函数 ploss result.ploss; voltDev sum(abs(result.V - 1.0)); % 4. 约束越界检查 punish 0; if max(result.V) 1.05 || min(result.V) 0.95 punish punish 1e6; end if sum(cap) totalCapLimit punish punish 1e6; end % 5. 加权和作为最终适应度 f ploss 0.1 * voltDev punish; end惩罚罚函数系数取1e6是我实测后觉得比较合适的量级——它比正常的网损值几千瓦到几十千瓦大几个数量级能确保任何越界方案的适应度都差于可行方案。这样PSO在迭代中自然会把粒子群引向可行域。4.3 经典算例结果分析优化前后到底改善了什么用IEEE 33节点系统做一组典型实验。配置前系统总网损约202.68kW这组数据很多论文都能对上。运行PSO后得到的光伏配置方案如果安装位置和容量搭配得当网损可以降到100kW以下降幅超过50%。实际跑出来的优化方案往往是这样的规律光伏偏向安装在网损灵敏度高的中后段节点以及负荷较重的节点附近——因为这些位置接入电源能显著缩短电能的输送距离。但如果所有光伏都集中在末端电压抬升又会超标所以最优方案往往是一种“在末端和中间节点之间均衡分布”的格局这就是粒子群在约束条件驱动下自动协调出来的结果。收敛曲线方面PSO通常在20代以内就能快速下降后面进入精细搜索阶段曲线变得平缓。如果50代之后适应度还在剧烈波动基本可以判断是参数设置出了问题比如惯性权重过大或者速度上限设置不合理。5. 常见问题与排查技巧5.1 潮流不收敛先怀疑建模再怀疑优化PSO优化过程中要反复调用潮流计算潮流一旦算不下去整个优化就崩了。我遇到过最多的原因是某一代粒子生成的配置方案让某些节点电压严重越限比如光伏容量过大导致末端电压远超1.05或者节点数据里的负荷参数写错。排查思路是先拿没有光伏的原始网络跑一次基础潮流确认网络模型本身没问题再手动设一组保守的配置方案比如小容量、位于中前段跑潮流逐步增加容量定位是哪个环节开始发散。这个排查思路能有效缩小问题范围避免一上来就在大量代码里翻找。5.2 粒子群早熟收敛结果稳定但很差如果多次运行PSO得到的结果都落在同一个很差的区域且无法逃逸典型原因是早熟收敛。这时候优先检查两点第一惯性权重是否给的太低。如果w初始值就小于0.6粒子的全局探索能力会很弱可能一开始就被某个局部最优吸引过去了。我通常建议w从0.9开始线性递减。第二种群多样性是否下降过快。可以在迭代过程中监控粒子位置方差如果方差快速趋近于0而gbest仍未收敛到理想值说明种群“抱团”太快了。解决办法是引入变异机制——每隔若干代随机重置一小部分粒子的位置模拟遗传算法中的变异操作增加种群多样性。5.3 结果对初值敏感多次运行结果差异很大PSO本身是随机算法多次运行结果有波动是正常的。但如果波动范围太大就说明算法没有稳定收敛到同一区域。我的处理方式是同一组参数下连续运行5到10次取最优结果或最优的一组结果的平均值作为最终方案。另外也可以考虑做一次“混沌初始化”——用Logistic映射替代均匀随机数生成初始粒子位置能在一定程度上提高初始种群的代表性让多次运行的结果更一致。5.4 优化结果“好看”但仿真验证不过关这一类问题最隐蔽。潮流计算层面温度和网损都达标了但放到Simulink或simplusgt里一跑发现光伏逆变器并网点谐波超标或者电压波动明显。这通常不是优化算法的问题而是在建模阶段没有考虑逆变器和控制策略的动态特性。遇到这个情况我的建议很直接在建优化模型时就要预留“可配置裕度”。比如电压约束不要卡在1.05 p.u.而是给到1.03或1.04 p.u.线路载流量约束也留出10%以上裕量。优化时把动态运行的缓冲提前算进去后面仿真验证就大概率能过得去。这也是“纸上优化”和“工程落地”之间最关键的差别。6. 从课程设计到真实工程这套方案的扩展方向用粒子群算法做光伏配电网优化配置本身是一个很完整的训练项目但从“能跑通”到“能用在实际工程里”中间还有几层扩展要做。接入储能联合优化是最近的明显趋势。光伏出力波动性大配电网很多时候卡脖子的不是容量不够而是调峰能力不足。把储能容量、充放电策略也作为决策变量放进粒子群里和光伏配置一起做联合优化能够进一步降低弃光率、平滑出力曲线。我之前做过一组对比实验光伏储能联合优化的方案比纯光伏配置的方案在相同渗透率下网损能再降低10%到15%电压波动也明显更小。跟超短期光伏功率预测做联动也是一个实用方向。优化配置是长期规划问题功率预测是短期运行问题两者看起来时间尺度差异很大但在实际系统里配置方案决定了哪些节点具备调节能力预测结果决定了怎么调度这些能力。把预测的不确定性区间纳入优化模型里做鲁棒优化是现在研究比较热的方向工程上也有落地价值。微电网日前优化调度则是另一个扩展场景。比如2017年电工杯A题那个典型的微电网调度问题光伏加储能加分时电价本质上也是一个“时间维度上的资源配置优化”问题粒子群同样适用。这时候决策变量从“装在哪、装多少”变成了“各时段内储能充放电功率和购售电功率”维度从空间转到时间但算法的核心逻辑完全一致。说到底粒子群算法是一个通用工具光伏配电网优化配置只是它一个特别典型、特别有工程价值的应用场景。掌握了“问题建模 - 编码设计 - 算法适配 - 仿真验证”这一整套思路你也就具备了用元启发式算法解决各种复杂工程优化问题的通用能力。这套方法论本身才是比任何具体代码都值钱的东西。