在该算例中,主要是以三峡的水电站为研究的对象。以中长期的时间轴为研究时间段,这里选取的是一年的时间。在这一年的时间跨度内,分为了12个时间段,每个时间段大致有30天的时间。通过各个时间段的数据,再加上对于粒子群的惯性权重和学习因子的进一步改进来进行对于三峡电站的中长期的一个发电的优化调度。通过将基于普通的一个PSO算法的实验结果和改进后的一个PSO调度结果相比较,得到最后的最优解,即最大的发电量仿真结果和最大的发电效益仿真结果。部分主体代码如下:
未改进的PSO:
clear
%% load data
DATA1=xlsread('库容.xlsx');
DATA2=xlsread('三峡来水概率月径流.xml');
DATA3=xlsread('三峡电站发电约束表.xml');
DATA4=xlsread('三峡入库流量水头损失.xml');
global vtlist;
vtlist=DATA4(:,1:2);
global q;
%q=sum((DATA2(:,1)./sum(DATA2(:,1))).*DATA2(:,2:end));
q=[6390 6390 6390 6390 6390 22400 22400 22400 22400 15300 7740 7740];
global vhlist;
vhlist=DATA1;
global minS;
global maxS;
global minP;
global maxP;
global minV;
global maxV;
minS=4000;
maxS=98800;
minP=499;
maxP=2240;
minV=0;
maxV=393;
%% PSO
N = 20;
d = 24;
ger = 300;
Ub = [];
Lb = [];
for i=1:12
Lb=[Lb 0];
Ub=[Ub 50000];
end
for i=1:12
Lb=[Lb -4000];
Ub=[Ub 4000];
end
for i=1:d
limit(i,1)=Lb(i);
limit(i,2)=Ub(i);
end
vlimit = [Lb-Ub;Ub-Lb;];
vlimit1=ones(1,N)'*vlimit(1,:);
vlimit2=ones(1,N)'*vlimit(2,:);
%w = 0.8;
wmax=0.9;
wmin=0.4;
c1min = 0.5;
c2min = 0.5;
c1max = 2.5;
c2max = 2.5;
x=[];
for i = 1:d
x(:,i) = limit(i, 1) + (limit(i, 2) - limit(i, 1)) * rand(N, 1);
end
v = rand(N, d);
xm = x;
ym = zeros(1, d);
fxm = ones(N, 1)*(-inf);
fym = -inf;
iter = 1;
record = zeros(ger, 1);
fx=zeros(1,N);
wlist=zeros(1,ger);
c1list=zeros(1,ger);
stopcount=0;
stopcountlist=zeros(1,ger);
T0=4;
while iter <= ger
iter
w=0.5;
c1=2.0;
c2=1.0;
wlist(iter)=w;
c1list(iter)=c1;
stopcountlist(iter)=stopcount;
for i=1:N
fx(i) = callfit(x(i,:));
end
for i = 1:N
if fxm(i) < fx(i)
fxm(i) = fx(i);
xm(i,:) = x(i,:);
end
end
stopcount=stopcount+1;
if fym < max(fxm)
stopcount=0;
[fym, nmax] = max(fxm);
ym = xm(nmax, :);
end
v = v * w + c1 * rand * (xm - x) + c2 * rand * (repmat(ym, N, 1) - x);
v(v < vlimit(1,:)) = vlimit1(v < vlimit(1,:));
v(v > vlimit(2,:)) = vlimit2(v > vlimit(2,:));
x = x + v;
for ii=1:d
x(x(:,ii) > limit(ii,2),ii) = limit(ii,2);
x(x(:,ii) < limit(ii,1),ii) = limit(ii,1);
end
record(iter) = fym;
% x0 = 0 : 0.01 : 20;
% plot(x0, f(x0), 'b-', x, f(x), 'ro');title('状态位置变化')
% pause(0.1)
iter = iter+1;
end
figure(1);plot(record,'black-');xlabel('迭代次数');ylabel('发电量/亿千瓦时');title('发电量与迭代次数关系');
figure(2);plot(wlist,'black-');xlabel('迭代次数');ylabel('权重');title('惯性权重与迭代次数关系');
figure(3);plot(c1list,'black-');xlabel('迭代次数');ylabel('c1权重');title('学习因子C1与迭代次数关系');
hold on
figure(5);plot(stopcountlist,'black-');xlabel('迭代次数');ylabel('停滞次数');title('PSO最优解停滞次数与迭代次数关系');
figure(6);plot(vhlist(:,1),vhlist(:,2));xlabel('水位/米');ylabel('库容量/亿立方米');title('水位与库容量关系');
disp(['最大值:',num2str(fym)]);
disp(['变量取值:',num2str(ym)]);
printx(ym);
x=ym;
改进后的PSO:
clear
%% load data
DATA1=xlsread('库容.xlsx');
DATA2=xlsread('三峡来水概率月径流.xml');
DATA3=xlsread('三峡电站发电约束表.xml');
DATA4=xlsread('三峡入库流量水头损失.xml');
global vtlist;
vtlist=DATA4(:,1:2);
global q;
%q=sum((DATA2(:,1)./sum(DATA2(:,1))).*DATA2(:,2:end));
q=[6390 6390 6390 6390 6390 6390 22400 22400 15300 15300 7740 7740];
global vhlist;
vhlist=DATA1;
global minS;
global maxS;
global minP;
global maxP;
global minV;
global maxV;
minS=4000;
maxS=98800;
minP=499;
maxP=2240;
minV=0;
maxV=393;
%% PSO
N = 20; % 初始种群个数
d = 24; % 空间维数
ger = 100; % 最大迭代次数
Ub = [];%优化参数上界
Lb = [];%优化参数下界
for i=1:12
Lb=[Lb 0];
Ub=[Ub 50000];
end
for i=1:12
Lb=[Lb -4000];
Ub=[Ub 4000];
end
for i=1:d
limit(i,1)=Lb(i);
limit(i,2)=Ub(i);
end
vlimit = [Lb-Ub;Ub-Lb;];% 设置速度限制
vlimit1=ones(1,N)'*vlimit(1,:);
vlimit2=ones(1,N)'*vlimit(2,:);
%w = 0.8; % 惯性权重
wmax=0.9;
wmin=0.4;
c1min = 0.5; % 自我学习因子
c2min = 0.5; % 群体学习因子
c1max = 2.5;
c2max = 2.5;
x=[];
for i = 1:d
x(:,i) = limit(i, 1) + (limit(i, 2) - limit(i, 1)) * rand(N, 1);%初始种群的位置
end
v = rand(N, d); % 初始种群的速度
xm = x; % 每个个体的历史最佳位置
ym = zeros(1, d); % 种群的历史最佳位置
fxm = ones(N, 1)*(-inf); % 每个个体的历史最佳适应度
fym = -inf; % 种群历史最佳适应度
iter = 1;
record = zeros(ger, 1); % 记录器
fx=zeros(1,N);
wlist=zeros(1,ger);
c1list=zeros(1,ger);
c3list=zeros(1,ger);
c4list=zeros(1,ger);
stopcount=0;
stopcountlist=zeros(1,ger);
T0=4;%停滞步数
while iter <= ger
iter
w=wmax-(iter/ger)^2*(wmax-wmin);%改进惯性权重
c1=c1min+(c1max-c1min)*(iter/ger);
c2=c2min+(c2max-c2min)*(iter/ger);
wlist(iter)=w;
c1list(iter)=c1;
stopcountlist(iter)=stopcount;
if stopcount>=T0
c3=rand();
c4=rand();
else
c3=1;
c4=1;
end
c3list(iter)=c3;
c4list(iter)=c4;
for i=1:N
fx(i) = callfit(x(i,:));
end% 个体当前适应度
for i = 1:N
if fxm(i) < fx(i)
fxm(i) = fx(i); % 更新个体历史最佳适应度
xm(i,:) = x(i,:); % 更新个体历史最佳位置
end
end
stopcount=stopcount+1;
if fym < max(fxm)
stopcount=0;
[fym, nmax] = max(fxm); % 更新群体历史最佳适应度
ym = xm(nmax, :); % 更新群体历史最佳位置
end
v = v * w + c1 * rand * (c3.*xm - x) + c2 * rand * (c4.*repmat(ym, N, 1) - x);% 速度更新
% 边界速度处理
v(v < vlimit(1,:)) = vlimit1(v < vlimit(1,:));
v(v > vlimit(2,:)) = vlimit2(v > vlimit(2,:));
x = x + v;% 位置更新
% 边界位置处理
for ii=1:d
x(x(:,ii) > limit(ii,2),ii) = limit(ii,2);
x(x(:,ii) < limit(ii,1),ii) = limit(ii,1);
end
record(iter) = fym;%最大值记录
% x0 = 0 : 0.01 : 20;
% plot(x0, f(x0), 'b-', x, f(x), 'ro');title('状态位置变化')
% pause(0.1)
iter = iter+1;
end
figure(1);plot(record,'black-');xlabel('迭代次数');ylabel('发电量/亿千瓦时');title('发电量与迭代次数关系');
figure(2);plot(wlist,'black-');xlabel('迭代次数');ylabel('权重');title('惯性权重与迭代次数关系');
figure(3);plot(c1list,'black-');xlabel('迭代次数');ylabel('c1权重');title('学习因子C1与迭代次数关系');
figure(4);plot(c3list,'black-');xlabel('迭代次数');ylabel('权重');title('扰动因子与迭代次数关系');
hold on
plot(c4list,'r--')
legend('c3扰动因子','c4扰动因子');
figure(5);plot(stopcountlist,'black-');xlabel('迭代次数');ylabel('停滞次数');title('PSO最优解停滞次数与迭代次数关系');
figure(6);plot(vhlist(:,1),vhlist(:,2));xlabel('水位/米');ylabel('库容量/亿立方米');title('水位与库容量关系');
disp(['最大值:',num2str(fym)]);
disp(['变量取值:',num2str(ym)]);
printx(ym);
x=ym;