基于粒子群算法的水电站中长期发电优化调度

该博客介绍了基于粒子群优化(PSO)算法对三峡电站进行中长期发电调度的研究。通过对原始PSO算法的改进,调整了惯性权重和学习因子,以适应一年12个时间段的发电优化问题。实验对比了改进前后的算法效果,显示改进后的算法能获得更高的发电量和效益。最终,展示了发电量与迭代次数、权重、学习因子及停滞次数的关系图,以及水位与库容量的关系。
摘要由CSDN通过智能技术生成

       在该算例中,主要是以三峡的水电站为研究的对象。以中长期的时间轴为研究时间段,这里选取的是一年的时间。在这一年的时间跨度内,分为了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;

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值