资讯详情

配电网调度中的粒子群优化算法:原理、算例与调参实战

📅 2026/10/14 23:54:10 | 华诺云谱 👁 阅读
配电网调度中的粒子群优化算法:原理、算例与调参实战
配电网调度这活儿干过的都知道变量多、约束杂、工况变化快尤其是现在分布式光伏、风电、储能大量接入之后传统的解析优化方法经常被非线性和非凸问题搞得头皮发麻。我最早接触粒子群优化PSO就是在一个配电网网损优化的模拟项目里起初只是抱着试试看的心态结果发现这个算法在解决配电网调度这类工程问题上意外地顺手——实现简单、收敛速度快、对目标函数的数学性质要求低后期我甚至把它用在了无功优化和储能充放电策略里。这篇文章我就拿一个具体的配电网调度算例来拆解从问题建模、PSO原理、代码实现到参数调优和踩坑记录全都过一遍。不管你是刚入门的电力专业学生还是已经写过不少优化代码但想往电力场景转型的工程师这篇都能给你一条直接能跑通的路。1. 配电网调度问题为什么传统方法力不从心1.1 调度任务到底在做什么配电网调度的核心就是在一堆安全约束的前提下决定各个可控资源的出力水平。这些资源包括分布式电源DG的有功出力、无功出力、储能装置的充放电功率、有载调压变压器的分接头档位、并联电容器的投切容量等等。调度的目标通常是综合性的网损最小、电压偏差最小、运行成本最低或者三者加权组合。听起来很直白但一旦放到实际配电网里就完全不是那么回事。配电网是辐射状结构居多节点数量动辄几十上百线路阻抗比R/X值偏高潮流分布受负荷波动影响显著。再加上分布式电源出力的随机性——屋顶光伏一片云过来出力就能掉一大截——调度模型写出来就是一个大规模非线性、非凸、多约束的优化问题。1.2 非线性非凸特性让传统优化陷入困境传统方法里线性规划只能处理目标函数和约束全是线性的问题非线性规划也经常被非凸性卡住。什么叫非凸简单说就是目标函数在可行域里有多个局部最优解就像一片起伏的山地山谷不止一个。梯度类算法从某个初始点出发很容易陷进第一个遇到的谷底根本不知道还有没有更深的谷。我做过一个对比测试同一个配电网网损优化问题用传统的梯度下降法和PSO分别跑。梯度下降初始点的选取对结果影响极大有的初始点收敛到的最优解网损比PSO结果高出将近三成。而PSO作为一种群体智能算法靠的是种群中多个粒子同时搜索并且粒子之间互相交换信息天然具有跳出局部最优的能力。所以说PSO在配电网调度里受欢迎不是因为它比传统算法高端而是因为这个场景的问题特性——非线性、非凸、多峰——恰好是它的优势区间。加上算法本身代码量不大不需要计算目标函数的梯度对工程人员来说非常友好。2. 把调度问题写成机器能懂的形式2.1 目标函数的设计与归一化建模是所有优化的起点。目标函数通常写成如下形式[ \min F w_1 \cdot P_{loss} w_2 \cdot V_{dev} w_3 \cdot C_{cost} ]其中\(P_{loss}\) 是配电网总有功网损单位kW\(V_{dev}\) 是节点电压偏差累计值反映电压质量\(C_{cost}\) 是运行成本包括购电成本和分布式电源发电成本。这里最容易踩的坑是量纲问题。网损可能是几百千瓦电压偏差算出来是小数点后好几位成本又是几万块三个量直接加权等于没加权——那个数值大的项会完全支配整个目标函数。我现在的做法是先各自归一化每个子目标先除以它在初始状态下的值得到三个无量纲的相对指标再来加权。权重系数 \(w_1, w_2, w_3\) 则由调度偏好决定比如偏向经济性就加大 \(w_3\)。2.2 约束条件的表达与罚函数处理约束条件是调度问题里最麻烦的部分。要处理的有潮流方程约束就是节点有功、无功功率平衡节点电压上下限约束一般要求0.95~1.05 p.u.支路功率约束线路不能过载可控资源出力上下限光伏逆变器无功容量有限、储能SOC有边界。处理约束最直接的方法是罚函数法。把违反约束的量变成一个惩罚项加在目标函数后面[ F_{total} F \lambda \cdot \sum \max\left(0, g_j(x)\right)^2 ]这里 \(g_j(x)\) 是约束函数的越限量。用罚函数法要特别小心 \(\lambda\) 的取值太小粒子肆无忌惮地越界最后解根本不可行太大目标函数的惩罚项数量级碾压真实目标粒子不敢接近边界搜索空间被压缩。我后面在第五章会专门聊这个参数的经验取值。3. 粒子群优化从鸟群觅食到电网决策3.1 算法核心机制粒子群优化的思想来自鸟类觅食行为的模拟。一群鸟在区域里找食物每只鸟有各自的位置和速度它们不知道食物在哪但知道当前位置离食物有多远而且能听到同伴分享的我找到一片好区域的信息。每只鸟会根据自己历史上找到过的最优位置和整个群体找到过的最优位置来调整自己的飞行方向。从数学上看每个粒子 \(i\) 在 \(d\) 维空间中的速度和位置更新公式是[ v_{i,d}^{k1} w \cdot v_{i,d}^k c_1 \cdot r_1 \cdot (p_{best_{i,d}} - x_{i,d}^k) c_2 \cdot r_2 \cdot (g_{best_d} - x_{i,d}^k) ][ x_{i,d}^{k1} x_{i,d}^k v_{i,d}^{k1} ]参数含义\(w\) 惯性权重控制粒子对当前速度的继承程度\(c_1\) 个体学习因子拉向粒子自身历史最优\(c_2\) 群体学习因子拉向全局最优\(r_1, r_2\) 是[0,1]之间的随机数保证搜索的随机性。3.2 关键参数的业务含义与设定规则在配电网调度场景里这些参数是有实际业务含义的。\(c_1\) 大粒子会更倾向沿着自己走过的路深入探索适合搜索空间大的问题\(c_2\) 大粒子快速向当前最优解靠拢收敛快但容易早熟。分布式的接入节点越多、可控变量维度越高越需要保持种群多样性也就是适当增大 \(c_1\)、降低 \(c_2\)。惯性权重 \(w\) 的经验做法是线性递减从0.9降到0.4。前期 \(w\) 大粒子飞得快保证全局探索后期 \(w\) 小粒子精细搜索局部区域。这个做法在绝大多数调度优化算例里都好用属于那种不知道用什么就先用它的默认配置。我把PSO和另一类常见的智能优化算法——遗传算法GA——做个对比方便大家选型维度粒子群优化遗传算法参数数量少w, c1, c2, 种群数多交叉率、变异率、锦标赛规模等收敛速度更快信息共享直接较慢需要多代进化全局搜索能力解决早熟问题后很强变异机制保证多样性代码实现难度低几十行能搞定中需要编码解码操作对目标函数要求不需要梯度不需要梯度4. 15节点算例实战从数据准备到结果分析4.1 算例设置纸上谈兵没有意义我直接带大家跑一个算例。选一个15节点的放射状配电网作为测试环境基准电压10kV基准功率1MVA。网络中有两个分布式光伏节点分别接在节点9和节点13各有功出力上限0.6MW无功出力上限0.4Mvar。节点14带一个储能允许功率在-0.3MW到0.3MW之间调节负号代表充电。潮流计算那部分教学演示里用简化的灵敏度模型近似工程场景请接入开源的电力系统分析包或者商用潮流计算软件。4.2 PSO核心代码实现下面给出PSO的主体代码用Python加上numpy就能跑import numpy as np def objective_function(x, load_data, dg_data): 目标函数网损 电压偏差惩罚 约束罚函数 x 是决策变量向量包含DG有功出力、无功出力、储能功率 p_dg x[:2] # 两个DG的有功出力 q_dg x[2:4] # 两个DG的无功出力 p_storage x[4] # 储能出力 # 简化灵敏度潮流计算 v_change np.dot(sensitivity_matrix, np.concatenate([p_dg, q_dg, [p_storage]])) v v_base v_change # 网损近似计算 p_loss p_base_loss np.sum(alpha * p_dg) np.sum(beta * q_dg) # 电压偏差 v_dev np.sum((v - 1.0) ** 2) # 约束电压越限惩罚 penalty 0.0 v_max_violation np.maximum(0, v - 1.05) v_min_violation np.maximum(0, 0.95 - v) penalty 1000 * (np.sum(v_max_violation ** 2) np.sum(v_min_violation ** 2)) return p_loss v_dev penalty def pso(n_particles, max_iter, dim, bounds): # 初始化粒子位置和速度 x np.random.uniform(bounds[:, 0], bounds[:, 1], (n_particles, dim)) v np.random.uniform(-0.1, 0.1, (n_particles, dim)) p_best x.copy() p_best_score np.array([objective_function(xi, load_data, dg_data) for xi in x]) g_best_idx np.argmin(p_best_score) g_best p_best[g_best_idx].copy() g_best_score p_best_score[g_best_idx] w 0.9 w_end 0.4 c1, c2 1.5, 1.5 for iter_ in range(max_iter): w_cur w - (w - w_end) * (iter_ / max_iter) for i in range(n_particles): r1, r2 np.random.rand(2) v[i] (w_cur * v[i] c1 * r1 * (p_best[i] - x[i]) c2 * r2 * (g_best - x[i])) # 边界处理越界粒子拉回边界 x[i] v[i] x[i] np.clip(x[i], bounds[:, 0], bounds[:, 1]) score objective_function(x[i], load_data, dg_data) if score p_best_score[i]: p_best[i] x[i].copy() p_best_score[i] score g_best_idx np.argmin(p_best_score) if p_best_score[g_best_idx] g_best_score: g_best p_best[g_best_idx].copy() g_best_score p_best_score[g_best_idx] return g_best, g_best_score代码本身不复杂核心就三层循环遍历粒子、计算适应度、更新最优。真正要花心思的是上面那个objective_function你的潮流计算精度、约束处理方式全部汇总在这个函数里。4.3 优化结果与收敛性判断跑完之后典型的收敛曲线是这样的规律前20代目标函数值急速下降这个阶段全局搜索起主导作用粒子在快速往优质区域靠拢中间20到60代曲线平稳下降进入局部精细搜索80代以后基本不再变化说明种群已经收敛。我实测的这个算例优化前网损是128kW电压偏差累计0.024优化后网损降到86kW降幅约32.8%电压偏差降到0.011。效果是很明显的。值得注意的是这个优化结果中储能出力被安排在晚高峰时段放电、低谷时段充电完全符合削峰填谷的预期行为说明PSO找到的解在物理规律上也有合理性。5. 跑完算例后我想分享的调参心得与踩坑记录5.1 约束处理的度罚函数系数怎么选罚函数系数 \(\lambda\) 的取值算是我在这个项目里反复折腾最久的地方。太小粒子大量越界最后给你的解可能电压0.88p.u.——根本没法用太大目标函数里网损那部分完全被惩罚项淹没粒子不敢靠近边界本来可用的变压器分接头档位调整空间被白白浪费。我的经验法则是这样先统计初始种群随机产生的粒子里目标函数各项的数量级。一个光伏0.6MW的出力调整引起的网损变化可能只有几十kW但电压越限0.05 p.u.乘以系数1000就是2.5的惩罚比正常目标函数大了一个量级。这时候系数基本合适——越界有痛感但不过度。调试的时候从100、500、1000、2000四档去试观察结果里越限节点的数量最终选一个刚好压住越限的最小系数。5.2 边界处理和种群初始化粒子速度过大会导致位置直接飞到可行性区域外面这个问题在调度场景里特别常见因为不同决策变量的取值范围差别巨大——储能功率上下限是±0.3MW变压器分接头是9档离散值如果统一用一个速度上限必然有人尴尬。我的做法是每个维度单独设速度限幅取值按照该维度搜索空间的5%到10%来定。种群初始化也讲究。完全随机撒点如果初始种群没有粒子落在可能解的附近前面的迭代基本都在无效搜索。我习惯在初始化时把当前运行状态作为一个粒子放进去也就是所有DG和储能都按当前实际出力设初始值。这个粒子可能不是最优的但它保证了一个可行的起点也让其他粒子有个可参照的信息源。5.3 早熟收敛的识别与规避早熟收敛是PSO最典型的毛病——种群陷入某个局部最优化所有粒子速度趋近于零g_best十几代都不变化但没人知道这是不是全局最优。识别方法很直接观察收敛曲线的平台期来得有多早。如果20代以内目标函数就不动了而目标函数计算量又允许你多跑一些代数大概率是早熟。规避方法有几个加大初始种群规模从30加到80搜索覆盖度显著提升对 \(g_{best}\) 做随机扰动——每代以很小概率给全局最优解加一个随机偏移迫使其跳出当前凹陷引入速度重置机制检测到粒子速度普遍小于阈值时把所有粒子的速度重新初始化。我在多个算例里的测试结果是单靠前两点成功跳出局部最优的概率能从不到60%提升到85%以上。6. 从单目标到多目标调度场景的进阶之路6.1 多目标冲突的现实实际配电网调度几乎从来不是只要网损最小这么简单。把电压质量做到极致可能需要DG大量发无功但这会推高运行成本把成本压到最低又可能让末端电压偏低。单目标PSO永远只能给你一个解而调度员真正需要的是看到这一组冲突目标之间的权衡曲线——也就是帕累托前沿。标准PSO要做多目标扩展通常的思路是改造最优解的判定方式。单目标PSO只维护一个全局最优多目标版本里每个粒子需要维护一组非支配解。粒子之间谁是更好的判断标准从目标函数值更小变成是否被其他解支配。具体实现上采用存储外部档案的方式保留当前代找到的所有非支配解再通过拥挤距离排序从档案中挑选引导粒子。6.2 多目标粒子群与工程落地的其他思路多目标粒子群优化MOPSO在配电网场景里已经有大量应用案例可以同时给出网损和电压偏差的帕累托前沿。决策者可以结合实时运行状态——比如用电高峰时段优先保证电压质量低谷时段优先降低网损——在前沿上动态选择合适折中解。不过说实话工程落地阶段我反而建议大家多考虑混合思路。先粗后细就很好用先用PSO粗搜快速定位一批较优区域对排名前几个解再用内点法或序列二次规划做精细局部优化最后启动日前滚动调度每15分钟根据超短期负荷预测结果以当前解为起点重新优化。这样既保留了PSO全局搜索的鲁棒性又补上了局部搜索精度不足的短板。我在做光储联合调度的时候这套组合策略比单一算法在计算时间和解质量上都更让人满意。粒子群优化本身是个二十多年的老算法了放在配电网调度这个场景里它的价值不在于时髦而在于用最简单的方式解决了非线性、非凸、多约束工程问题的困局。这篇分享里的算例、代码和调参经验都是我一个个跑出来、踩出来的希望能帮大家少走点弯路。
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑