算法简介
差分进化算法是进化算法的一种,与遗传算法(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+y2≤1
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+z2≤1
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=1∑d[xi2−10cos(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=1∑dxi2)−exp(d1i=1∑dcos(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=1∑d4000xi2−i=1∏dcos(ixi)+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=1∑TNt(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 为时段长。
约束条件
- 水量平衡约束
V t = V t − 1 + ( Q t − q t ) Δ t V_t=V_{t-1}+(Q_t-q_t)\Delta t Vt=Vt−1+(Qt−qt)Δt
式中, V t 、 V t + 1 V_t、V_{t +1} Vt、Vt+1分别为水库 t t t 时段始末库蓄水量, Q t Q_t Qt 为 t t t 时段平均入库流量, q t q_t qt 为 t t t 时段平均出库流量。 - 水位约束
Z t ‾ ≤ Z t ≤ Z t ‾ \underline{Z_t}\le Z_t \le \overline{Z_t} Zt≤Zt≤Zt
式中, Z t ‾ 、 Z t ‾ \overline{Z_t}、\underline {Z_t} Zt、Zt分别为 t t t 时段初水库水位上下限。 - 出库流量约束
q t ‾ ≤ q t ≤ q t ‾ \underline{q_t}\le q_t \le \overline{q_t} qt≤qt≤qt
式中, q t ‾ 、 q t ‾ \overline{q_t}、\underline {q_t} qt、qt分别为 t t t 时段初水库出库流量上下限。 - 出力约束
N t ‾ ≤ N t ≤ N t ‾ \underline{N_t}\le N_t \le \overline{N_t} Nt≤Nt≤Nt
式中, N t ‾ 、 N t ‾ \overline{N_t}、\underline {N_t} Nt、Nt分别为 t t t 时段初水库出力上下限。 - 调度期初、末水位约束
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=1∑TNt(qet,Ht)Δt+Inf∗min(NtNt−Nt,0)+Inf∗min(qtqet−qt,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