💥💥💞💞欢迎来到本博客❤️❤️💥💥
🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。
⛳️座右铭:行百里者,半于九十。
目录
💥1 概述
最优潮流(OPF)问题在电力系统运行中很重要。OPF 问题的目标是通过在满足某些操作约束的同时优化特定目标来确定电力系统的最佳运行状态。
本文说明了如何使用元启发式方法解决 OPF 问题。
基于粒子群优化算法(Particle Swarm Optimization, PSO)的最优潮流(Optimal Power Flow, OPF)研究是一种利用群体智能优化技术来解决电力系统中的复杂优化问题的方法。最优潮流问题旨在满足电力系统运行的各种约束(如功率平衡、电压限制、线路容量限制等)的同时,最小化或最大化某个目标函数(如系统总发电成本、有功网损等)。
粒子群优化算法简介
粒子群优化算法是一种模拟鸟群觅食行为的优化算法。在PSO中,每个解被看作搜索空间中的一个粒子,每个粒子都有一个适应度值(由目标函数决定),并有一个速度决定其移动的方向和距离。粒子通过追踪两个“极值”来更新自己的速度和位置:
- 个体极值(pbest):粒子自身找到的最优解。
- 全局极值(gbest):整个种群找到的最优解。
最优潮流问题的建模
在最优潮流问题中,首先需要定义决策变量(如发电机有功出力、无功出力、变压器分接头位置等)、目标函数(如最小化系统总发电成本或网损)以及约束条件(如功率平衡方程、电压和电流限制等)。
PSO在OPF中的应用步骤
-
初始化:随机生成一定数量的粒子,每个粒子代表一个可能的OPF解决方案,包括发电机的有功和无功出力等。
-
评估适应度:计算每个粒子的适应度值,即根据目标函数(如发电成本或网损)计算的值。
-
更新个体极值:对于每个粒子,将其当前适应度值与个体极值(pbest)的适应度值进行比较,如果更好,则更新pbest。
-
更新全局极值:在所有粒子的pbest中找出全局最优解(gbest),即适应度值最小的解。
-
更新速度和位置:根据以下公式更新每个粒子的速度和位置:
-
检查约束:确保更新后的解满足电力系统的所有约束条件,如不满足,则进行适当的调整或惩罚。
-
迭代:重复步骤2至6,直到满足停止条件(如达到最大迭代次数、适应度值变化小于某个阈值等)。
-
输出结果:输出全局最优解,即最优潮流问题的解。
注意事项
- 在实际应用中,可能需要考虑电力系统的非线性特性和离散变量(如变压器分接头位置)。
- 约束处理是PSO应用于OPF的关键,需要设计有效的约束处理方法。
- 算法的参数(如粒子数、迭代次数、学习因子等)对优化结果有显著影响,需要进行适当的调整。
📚2 运行结果
30节点数据:
function Data=IEEE_30_bus_Data
basemva = 100;
accuracy = 0.001;
maxiter = 50;
% IEEE 30-BUS TEST SYSTEM (American Electric Power)
% Bus Bus Voltage Angle ---Load---- -------Generator----- Injected
% No code Mag. Degree MW Mvar MW Mvar Qmin Qmax Mvar
busdata=[1 1 1.06 0.0 0.0 0.0 0.0 0.0 0 0 0
2 2 1.043 0.0 21.70 12.7 40.0 0.0 -40 50 0
3 3 1.0 0.0 2.4 1.2 0.0 0.0 0 0 0
4 3 1.06 0.0 7.6 1.6 0.0 0.0 0 0 0
5 2 1.01 0.0 94.2 19.0 0.0 0.0 -40 40 0
6 3 1.0 0.0 0.0 0.0 0.0 0.0 0 0 0
7 3 1.0 0.0 22.8 10.9 0.0 0.0 0 0 0
8 2 1.01 0.0 30.0 30.0 0.0 0.0 -10 40 0
9 3 1.0 0.0 0.0 0.0 0.0 0.0 0 0 0
10 3 1.0 0.0 5.8 2.0 0.0 0.0 -6 24 19
11 2 1.082 0.0 0.0 0.0 0.0 0.0 0 0 0
12 3 1.0 0 11.2 7.5 0 0 0 0 0
13 2 1.071 0 0 0.0 0 0 -6 24 0
14 3 1 0 6.2 1.6 0 0 0 0 0
15 3 1 0 8.2 2.5 0 0 0 0 0
16 3 1 0 3.5 1.8 0 0 0 0 0
17 3 1 0 9.0 5.8 0 0 0 0 0
18 3 1 0 3.2 0.9 0 0 0 0 0
19 3 1 0 9.5 3.4 0 0 0 0 0
20 3 1 0 2.2 0.7 0 0 0 0 0
21 3 1 0 17.5 11.2 0 0 0 0 0
22 3 1 0 0 0.0 0 0 0 0 0
23 3 1 0 3.2 1.6 0 0 0 0 0
24 3 1 0 8.7 6.7 0 0 0 0 4.3
25 3 1 0 0 0.0 0 0 0 0 0
26 3 1 0 3.5 2.3 0 0 0 0 0
27 3 1 0 0 0.0 0 0 0 0 0
28 3 1 0 0 0.0 0 0 0 0 0
29 3 1 0 2.4 0.9 0 0 0 0 0
30 3 1 0 10.6 1.9 0 0 0 0 0];
% busdata=[1 1 1.06 0 0 0
% 2 2 1.043 0 21.7 12.7
% 3 3 1 0 2.4 1.2
% 4 3 1.06 0 7.6 1.6
% 5 2 1.01 0 94.2 19
% 6 3 1 0 0 0
% 7 3 1 0 22.8 10.9
% 8 2 1.01 0 30 30
% 9 3 1 0 0 0
% 10 3 1 0 5.8 2
% 11 2 1.082 0 0 0
% 12 3 1 0 11.2 7.5
% 13 2 1.071 0 0 0
% 14 3 1 0 6.2 1.6
% 15 3 1 0 8.2 2.5
% 16 3 1 0 3.5 1.8
% 17 3 1 0 9 5.8
% 18 3 1 0 3.2 0.9
% 19 3 1 0 9.5 3.4
% 20 3 1 0 2.2 0.7
% 21 3 1 0 17.5 11.2
% 22 3 1 0 0 0
% 23 3 1 0 3.2 1.6
% 24 3 1 0 8.7 6.7
% 25 3 1 0 0 0
% 26 3 1 0 3.5 2.3
% 27 3 1 0 0 0
% 28 3 1 0 0 0
% 29 3 1 0 2.4 0.9
% 30 3 1 0 10.6 1.9 ];
% Line code
% Bus bus R X 1/2 B = 1 for lines
% nl nr p.u. p.u. p.u. > 1 or < 1 tr. tap at bus nl
% linedata=[ 1 2 0.0192 0.0575 0.02640 1
% 1 3 0.0452 0.1852 0.02040 1
% 2 4 0.0570 0.1737 0.01840 1
% 3 4 0.0132 0.0379 0.00420 1
% 2 5 0.0472 0.1983 0.02090 1
% 2 6 0.0581 0.1763 0.01870 1
% 4 6 0.0119 0.0414 0.00450 1
% 5 7 0.0460 0.1160 0.01020 1
% 6 7 0.0267 0.0820 0.00850 1
% 6 8 0.0120 0.0420 0.00450 1
% 6 9 0.0 0.2080 0.0 1.078
% 6 10 0 .5560 0 1.069
% 9 11 0 .2080 0 1
% 9 10 0 .1100 0 1
% 4 12 0 .2560 0 1.032
% 12 13 0 .1400 0 1
% 12 14 .1231 .2559 0 1
% 12 15 .0662 .1304 0 1
% 12 16 .0945 .1987 0 1
% 14 15 .2210 .1997 0 1
% 16 17 .0824 .1932 0 1
% 15 18 .1070 .2185 0 1
% 18 19 .0639 .1292 0 1
% 19 20 .0340 .0680 0 1
% 10 20 .0936 .2090 0 1
% 10 17 .0324 .0845 0 1
% 10 21 .0348 .0749 0 1
% 10 22 .0727 .1499 0 1
% 21 22 .0116 .0236 0 1
% 15 23 .1000 .2020 0 1
% 22 24 .1150 .1790 0 1
% 23 24 .1320 .2700 0 1
% 24 25 .1885 .3292 0 1
% 25 26 .2544 .3800 0 1
% 25 27 .1093 .2087 0 1
% 28 27 0 .3960 0 1.068
% 27 29 .2198 .4153 0 1
% 27 30 .3202 .6027 0 1
% 29 30 .2399 .4533 0 1
% 8 28 .0636 .2000 0.0214 1
% 6 28 .0169 .0599 0.0065 1];
linedata=[ 1 2 0.0192 0.0575 0.0264 1
1 3 0.0452 0.1852 0.0204 1
2 4 0.057 0.1737 0.0184 1
3 4 0.0132 0.0379 0.0042 1
2 5 0.0472 0.1983 0.0209 1
2 6 0.0581 0.1763 0.0187 1
4 6 0.0119 0.0414 0.0045 1
5 7 0.046 0.116 0.0102 1
6 7 0.0267 0.082 0.0085 1
6 8 0.012 0.042 0.0045 1
6 9 0 0.208 0 1.078
6 10 0 0.556 0 1.069
9 11 0 0.208 0 1
9 10 0 0.11 0 1
4 12 0 0.256 0 1.032
12 13 0 0.14 0 1
12 14 0.1231 0.2559 0 1
12 15 0.0662 0.1304 0 1
12 16 0.0945 0.1987 0 1
14 15 0.221 0.1997 0 1
16 17 0.0824 0.1923 0 1
15 18 0.107 0.2185 0 1
18 19 0.0639 0.1292 0 1
19 20 0.034 0.068 0 1
10 20 0.0936 0.209 0 1
10 17 0.0324 0.0845 0 1
10 21 0.0348 0.0749 0 1
10 22 0.0727 0.1499 0 1
21 22 0.0116 0.0236 0 1
15 23 0.1 0.202 0 1
22 24 0.115 0.179 0 1
23 24 0.132 0.27 0 1
24 25 0.1885 0.3292 0 1
25 26 0.2544 0.38 0 1
25 27 0.1093 0.2087 0 1
28 27 0 0.396 0 1.068
27 29 0.2198 0.4153 0 1
27 30 0.3202 0.6027 0 1
29 30 0.2399 0.4533 0 1
8 28 0.0636 0.2 0.0214 1
6 28 0.0169 0.0599 0.0065 1];
% Cost
% Coefficients
CostCoeff = [0 2.00 .00375;
0 1.75 .01750;
0 1.00 .06250;
0 3.25 .00834;
0 3.00 .02500;
0 3.00 .02500];
GeneratorInd=[1; find(busdata(:,2)==2)];
LoadInd=find(busdata(:,2)==3);
% NG: the number of generators.
NG=length(GeneratorInd);
% NL: the number of load buses.
NL=length(LoadInd);
% nbus The number of buses
nbus = max(max(linedata(:,1)), max( linedata(:,2)));
% nbr: the number of transmission lines.
nbr=length(linedata(:,1));
BusTypes=busdata(:,2);
NodeList=busdata(:,1);
QCInd=[ 10 12 15 17 20 21 23 24 29]; % Shunt VAR compensation N掳 of lines.
TInd=[11 12 15 36]; % Transformer tap settings T N掳 of lines.
NQC=length(QCInd);
NT=length(TInd);
Data.NQC=NQC;
Data.NT=NT;
VmLim=ones(30,1)*[.95 1.1];
VmLim([GeneratorInd],2)=1.1;
VmMin=VmLim(:,1);
VmMax=VmLim(:,2);
Data.VmMin=VmMin;
Data.VmMax=VmMax;
PLim=zeros(30,2);
PLim(GeneratorInd,:) = [50 200; 20 80; 15 50; 10 35; 10 30; 12 40];
PGMin=PLim(GeneratorInd,1);
PGMax=PLim(GeneratorInd,2);
Data.PGMin=PGMin;
Data.PGMax=PGMax;
PG1Min=PLim(1,1);
PG1Max=PLim(1,2);
Data.PG1Min=PG1Min;
Data.PG1Max=PG1Max;
QLim=zeros(30,2);
QLim(GeneratorInd,:) = [-20 200; -20 100; -15 80; -15 60; -10 50; -15 60];
% QLim= [busdata(:,9) busdata(:,10)];
QLimMin=QLim(:,1);
QLimMax=QLim(:,2);
Data.QLimMin=QLimMin;
Data.QLimMax=QLimMax;
QCLim = ones(length(QCInd),1)*[0 5];
QCMin=QCLim(:,1);
QCMax=QCLim(:,2);
Data.QCMin=QCMin;
Data.QCMax=QCMax;
TLim = ones(length(TInd),1)*[.9 1.1];
TMin=TLim(:,1);
TMax=TLim(:,2);
Data.TMin=TMin;
Data.TMax=TMax;
Data.QCInd=QCInd;
Data.TInd=TInd;
Data.busdata=busdata;
Data.linedata=linedata;
Data.Ybus0=[];
Data.GeneratorInd=GeneratorInd;
Data.LoadInd=LoadInd;
Data.CostCoeff=CostCoeff;
Data.basemva=basemva;
Data.nbus=nbus;
Data.nbr=nbr;
Data.NG=NG;
Data.NL=NL;
Data.NodeList=NodeList;
Data.BusTypes=BusTypes;
LineMVA=[...
0.000 1.300 1.300 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000;
1.300 0.000 0.000 0.650 1.300 0.650 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000;
1.300 0.000 0.000 1.300 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000;
0.000 0.650 1.300 0.000 0.000 0.900 0.000 0.000 0.000 0.000 0.000 0.650 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000;
0.000 1.300 0.000 0.000 0.000 0.000 0.700 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000;
0.000 0.650 0.000 0.900 0.000 0.000 1.300 0.320 0.650 0.320 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.320 0.000 0.000;
0.000 0.000 0.000 0.000 0.700 1.300 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000;
0.000 0.000 0.000 0.000 0.000 0.320 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.320 0.000 0.000;
0.000 0.000 0.000 0.000 0.000 0.650 0.000 0.000 0.000 0.650 0.650 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000;
0.000 0.000 0.000 0.000 0.000 0.320 0.000 0.000 0.650 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.320 0.000 0.000 0.320 0.320 0.320 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000;
0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.650 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000;
0.000 0.000 0.000 0.650 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.650 0.320 0.320 0.320 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000;
0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.650 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000;
0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.320 0.000 0.000 0.160 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000;
0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.320 0.000 0.160 0.000 0.000 0.000 0.160 0.000 0.000 0.000 0.000 0.160 0.000 0.000 0.000 0.000 0.000 0.000 0.000;
0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.320 0.000 0.000 0.000 0.000 0.160 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000;
0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.320 0.000 0.000 0.000 0.000 0.000 0.160 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000;
0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.160 0.000 0.000 0.000 0.160 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000;
0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.160 0.000 0.320 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000;
0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.320 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.320 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000;
0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.320 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.320 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000;
0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.320 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.320 0.000 0.000 0.160 0.000 0.000 0.000 0.000 0.000 0.000;
0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.160 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.160 0.000 0.000 0.000 0.000 0.000 0.000;
0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.160 0.160 0.000 0.160 0.000 0.000 0.000 0.000 0.000;
0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.160 0.000 0.160 0.160 0.000 0.000 0.000;
0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.160 0.000 0.000 0.000 0.000 0.000;
0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.160 0.000 0.000 0.650 0.160 0.160;
0.000 0.000 0.000 0.000 0.000 0.320 0.000 0.320 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.650 0.000 0.000 0.000;
0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.160 0.000 0.000 0.160;
0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.160 0.000 0.160 0.000];
LineMVA = LineMVA + diag(inf*ones(length(NodeList),1)); % Don't limit shunt power at buses
Data.LineMVA=LineMVA;
🎉3 参考文献
[1]Bouchekara, H. R. E. H. “Optimal Power Flow Using Black-Hole-Based Optimization Approach.” Applied Soft Computing, vol. 24, Elsevier BV, Nov. 2014, pp. 879–88, doi:10.1016/j.asoc.2014.08.056.
[2]Bouchekara, H. R. E. H., et al. “Optimal Power Flow Using Teaching-Learning-Based Optimization Technique.” Electric Power Systems Research, vol. 114, Elsevier BV, Sept. 2014, pp. 49–59, doi:10.1016/j.epsr.2014.03.032.
🌈4 Matlab代码实现