【水库调度】01 差分进化算法(DE)求解单库发电优化问题

算法简介

差分进化算法是进化算法的一种,与遗传算法(GA)、粒子群算法(PSO)、蚁群算法、狼群算法等群体智能算法一样,常用来求解复杂优化问题的全局最优解。
具体算法参看差分进化算法
采用MATLAB编程,代码参考算法代码

博客作者简介

很高兴认识您!
我叫卢家波,河海大学水文学及水资源博士研究生,研究兴趣为高效洪水淹没预测、洪水灾害预警、机器学习、替代模型和降阶模型。
变化环境下,极端洪水事件多发,我希望能通过研究为水灾害防御做出贡献,为人民服务。
欢迎交流讨论和研究合作,vx Jiabo_Lu
主页 https://lujiabo98.github.io
简历 https://lujiabo98.github.io/file/CV_JiaboLu_zh.pdf
博客 https://blog.csdn.net/weixin_43012724?type=blog
来信请说明博客标题及链接,谢谢。

测试函数

f ( x , y ) = x 2 + y 2 f(x,y)=x^2+y^2 f(x,y)=x2+y2

m a x f ( x , y ) = x 2 + y 2 max f(x,y)=x^2+y^2 maxf(x,y)=x2+y2
x , y ∈ [ − 1 , 1 ] , x 2 + y 2 ≤ 1 x,y\in[-1,1],x^2+y^2\le1 x,y[1,1],x2+y21
在这里插入图片描述
在这里插入图片描述

f ( x , y , z ) = x 2 + y 2 + z 2 f(x,y,z)=x^2+y^2+z^2 f(x,y,z)=x2+y2+z2

m a x f ( x , y , z ) = x 2 + y 2 + z 2 maxf(x,y,z)=x^2+y^2+z^2 maxf(x,y,z)=x2+y2+z2
x , y , z ∈ [ − 1 , 1 ] , x 2 + y 2 + z 2 ≤ 1 x,y,z\in[-1,1],x^2+y^2+z^2\le1 x,y,z[1,1],x2+y2+z21
在这里插入图片描述
在这里插入图片描述

R a s t r i g i n 函数 Rastrigin函数 Rastrigin函数

m i n f ( x ) = 10 d + ∑ i = 1 d [ x i 2 − 10 c o s ( 2 π x i ) ] minf(x)=10d+\sum_{i=1}^d[x_i^2-10cos(2\pi x_{i})] minf(x)=10d+i=1d[xi210cos(2πxi)]
x i ∈ [ − 5.12 , 5.12 ] , i = 1 , . . . , d x_i\in[-5.12,5.12],i=1,...,d xi[5.12,5.12],i=1,...,d
在这里插入图片描述
在这里插入图片描述

S c h a f f e r 函数 Schaffer函数 Schaffer函数

f ( x ) = 0.5 + s i n 2 ( x 1 2 + x 2 2 ) − 0.5 [ 1 + 0.001 ( x 1 2 + x 2 2 ) ] 2 f(x)=0.5+\frac{sin^2(x_1^2+x_2^2)-0.5}{[1+0.001(x_1^2+x_2^2)]^2} f(x)=0.5+[1+0.001(x12+x22)]2sin2(x12+x22)0.5
x i ∈ [ − 100 , 100 ] , i = 1 , 2 x_i\in[-100,100],i=1,2 xi[100,100],i=1,2
在这里插入图片描述
在这里插入图片描述

A c k l e y 函数 Ackley函数 Ackley函数

f ( x ) = − a e x p ( − b 1 d ∑ i = 1 d x i 2 ) − e x p ( 1 d ∑ i = 1 d c o s ( c x i ) ) + a + e f(x)=-aexp(-b\sqrt{\frac{1}{d}\sum_{i=1}^dx_i^2})-exp(\frac{1}{d}\sum_{i=1}^dcos(cx_i))+a+e f(x)=aexp(bd1i=1dxi2 )exp(d1i=1dcos(cxi))+a+e
a = 20 , b = 0.2 , c = 2 π , x i ∈ [ − 32.768 , 32.768 ] , i = 1 , . . . , d a=20,b=0.2,c=2\pi,x_i\in[-32.768,32.768],i=1,...,d a=20,b=0.2,c=2π,xi[32.768,32.768],i=1,...,d
在这里插入图片描述
在这里插入图片描述

G r i e w a n k 函数 Griewank函数 Griewank函数

f ( x ) = ∑ i = 1 d x i 2 4000 − ∏ i = 1 d c o s ( x i i ) + 1 f(x)=\sum_{i=1}^d\frac{x_i^2}{4000}-\prod_{i=1}^{d}cos(\frac{x_i}{\sqrt{i}})+1 f(x)=i=1d4000xi2i=1dcos(i xi)+1
x i ∈ [ − 600 , 600 ] , i = 1 , … , d x_i \in [-600, 600], i = 1, …, d xi[600,600],i=1,,d
在这里插入图片描述
在这里插入图片描述

单库发电优化建模

目标函数

以调度期内发电量最大为优化调度目标,其目标函数为:
m a x E = ∑ t = 1 T N t ( q e t , H t ) Δ t maxE=\sum_{t=1}^{T}N_t(qe_t,H_t)\Delta t maxE=t=1TNt(qet,Ht)Δt
式中, N t ( ⋅ ) N_t(·) Nt() t t t 时段的电站平均出力, H t H_t Ht为水库 t t t 时段平均水头, q e t qe_t qet t t t 时段平均发电流量, T T T 为调度期时段数, Δ t \Delta t Δt 为时段长。

约束条件

  1. 水量平衡约束
    V t = V t − 1 + ( Q t − q t ) Δ t V_t=V_{t-1}+(Q_t-q_t)\Delta t Vt=Vt1+(Qtqt)Δt
    式中, V t 、 V t + 1 V_t、V_{t +1} VtVt+1分别为水库 t t t 时段始末库蓄水量, Q t Q_t Qt t t t 时段平均入库流量, q t q_t qt t t t 时段平均出库流量。
  2. 水位约束
    Z t ‾ ≤ Z t ≤ Z t ‾ \underline{Z_t}\le Z_t \le \overline{Z_t} ZtZtZt
    式中, Z t ‾ 、 Z t ‾ \overline{Z_t}、\underline {Z_t} ZtZt分别为 t t t 时段初水库水位上下限。
  3. 出库流量约束
    q t ‾ ≤ q t ≤ q t ‾ \underline{q_t}\le q_t \le \overline{q_t} qtqtqt
    式中, q t ‾ 、 q t ‾ \overline{q_t}、\underline {q_t} qtqt分别为 t t t 时段初水库出库流量上下限。
  4. 出力约束
    N t ‾ ≤ N t ≤ N t ‾ \underline{N_t}\le N_t \le \overline{N_t} NtNtNt
    式中, N t ‾ 、 N t ‾ \overline{N_t}、\underline {N_t} NtNt分别为 t t t 时段初水库出力上下限。
  5. 调度期初、末水位约束
    Z 0 = Z s Z_0=Z_s Z0=Zs
    Z T = Z e Z_T=Z_e ZT=Ze
    式中: Z s Z_s Zs 为调度期初水库水位, m m m Z e Z_e Ze 为调度期末水库控制水位, m m m

计算实例

基本资料

以三峡水库的发电优化调度问题为例,其兴利库容165 亿 m 3 m^3 m3,库容系数0.04,具有不完全年调节能力。水库正常蓄水位175 m,防洪限制水位145 m,枯季消落低水位155 m。电站32台机组,总装机容量2250万kW,保证出力499万kW,下游航运及生态基流要求5 600 m 3 / s m^3/s m3/s。选择调度期为1年,计算时段为旬,调度期初水位为174 m,调度期末水位也控制为173 m,调度期内的逐旬入流过程为模拟入库过程。

模型结构

以调度期内发电量最大为目标函数,最小出库流量和保证出力作为罚函数,最大出力和水轮机组最大过水流量作为阈值,约束条件如上。
m a x E = ∑ t = 1 T N t ( q e t , H t ) Δ t + I n f ∗ m i n ( N t − N t ‾ N t ‾ , 0 ) + I n f ∗ m i n ( q e t − q t ‾ q t ‾ , 0 ) max E=\sum_{t=1}^{T}{N_t(qe_t,H_t)\Delta t + Inf*min(\frac{N_t-\underline {N_t}}{\underline {N_t}},0)+Inf*min(\frac{qe_t-\underline {q_t}}{\underline {q_t}},0)} maxE=t=1TNt(qet,Ht)Δt+Infmin(NtNtNt,0)+Infmin(qtqetqt,0)
式中, N t ( ⋅ ) N_t(·) Nt() t t t 时段的电站平均出力, H t H_t Ht为水库 t t t 时段平均水头, q e t qe_t qet t t t 时段平均发电流量, T T T 为调度期时段数, Δ t \Delta t Δt 为时段长, I n f Inf Inf为罚因子,这里取一个很大的正数。

计算结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

MATLAB代码

f ( x , y ) = x 2 + y 2 f(x,y)=x^2+y^2 f(x,y)=x2+y2

%2019.11.9
%目标函数max f = x^2+y^2 
%约束条件 -1<x,y<1 x^2+y^2<=1

close all;
clc,clear;
NP=5000;
D=2;        % 染色体长度
G=200;
F0=0.4;
CR=0.1;
a=-1;     % 寻优区间
b=1;
 
x=zeros(NP,D);    % 初始种群
v=zeros(NP,D);    % 变异种群
u=zeros(NP,D);    % 选择种群
%   种群赋初值
for i=1:1:NP
x(i,:)=rand(1,D)*(b-a)+a;
while sum(x(i,:).^2)>1
    x(i,:)=rand(1,D)*(b-a)+a;
end
end
%   计算目标参数
for i=1:1:NP
    ob(i)=sum(x(i,:).^2);  
end
trace(1)=max(ob);
%          差分进化循环
for gen=1:G
    %   变异操作
    for m=1:NP
        r1=randi([1,NP],1,1); %从种群NP中随机选择一个个体
        while(r1==m)
            r1=randi([1,NP],1,1);
        end
        
        r2=randi([1,NP],1,1);
        while(r2==r1)||(r2==m)
            r2=randi([1,NP],1,1);
        end
        
        r3=randi([1,NP],1,1);
        while(r3==m)||(r3==r2)||(r3==r1)
            r3=randi([1,NP],1,1);
        end
        %  产生不同的r1,r2,r3
        
        v(m,:)=x(r1,:)+F0*(x(r2,:)-x(r3,:));
        
        while sum(v(m,:).^2)>1  %判断v是否符合要求
            
            r1=randi([1,NP],1,1); %从种群NP中随机选择一个个体
        while(r1==m)
            r1=randi([1,NP],1,1);
        end
        
        r2=randi([1,NP],1,1);
        while(r2==r1)||(r2==m)
            r2=randi([1,NP],1,1);
        end
        
        r3=randi([1,NP],1,1);
        while(r3==m)||(r3==r2)||(r3==r1)
            r3=randi([1,NP],1,1);
        end
        %  产生不同的r1,r2,r3
        
        v(m,:)=x(r1,:)+F0*(x(r2,:)-x(r3,:));
        end
    end
    
    %   交叉操作
    
    r=randi([1,D],1,1);   % 这个变异是针对整个种群的变异,不针对单个个体
    for n=1:D
        cr=rand;
        if (cr<=CR)||(n==r)
            u(:,n)=v(:,n);
        else
            u(:,n)=x(:,n);
        end
    end
    for m=1:1:NP   
    ma(m)=sum(u(m,:).^2);  %判断u是否满足平方和小于1
    end
    while max(ma)>1
        r=randi([1,D],1,1);   % 这个变异是针对整个种群的变异,不针对单个个体
        for n=1:D
            cr=rand;
            if (cr<=CR)||(n==r)
                u(:,n)=v(:,n);
            else
                u(:,n)=x(:,n);
            end
        end
        for m=1:1:NP   
            ma(m)=sum(u(m,:).^2);  %判断u是否满足平方和小于1
        end
    end
    %     边界条件处理
    for m=1:NP
        for n=1:D
            if u(m,n)<a
                u(m,n)=a;
            end
            if u(m,n)>b
                u(m,n)=b;
            end
        end
    end
    
    % 自然选择
    % 计算新的适应度
    for m=1:NP
        ob_1(m)=sum(u(m,:).^2);
    end
    
    for m=1:NP
        if ob_1(m)>ob(m)
            x(m,:)=u(m,:);
        else
            x(m,:)=x(m,:);
        end   
    end
    
    % 现在x为经过选择后的种群
    for m=1:NP
        ob(m)=sum(x(m,:).^2);
    end
    
    trace(gen+1)=max(ob);
    tt=max(ob);
end

%绘制寻优过程
figure(1); 
plot(trace);
title(['差分进化算法(DE)最大值: ', num2str(tt)]);
xlabel('迭代次数'); 
ylabel('目标函数值');

%绘制解集
figure(2); 
plot(x(:,1),x(:,2),'.');
xlabel('x');
ylabel('y');

f ( x , y , z ) = x 2 + y 2 + z 2 f(x,y,z)=x^2+y^2+z^2 f(x,y,z)=x2+y2+z2

%2019.11.15
%目标函数max f = x^2+y^2+z^2 
%约束条件 -1<x,y,z<1 x^2+y^2+z^2<=1

close all;
clc,clear;
NP=10000;
D=3;        % 染色体长度
G=100;
F0=0.4;
CR=0.1;
a=-1;     % 寻优区间
b=1;
yz=10^-6;
 
x=zeros(NP,D);    % 初始种群
v=zeros(NP,D);    % 变异种群
u=zeros(NP,D);    % 选择种群
%   种群赋初值
for i=1:1:NP
x(i,:)=rand(1,D)*(b-a)+a;
while sum(x(i,:).^2)>1
    x(i,:)=rand(1,D)*(b-a)+a;
end
end
%   计算目标参数
for i=1:1:NP
    ob(i)=sum(x(i,:).^2);  
end
trace(1)=max(ob);
%          差分进化循环
for gen=1:G
    %   变异操作
    for m=1:NP
        r1=randi([1,NP],1,1); %从种群NP中随机选择一个个体
        while(r1==m)
            r1=randi([1,NP],1,1);
        end
        
        r2=randi([1,NP],1,1);
        while(r2==r1)||(r2==m)
            r2=randi([1,NP],1,1);
        end
        
        r3=randi([1,NP],1,1);
        while(r3==m)||(r3==r2)||(r3==r1)
            r3=randi([1,NP],1,1);
        end
        %  产生不同的r1,r2,r3
        
        v(m,:)=x(r1,:)+F0*(x(r2,:)-x(r3,:));
        
        while sum(v(m,:).^2)>1  %判断v是否符合要求
            
            r1=randi([1,NP],1,1); %从种群NP中随机选择一个个体
        while(r1==m)
            r1=randi([1,NP],1,1);
        end
        
        r2=randi([1,NP],1,1);
        while(r2==r1)||(r2==m)
            r2=randi([1,NP],1,1);
        end
        
        r3=randi([1,NP],1,1);
        while(r3==m)||(r3==r2)||(r3==r1)
            r3=randi([1,NP],1,1);
        end
        %  产生不同的r1,r2,r3
        
        v(m,:)=x(r1,:)+F0*(x(r2,:)-x(r3,:));
        end
    end
    
    %   交叉操作
    
    r=randi([1,D],1,1);   % 这个变异是针对整个种群的变异,不针对单个个体
    for n=1:D
        cr=rand;
        if (cr<=CR)||(n==r)
            u(:,n)=v(:,n);
        else
            u(:,n)=x(:,n);
        end
    end
    for m=1:1:NP   
    ma(m)=sum(u(m,:).^2);  %判断u是否满足平方和小于1
    end
    while max(ma)>1
        r=randi([1,D],1,1);   % 这个变异是针对整个种群的变异,不针对单个个体
        for n=1:D
            cr=rand;
            if (cr<=CR)||(n==r)
                u(:,n)=v(:,n);
            else
                u(:,n)=x(:,n);
            end
        end
        for m=1:1:NP   
            ma(m)=sum(u(m,:).^2);  %判断u是否满足平方和小于1
        end
    end
    %     边界条件处理
    for m=1:NP
        for n=1:D
            if u(m,n)<a
                u(m,n)=a;
            end
            if u(m,n)>b
                u(m,n)=b;
            end
        end
    end
    
    % 自然选择
    % 计算新的适应度
    for m=1:NP
        ob_1(m)=sum(u(m,:).^2);
    end
    
    for m=1:NP
        if ob_1(m)>ob(m)
            x(m,:)=u(m,:);
        else
            x(m,:)=x(m,:);
        end   
    end
    
    % 现在x为经过选择后的种群
    for m=1:NP
        ob(m)=sum(x(m,:).^2);
    end
    
    trace(gen+1)=max(ob);
    tt=max(ob);
end

%绘制寻优过程
figure(1); 
plot(trace);
title(['差分进化算法(DE)最大值: ', num2str(tt)]);
xlabel('迭代次数'); 
ylabel('目标函数值');

%绘制解集
figure(2); 
plot3(x(:,1),x(:,2),x(:,3),'.');
xlabel('x');
ylabel('y');
zlabel('z');

R a s t r i g i n 函数 Rastrigin函数 Rastrigin函数

%2019.11.20
%目标函数min f = 20+x^2+y^2-10*(cos(2*x*pi)+cos(2*y*pi))
%约束条件 -5<x,y<5 

close all;
clc,clear;
NP=5000;
D=2;        % 染色体长度
G=200;
F0=0.4;
CR=0.1;
a=-5;     % 寻优区间
b=5;
 
x=zeros(NP,D);    % 初始种群
v=zeros(NP,D);    % 变异种群
u=zeros(NP,D);    % 选择种群
%   种群赋初值
for i=1:1:NP
x(i,:)=rand(1,D)*(b-a)+a;
%while 20+sum(x(i,:).^2)-10*sum(cos(2*x(i,:)*pi))<0
% x(i,:)=rand(0,1)*(b-a)+a;
%end
end
%   计算目标参数
for i=1:1:NP
    ob(i)=20+sum(x(i,:).^2)-10*sum(cos(2*x(i,:)*pi));  
end
trace(1)=min(ob);
%          差分进化循环
for gen=1:G
    %   变异操作
    for m=1:NP
        r1=randi([1,NP],1,1); %从种群NP中随机选择一个个体
        while(r1==m)
            r1=randi([1,NP],1,1);
        end
        
        r2=randi([1,NP],1,1);
        while(r2==r1)||(r2==m)
            r2=randi([1,NP],1,1);
        end
        
        r3=randi([1,NP],1,1);
        while(r3==m)||(r3==r2)||(r3==r1)
            r3=randi([1,NP],1,1);
        end
        %  产生不同的r1,r2,r3
        
        v(m,:)=x(r1,:)+F0*(x(r2,:)-x(r3,:));
        
 %       while 20+sum(x(i,:).^2)-10*sum(cos(2*x(i,:)*pi))<0  %判断v是否符合要求
            
 %           r1=randi([1,NP],1,1); %从种群NP中随机选择一个个体
 %       while(r1==m)
 %           r1=randi([1,NP],1,1);
 %       end
        
 %       r2=randi([1,NP],1,1);
 %       while(r2==r1)||(r2==m)
 %           r2=randi([1,NP],1,1);
 %       end
        
 %       r3=randi([1,NP],1,1);
 %       while(r3==m)||(r3==r2)||(r3==r1)
 %           r3=randi([1,NP],1,1);
 %       end
        %  产生不同的r1,r2,r3
        
 %      v(m,:)=x(r1,:)+F0*(x(r2,:)-x(r3,:));
   %     end
    end
    
    %   交叉操作
    
    r=randi([1,D],1,1);   % 这个变异是针对整个种群的变异,不针对单个个体
    for n=1:D
        cr=rand;
        if (cr<=CR)||(n==r)
            u(:,n)=v(:,n);
        else
            u(:,n)=x(:,n);
        end
    end
 %   for m=1:1:NP   
 %  ma(m)=20+sum(x(i,:).^2)-10*sum(cos(2*x(i,:)*pi));  %判断u是否满足平方和小于1
  %  end
  %  while min(ma)<0
        r=randi([1,D],1,1);   % 这个变异是针对整个种群的变异,不针对单个个体
        for n=1:D
            cr=rand;
            if (cr<=CR)||(n==r)
                u(:,n)=v(:,n);
            else
                u(:,n)=x(:,n);
            end
        end
   %     for m=1:1:NP   
   %         ma(m)=20+sum(x(i,:).^2)-10*sum(cos(2*x(i,:)*pi));  %判断u是否满足平方和小于1
   %    end
   % end
    %     边界条件处理
    for m=1:NP
        for n=1:D
            if u(m,n)<a
                u(m,n)=a;
            end
            if u(m,n)>b
                u(m,n)=b;
            end
        end
    end
    
    % 自然选择
    % 计算新的适应度
    for m=1:NP
        ob_1(m)=20+sum(u(m,:).^2)-10*sum(cos(2*u(m,:)*pi));
    end
    
    for m=1:NP
        if ob_1(m)<ob(m)
            x(m,:)=u(m,:);
        else
            x(m,:)=x(m,:);
        end   
    end
    
    % 现在x为经过选择后的种群
    for m=1:NP
        ob(m)=20+sum(x(m,:).^2)-10*sum(cos(2*x(m,:)*pi));
    end
    
    trace(gen+1)=min(ob);
    tt=min(ob);
end

%绘制寻优过程
figure(1); 
plot(trace);
title(['差分进化算法(DE)最小值: ', num2str(tt)]);
xlabel('迭代次数'); 
ylabel('目标函数值');

%绘制解集
%figure(2); 
%plot(x(:,1),x(:,2),'.');
%xlabel('x');
%ylabel('y');

S c h a f f e r 函数 Schaffer函数 Schaffer函数

%2019.11.20
%目标函数max f = 0.5-(sin(x^2-y^2)^2-0.5)/(1+0.001*(x^2+y^2))^2
%约束条件 -5<x,y<5 

close all;
clc,clear;
NP=5000;
D=2;        % 染色体长度
G=200;
F0=0.4;
CR=0.9;
a=-5;     % 寻优区间
b=5;
 
x=zeros(NP,D);    % 初始种群
v=zeros(NP,D);    % 变异种群
u=zeros(NP,D);    % 选择种群
%   种群赋初值
for i=1:1:NP
x(i,:)=rand(1,D)*(b-a)+a;
%while 20+sum(x(i,:).^2)-10*sum(cos(2*x(i,:)*pi))<0
% x(i,:)=rand(0,1)*(b-a)+a;
%end
end
%   计算目标参数
for i=1:1:NP
    ob(i)= 0.5-(sin(x(i,1)^2-x(i,2)^2)^2-0.5)/(1+0.001*sum(x(i,:).^2))^2; 
end
trace(1)=max(ob);
%          差分进化循环
for gen=1:G
    %   变异操作
    for m=1:NP
        r1=randi([1,NP],1,1); %从种群NP中随机选择一个个体
        while(r1==m)
            r1=randi([1,NP],1,1);
        end
        
        r2=randi([1,NP],1,1);
        while(r2==r1)||(r2==m)
            r2=randi([1,NP],1,1);
        end
        
        r3=randi([1,NP],1,1);
        while(r3==m)||(r3==r2)||(r3==r1)
            r3=randi([1,NP],1,1);
        end
        %  产生不同的r1,r2,r3
        
        v(m,:)=x(r1,:)+F0*(x(r2,:)-x(r3,:));
        
 %       while 20+sum(x(i,:).^2)-10*sum(cos(2*x(i,:)*pi))<0  %判断v是否符合要求
            
 %           r1=randi([1,NP],1,1); %从种群NP中随机选择一个个体
 %       while(r1==m)
 %           r1=randi([1,NP],1,1);
 %       end
        
 %       r2=randi([1,NP],1,1);
 %       while(r2==r1)||(r2==m)
 %           r2=randi([1,NP],1,1);
 %       end
        
 %       r3=randi([1,NP],1,1);
 %       while(r3==m)||(r3==r2)||(r3==r1)
 %           r3=randi([1,NP],1,1);
 %       end
        %  产生不同的r1,r2,r3
        
 %      v(m,:)=x(r1,:)+F0*(x(r2,:)-x(r3,:));
   %     end
    end
    
    %   交叉操作
    
    r=randi([1,D],1,1);   % 这个变异是针对整个种群的变异,不针对单个个体
    for n=1:D
        cr=rand;
        if (cr<=CR)||(n==r)
            u(:,n)=v(:,n);
        else
            u(:,n)=x(:,n);
        end
    end
 %   for m=1:1:NP   
 %  ma(m)=20+sum(x(i,:).^2)-10*sum(cos(2*x(i,:)*pi));  %判断u是否满足平方和小于1
  %  end
  %  while min(ma)<0
        r=randi([1,D],1,1);   % 这个变异是针对整个种群的变异,不针对单个个体
        for n=1:D
            cr=rand;
            if (cr<=CR)||(n==r)
                u(:,n)=v(:,n);
            else
                u(:,n)=x(:,n);
            end
        end
   %     for m=1:1:NP   
   %         ma(m)=20+sum(x(i,:).^2)-10*sum(cos(2*x(i,:)*pi));  %判断u是否满足平方和小于1
   %    end
   % end
    %     边界条件处理
    for m=1:NP
        for n=1:D
            if u(m,n)<a
                u(m,n)=a;
            end
            if u(m,n)>b
                u(m,n)=b;
            end
        end
    end
    
    % 自然选择
    % 计算新的适应度
    for m=1:NP
        ob_1(m)=0.5-(sin(u(i,1)^2-u(i,2)^2)^2-0.5)/(1+0.001*sum(u(i,:).^2))^2;
    end
    
    for m=1:NP
        if ob_1(m)>ob(m)
            x(m,:)=u(m,:);
        else
            x(m,:)=x(m,:);
        end   
    end
    
    % 现在x为经过选择后的种群
    for m=1:NP
        ob(m)=0.5-(sin(x(i,1)^2-x(i,2)^2)^2-0.5)/(1+0.001*sum(x(i,:).^2))^2;
    end
    
    trace(gen+1)=max(ob);
    tt=max(ob);
end

%绘制寻优过程
figure(1); 
plot(trace);
title(['差分进化算法(DE)最大值: ', num2str(tt)]);
xlabel('迭代次数'); 
ylabel('目标函数值');

%绘制解集
%figure(2); 
%plot(x(:,1),x(:,2),'.');
%xlabel('x');
%ylabel('y');

A c k l e y 函数 Ackley函数 Ackley函数

%2019.11.20
%目标函数Ackley函数 
%约束条件 [-32.768,32.768]

close all;
clc,clear;
NP=20;
D=15;        % 染色体长度,维度
G=500;
F0=0.5;   %缩放系数[0,2],一般取0.5
CR=0.3;   %交叉率[0,1],一般取0.3,增大会更快收敛,造成早熟
a=-32.768;     % 寻优区间
b=32.768;

 
x=zeros(NP,D);    % 初始种群
v=zeros(NP,D);    % 变异种群
u=zeros(NP,D);    % 选择种群

%   种群赋初值
x=rand(NP,D)*(b-a)+a;

%   计算目标参数
for i=1:1:NP
    ob(i)=-20*exp(-0.2*(1/D)*sqrt(sum(x(i,:).^2)))-exp((1/D)*sum(cos(2*pi.*x(i,:))))+20+exp(1);%Ackley函数
end
trace(1)=min(ob);

%          差分进化循环
for gen=1:G
    %   变异操作
    for m=1:NP
        r1=randi([1,NP],1,1);
        while(r1==m)
            r1=randi([1,NP],1,1);
        end
        
        r2=randi([1,NP],1,1);
        while(r2==r1)||(r2==m)
            r2=randi([1,NP],1,1);
        end
        
        r3=randi([1,NP],1,1);
        while(r3==m)||(r3==r2)||(r3==r1)
            r3=randi([1,NP],1,1);
        end
        %  产生不同的r1,r2,r3
        
        v(m,:)=x(r1,:)+F0*(x(r2,:)-x(r3,:));
 
    end
    
    %   交叉操作
    
    r=randi([1,D],1,1);   % 这个变异是针对整个种群的变异,不针对单个个体
    for n=1:D
        cr=rand;
        if (cr<=CR)||(n==r)
            u(:,n)=v(:,n);
        else
            u(:,n)=x(:,n);
        end
    end
    %     边界条件处理
    for m=1:NP
        for n=1:D
            if u(m,n)<a
                u(m,n)=a;
            end
            if u(m,n)>b
                u(m,n)=b;
            end
        end
    end
    
    % 自然选择
    % 计算新的适应度
    for i=1:NP
        ob_1(i)=-20*exp(-0.2*(1/D)*sqrt(sum(u(i,:).^2)))-exp((1/D)*sum(cos(2*pi.*u(i,:))))+20+exp(1);%Ackley函数
    end
    
    for m=1:NP
        if ob_1(m)<ob(m)
            x(m,:)=u(m,:);
        else
            x(m,:)=x(m,:);
        end
        
    end
    % 现在x为经过选择后的种群
    for i=1:NP
        ob(i)=-20*exp(-0.2*(1/D)*sqrt(sum(x(i,:).^2)))-exp((1/D)*sum(cos(2*pi.*x(i,:))))+20+exp(1);%Ackley函数
    end
    
    trace(gen+1)=min(ob);
    tt=min(ob);
end

%绘制寻优过程
figure(1); 
plot(trace);
title(['差分进化算法(DE)最小值: ', num2str(tt)]);
xlabel('迭代次数'); 
ylabel('目标函数值');

%绘制解集
% figure(2);
% 空间网格绘制;mesh
% [x1,y1]=meshgrid(-32.768:0.1:32.768);
% z=-20*exp(-0.2*(1/D)*sqrt(x1.^2+y1.^2))-exp((1/D)*(cos(2*pi.*x1)+cos(2*pi.*y1)))+20+exp(1);%Ackley函数
% mesh(x1,y1,z);
% xlabel('x');
% ylabel('y');
% zlabel('z');

G r i e w a n k 函数 Griewank函数 Griewank函数

%2019.11.20
%目标函数Griewank函数
%约束条件 [-600,600]

close all;
clc,clear;
NP=20;
D=30;        % 染色体长度
G=500;
F0=0.5;   %缩放系数[0,2],一般取0.5
CR=0.3;   %交叉率[0,1],一般取0.3,增大会更快收敛,造成早熟
a=-600;     % 寻优区间
b=600;

 
x=zeros(NP,D);    % 初始种群
v=zeros(NP,D);    % 变异种群
u=zeros(NP,D);    % 选择种群

%   种群赋初值
x=rand(NP,D)*(b-a)+a;

%   计算目标参数
for i=1:1:NP
    ob(i)=sum(x(i,:).^2)/4000; 
    prod=1;
    for j=1:1:D
        prod=prod*cos(x(i,j)/sqrt(j)); %连乘部分
    end
    ob(i)=ob(i)-prod+1; 
end

trace(1)=min(ob);

%          差分进化循环
for gen=1:G
    %   变异操作
    for m=1:NP
        r1=randi([1,NP],1,1);
        while(r1==m)
            r1=randi([1,NP],1,1);
        end
        
        r2=randi([1,NP],1,1);
        while(r2==r1)||(r2==m)
            r2=randi([1,NP],1,1);
        end
        
        r3=randi([1,NP],1,1);
        while(r3==m)||(r3==r2)||(r3==r1)
            r3=randi([1,NP],1,1);
        end
        %  产生不同的r1,r2,r3
        
        v(m,:)=x(r1,:)+F0*(x(r2,:)-x(r3,:));
 
    end
    
    %   交叉操作
    
    r=randi([1,D],1,1);   % 这个变异是针对整个种群的变异,不针对单个个体
    for n=1:D
        cr=rand;
        if (cr<=CR)||(n==r)
            u(:,n)=v(:,n);
        else
            u(:,n)=x(:,n);
        end
    end
    %     边界条件处理
    for m=1:NP
        for n=1:D
            if u(m,n)<a
                u(m,n)=a;
            end
            if u(m,n)>b
                u(m,n)=b;
            end
        end
    end
    
    % 自然选择
    % 计算新的适应度
    for m=1:NP
        ob_1(m)=sum(u(m,:).^2)/4000; 
        prod=1;
        for j=1:1:D
            prod=prod*cos(u(m,j)/sqrt(j)); %连乘部分
        end
        ob_1(m)=ob_1(m)-prod+1;
    end
    
    for m=1:NP
        if ob_1(m)<ob(m)
            x(m,:)=u(m,:);
        else
            x(m,:)=x(m,:);
        end    
    end
    
    % 现在x为经过选择后的种群
    for m=1:NP
        ob(m)=sum(x(m,:).^2)/4000; 
        prod=1;
        for j=1:1:D
            prod=prod*cos(x(m,j)/sqrt(j)); %连乘部分
        end
        ob(m)=ob(m)-prod+1;
    end
    
    trace(gen+1)=min(ob);
    tt=min(ob);
end

%绘制寻优过程
figure(1); 
plot(trace);
title(['差分进化算法(DE)最小值: ', num2str(tt)]);
xlabel('迭代次数'); 
ylabel('目标函数值');

%绘制解集
% figure(2);
% 空间网格绘制;mesh
% [x1,y1]=meshgrid(-5:0.1:5);
% z=(x1.^2+y1.^2)/4000-cos(x1./sqrt(1))*cos(y1./sqrt(2))+1;
% mesh(x1,y1,z);
% xlabel('x');
% ylabel('y');
% zlabel('z');

单库发电优化

%-----------------------备注-------------------------
%2019.11.15
%三峡2015年资料作为约束条件
%目标函数max f = K Sigma Hi Qi delta t 
%调度期为1年,每旬为一个时段,共36个时段

%-----------------------参数定义及初始化-------------------------
close all;
clc,clear;
NP=50;      %种群个体数量
D=37;       %染色体长度,这里有36旬,共37个节点蓄水量
G=2000;       %迭代代数
F0=0.5;      %缩放因子[0,2],一般取0.5
CR=0.3;      %交叉率[0,1],一般取0.3,增大会更快收敛,造成早熟
Inf=10^20;    %罚因子
K=8;        %水库出力系数
Nmin=499*10^4; %最小出力
Nmax=2250*10^4; %最大出力
%qmax=? %水轮机组最大过水流量
q=zeros(NP,D-1);
trace=zeros(1,G+1);

%尾水曲线的三个参数 Zd=a*q^2+b*q+d
a=0.0000000011101;
b=0.0000836;
d=65.5;

%水库的水位库容曲线
zu=[130	135	140	145	150	155	160	165	170	175	185];
V=[103.3	124.1	147	171.5	196.9	228	262	300.2	344	393	445.7];

%各旬初的最低水位与最高水位
Zmin=[155 155 155 155 155 155 155 155 155 155 145 145 145 145 145 145 145 145 ...
     145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 155];
Zmax=[175 175 175 175 175 175 175 175 175 175 175 175 175 175 170 155 146.5 146.5 146.5 ...
    146.5 146.5	146.5 146.5	146.5 146.5 165 165 175	175	175	175	175	175	175	175	175 175];
%内插各旬初的最低蓄水量与最高蓄水量
Vmin=[228,228,228,228,228,228,228,228,228,228,171.5,171.5,171.5,171.5,171.5,171.5,171.5,171.5,171.5,171.5,171.5,171.5,171.5,171.5,171.5,171.5,171.5,171.5,171.5,171.5,171.5,171.5,171.5,171.5,171.5,171.5,228];
Vmax=[393,393,393,393,393,393,393,393,393,393,393,393,393,393,344,228,179.12,179.12,179.12,179.12,179.12,179.12,179.12,179.12,179.12,300.2,300.2,393,393,393,393,393,393,393,393,393,393];

%各旬入库流量
Q=[5323	5351	4467	3967	4000	4382	4984	5037	4962	6194	7709	5354	6993	11091	12918	14778	15566 17060 ...
   27816	32798	33851	23446	20049	14796	17779	21637	17266	11754	10443	9019	7725	7244	6161	5424	5471	5250];

%各旬的最小下泄流量
qmin=[6000 6000 6000 6000 6000 6000	6000 6000 6000 6000	6000 6000 5700 5700 5700 5700 5700	5700 ...	
     5700 5700 5700	5700 5700 5700 5700	5700 10000 10000 8000 8000 5700	5700 5700 5700 5700 5700];

%各旬的时段长,h
dt=[240	240	264	240	240	192	240	240	264	240	240	240	240	240	264	240	240	240	...	
    240	240	264 240	240	264	240	240	240	240	240	264	240	240	240	240	240	240];

Z0=174; %调度期初水位约束
ZT=173; %调度期末水位约束
V0=interp1(zu,V,Z0); %调度期初蓄量约束
VT=interp1(zu,V,ZT); %调度期末蓄量约束

x=zeros(NP,D);    %初始种群
x(:,1)=V0; x(:,D)=VT;      %调度期初、末蓄量约束

v=zeros(NP,D);    %变异种群
u=zeros(NP,D);    %选择种群


%种群初始化
for i=1:1:NP
    x=init(i,x); %生成一个时间序列,满足水位约束
    q(i,:)=-(diff(x(i,:)))*10^8./(3600*dt) + Q; %q为出库流量  
end

%   计算目标参数
Vmean=(conv2(x',[1;1],'valid'))'/2; %用conv2求相邻旬蓄量平均值
Zu=interp1(V,zu,Vmean); %根据库容曲线内插得到上游水位
Zd=a*q.^2+b*q+d; %根据尾水曲线公式生成下游水位
N=K*q.*(Zu-Zd); %各旬的出力
N(N>Nmax)=Nmax; %出力超过装机容量的旬时段改为装机容量
E=N.*dt;  %各旬的发电量
Fit=E+Inf*min((N-Nmin)/Nmin,0)+Inf*min((q-qmin)./qmin,0); %适应度矩阵
ob=sum(Fit,2); %适应度矩阵每一行的和
trace(1)=max(ob);  %记录下适应度最大值

%差分进化循环
for gen=1:G
    %   变异操作
    for m=1:NP
        r1=randi([1,NP],1,1); %从种群NP中随机选择一个个体
        while(r1==m)
            r1=randi([1,NP],1,1);
        end
        
        r2=randi([1,NP],1,1);
        while(r2==r1)||(r2==m)
            r2=randi([1,NP],1,1);
        end
        
        r3=randi([1,NP],1,1);
        while(r3==m)||(r3==r2)||(r3==r1)
            r3=randi([1,NP],1,1);
        end
        %  产生不同的r1,r2,r3
        
        v(m,:)=x(r1,:)+F0*(x(r2,:)-x(r3,:));
        
    end
    
    %   交叉操作
    
    r=randi([1,D],1,1);   % 这个变异是针对整个种群的变异,不针对单个个体
    for n=1:D
        cr=rand;
        if (cr<=CR)||(n==r)
            u(:,n)=v(:,n);
        else
            u(:,n)=x(:,n);
        end
    end
    
    %     边界条件处理
    u(:,1)=V0; u(:,D)=VT;      %调度期初、末蓄量约束
    %中间各旬蓄量约束
    for m=1:NP
        for n=2:D-1
            if u(m,n)<Vmin(n)
                u(m,n)=Vmin(n);
            end
            if u(m,n)>Vmax(n)
                u(m,n)=Vmax(n);
            end
        end
    end
    
    % 自然选择
    % 计算新的适应度
    for i=1:1:NP
        q(i,:)=-(diff(u(i,:)))*10^8./(3600*dt) + Q; %q为出库流量  
    end
 
    Vmean=(conv2(u',[1;1],'valid'))'/2; %用conv2求相邻旬蓄量平均值
    Zu=interp1(V,zu,Vmean); %根据库容曲线内插得到上游水位
    Zd=a*q.^2+b*q+d; %根据尾水曲线公式生成下游水位
    N=K*q.*(Zu-Zd); %各旬的出力
    N(N>Nmax)=Nmax; %出力超过装机容量的旬时段改为装机容量
    E=N.*dt;  %各旬的发电量
    Fit=E+Inf*min((N-Nmin)/Nmin,0)+Inf*min((q-qmin)./qmin,0); %适应度矩阵
    ob_1=sum(Fit,2); %适应度矩阵每一行的和即每个个体的适应度
    
    for m=1:NP
        if ob_1(m)>ob(m)
            x(m,:)=u(m,:);
        end   
    end
    
    % 现在x为经过选择后的种群
    for i=1:1:NP
        q(i,:)=-(diff(x(i,:)))*10^8./(3600*dt) + Q; %q为出库流量
    end
    
    %   计算目标参数
    Vmean=(conv2(x',[1;1],'valid'))'/2; %用conv2求相邻旬蓄量平均值
    Zu=interp1(V,zu,Vmean); %根据库容曲线内插得到上游水位
    Zd=a*q.^2+b*q+d; %根据尾水曲线公式生成下游水位
    N=K*q.*(Zu-Zd); %各旬的出力
    N(N>Nmax)=Nmax; %出力超过装机容量的旬时段改为装机容量
    E=N.*dt;  %各旬的发电量
    Fit=E+Inf*min((N-Nmin)/Nmin,0)+Inf*min((q-qmin)./qmin,0); %适应度矩阵
    ob=sum(Fit,2); %适应度矩阵每一行的和
  
    trace(gen+1)=max(ob); %记录下适应度最大值
end

    [obmax,p]=max(ob); %求出最大适应度和位置
    xfit=x(p,:); %记录最适合的库蓄量调度序列
    qfit=q(p,:); %记录最适合的出库流量序列
    Zufit=interp1(V,zu,xfit); %记录最适合的库水位调度序列
    Nfit=N(p,:)/10^4; %记录最适合的出力序列
    Efit=E(p,:)/10^8; %记录最适合的发电量序列 亿kW·h 
    Esum=sum(Efit);  %一年的发电量 亿kW·h
    
%绘制寻优过程
figure(1); 
plot(trace);
title(['差分进化算法(DE)最大值: ', num2str(Esum),'亿kW·h']);
xlabel('迭代次数'); 
ylabel('目标函数值/亿kW·h');

%绘制解集
figure(2); 
plot(xfit);
title('水库蓄量变化过程 ');
xlabel('旬'); 
ylabel('蓄量/亿m^3');

%绘制出库流量过程
figure(3); 
plot(qfit);
title('出库流量过程 ');
xlabel('旬'); 
ylabel('流量(m^3/s)');

%绘制水位变化过程
figure(4); 
plot(Zufit);
title('水库水位变化过程 ');
xlabel('旬'); 
ylabel('水位/m');

%绘制出力过程
figure(5); 
plot(Nfit);
title('水库出力变化过程 ');
xlabel('旬'); 
ylabel('出力/万kW');

%绘制发电量变化过程
figure(6); 
plot(Efit);
title('水库发电量变化过程 ');
xlabel('旬'); 
ylabel('发电量/亿kW·h');

function x=init(i,x,D,Q,qmin,dt,Vmin,Vmax)
%设置函数默认值   
if nargin==2
       D=37;
    %各旬初的最低水位与最高水位
   
    Vmin=[228,228,228,228,228,228,228,228,228,228,171.5,171.5,171.5,171.5,171.5,171.5,171.5,171.5,171.5,171.5,171.5,171.5,171.5,171.5,171.5,171.5,171.5,171.5,171.5,171.5,171.5,171.5,171.5,171.5,171.5,171.5,228];
    Vmax=[393,393,393,393,393,393,393,393,393,393,393,393,393,393,344,228,179.12,179.12,179.12,179.12,179.12,179.12,179.12,179.12,179.12,300.2,300.2,393,393,393,393,393,393,393,393,393,393];
    %各旬入库流量
    Q=[5323	5351	4467	3967	4000	4382	4984	5037	4962	6194	7709	5354	6993	11091	12918	14778	15566 17060 ...
       27816	32798	33851	23446	20049	14796	17779	21637	17266	11754	10443	9019	7725	7244	6161	5424	5471	5250];
    %各旬的最小下泄流量
    qmin=[6000 6000 6000 6000 6000 6000	6000 6000 6000 6000	6000 6000 5700 5700 5700 5700 5700	5700 ...	
         5700 5700 5700	5700 5700 5700 5700	5700 10000 10000 8000 8000 5700	5700 5700 5700 5700 5700];
    %各旬的时段长,h
    dt=[240	240	264	240	240	192	240	240	264	240	240	240	240	240	264	240	240	240	...	
        240	240	264 240	240	264	240	240	240	240	240	264	240	240	240	240	240	240];
end 
   
   for j=2:1:D-1
        %计算本时段末水库最大蓄水量,亿立方米
%         Vmaxj=x(i,j-1)+3600*(Q(j-1))*dt(j-1)/10^8;
%         %计算蓄水量上限
%         if Vmaxj<Vmin(j)
%             Vmaxj=Vmax(j);
%         else
%         Vmaxj=min(Vmaxj,Vmax(j));
%         end
        
        %随机产生本时段初蓄水量
        x(i,j)=Vmin(j)+rand*(Vmax(j)-Vmin(j));     
   end
end
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卢家波

如果对你有帮助,请我喝杯茶吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值