读书使人充实,讨论使人机智,笔记使人准确…。凡有所学,皆成性格。
———— (英国)培根
文章目录
差分进化算法理论
差分进化算法是一种随机的启发式搜索算法,简单易用,有较强的鲁棒性和全局寻优能力。它从数学角度看是一种随机搜索算法,从工程角度看是一种自适应的迭代寻优过程。除了具有较好的收敛性外,差分进化算法非常易于理解与执行,它只包含不多的几个控制参数,并且在整个迭代过程中,这些参数的值可以保持不变。
参数 | 取值 |
---|---|
种群数量 N p N_{p} Np | 一般 N p N_{p} Np取5D~10D之间且必须 N p ≥ 4 N_{p} \geq 4 Np≥4 |
变异算子 F F F | F ∈ [ 0 , 2 ] F∈[0,2] F∈[0,2] 一般取0.5 |
交叉算子CR | C R ∈ [ 0 , 2 ] CR∈[0,2] CR∈[0,2] 一般取0.1 快解可尝试CR=0.9或CR=1.0 |
最大进化代数G | G G G的取值可在100~500之间 |
终止条件 | 一般当目标函数值小于阈值时程序终止,阈值常选为 1 0 − 6 10^{-6} 10−6 |
[求最小值]计算函数 f ( x ) = ∑ i = 1 n x i 2 ( − 20 ≤ x i ≤ 20 ) f(x)=\sum_{i=1}^nx_{i}^2\quad(-20 \leq x_{i} \leq 20) f(x)=∑i=1nxi2(−20≤xi≤20) 的最小值,其中个体x的维数n=10。这是一个简单的平方和函数,只有一个极小点x=(0,0,…,0),理论最小值f(0,0,…,0)=0
解:仿真过程如下:
(1)初始化个体数目为 N P N_{P} NP=50,变量维数为D=10,最大进化代数为G=200,初始变异算子 F 0 F_{0} F0=0.4,交叉算子CR=0.1,阈值yz= 1 0 − 6 10^{-6} 10−6。
(2)产生初始种群,计算个体目标函数;进行变异操作、交叉操作、边界条件处理,产生临时种群,其中变异操作采用自适应变异算子,边界条件处理采用在可行域中随机产生参数向量的方式。
(3)计算临时种群个体目标函数,与原种群对应个体进行“一对一”选择操作,产生新种群。
(4)判断是否满足终止条件:若满足,则结束搜索过程,输出优化值;若不满足,则继续进行迭代优化。
优化结束后,DE目标函数曲线如图所示,优化后的结果为x=[0.0007 -0.0010 0.0014 -0.0007 0.0015 -0.0005 -0.0001 -0.0008 -0.0019 -0.0011],函数f(x)的最小值为2.713×10-6。
MATLAB源程序如下:
%%%%%%%%%%%%%%%%%差分进化算法求函数极值%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%初始化%%%%%%%%%%%%%%%%%%%%%%%%%
clear all; %清除所有变量
close all; %清图
clc; %清屏
NP=50; %个体数目
D=10; %变量的维数
G=200; %最大进化代数
F0=0.4; %初始变异算子
CR=0.1; %交叉算子
Xs=20; %上限
Xx=-20; %下限
yz=10^-6; %阈值
%%%%%%%%%%%%%%%%%%%%%%%%%赋初值%%%%%%%%%%%%%%%%%%%%%%%%
x=zeros(D,NP); %初始种群
v=zeros(D,NP); %变异种群
u=zeros(D,NP); %选择种群
x=rand(D,NP)*(Xs-Xx)+Xx; %赋初值
%%%%%%%%%%%%%%%%%%%%计算目标函数%%%%%%%%%%%%%%%%%%%%
for m=1:NP
Ob(m)=func1(x(:,m));
end
trace(1)=min(Ob);
%%%%%%%%%%%%%%%%%%%%%%%差分进化循环%%%%%%%%%%%%%%%%%%%%%
for gen=1:G
%%%%%%%%%%%%%%%%%%%%%%变异操作%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%自适应变异算子%%%%%%%%%%%%%%%%%%%
lamda=exp(1-G/(G+1-gen));
F=F0*2^(lamda);
%%%%%%%%%%%%%%%%%r1,r2,r3和m互不相同%%%%%%%%%%%%%%%%
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==m)|(r2==r1)
r2=randi([1,NP],1,1);
end
r3=randi([1,NP],1,1);
while (r3==m)|(r3==r1)|(r3==r2)
r3=randi([1,NP],1,1);
end
v(:,m)=x(:,r1)+F*(x(:,r2)-x(:,r3));
end
%%%%%%%%%%%%%%%%%%%%%%交叉操作%%%%%%%%%%%%%%%%%%%%%%%
r=randi([1,D],1,1);
for n=1:D
cr=rand(1);
if (cr<=CR)|(n==r)
u(n,:)=v(n,:);
else
u(n,:)=x(n,:);
end
end
%%%%%%%%%%%%%%%%%%%边界条件的处理%%%%%%%%%%%%%%%%%%%%%
for n=1:D
for m=1:NP
if (u(n,m)<Xx)|(u(n,m)>Xs)
u(n,m)=rand*(Xs-Xx)+Xx;
end
end
end
%%%%%%%%%%%%%%%%%%%%%%选择操作%%%%%%%%%%%%%%%%%%%%%%%
for m=1:NP
Ob1(m)=func1(u(:,m));
end
for m=1:NP
if Ob1(m)<Ob(m)
x(:,m)=u(:,m);
end
end
for m=1:NP
Ob(m)=func1(x(:,m));
end
trace(gen+1)=min(Ob);
if min(Ob(m))<yz
break
end
end
[SortOb,Index]=sort(Ob);
x=x(:,Index);
X=x(:,1); %最优变量
Y=min(Ob); %最优值
%%%%%%%%%%%%%%%%%%%%%%%%%画图%%%%%%%%%%%%%%%%%%%%%%%%%%
figure
plot(trace);
xlabel('迭代次数')
ylabel('目标函数值')
title('适应度进化曲线')
%%%%%%%%%%%%%%%%%%%%%%%适应度函数%%%%%%%%%%%%%%%%%%%%%%%%
function result=func1(x)
summ=sum(x.^2);
result=summ;
end
[求最小值]函数 f ( x , y ) = 3 c o s ( x y ) + x + y f(x,y)=3cos(xy)+x+y f(x,y)=3cos(xy)+x+y的最小值,其中x的取值范围为[-4,4],y的取值范围为[-4,4]。这是一个有多个局部极值的函数,其函数值图形如图所示,其MATLAB实现程序如下
%%%%%%%%%f(x,y)=3cos(xy)+x+y%%%%%%%%%%
clear all; %清除所有变量
close all; %清图
clc; %清屏
x=-4:0.02:4;
y=-4:0.02:4;
N=size(x,2);
for i=1:N
for j=1:N
z(i,j)=3*cos(x(i)*y(j))+x(i)+y(j);
end
end
mesh(x,y,z)
xlabel('x')
ylabel('y')
解:仿真过程如下:
(1)初始化个体数目为 N P N_{P} NP=20,变量维数为D=2,最大进化代数为G=100,变异算子F=0.5,交叉算子CR=0.1。
(2)产生初始种群,计算个体目标函数;进行变异操作、交叉操作、边界条件处理,产生临时种群,其中边界条件处理采用边界吸收方式。
(3)计算临时种群个体目标函数,与原种群对应个体进行“一对一”选择操作,产生新种群。
(4)判断是否满足终止条件:若满足,则结束搜索过程,输出优化值;若不满足,则继续进行迭代优化。
优化结束后,DE目标函数曲线如图3.4所示,优化后的结果为:x=-4,y=-3.9477,函数f(x,y)的最小值为-10.94。
MATLAB源程序如下:
%%%%%%%%%%%%%%%%%差分进化算法求函数极值%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%初始化%%%%%%%%%%%%%%%%%%%%%%%%
clear all; %清除所有变量
close all; %清图
clc; %清屏
NP=20; %个体数目
D=2; %变量的维数
G=100; %最大进化代数
F=0.5; %变异算子
CR=0.1; %交叉算子
Xs=4; %上限
Xx=-4; %下限
%%%%%%%%%%%%%%%%%%%%%%%%%赋初值%%%%%%%%%%%%%%%%%%%%%%%%
x=zeros(D,NP); %初始种群
v=zeros(D,NP); %变异种群
u=zeros(D,NP); %选择种群
x=rand(D,NP)*(Xs-Xx)+Xx; %赋初值
%%%%%%%%%%%%%%%%%%%%计算目标函数%%%%%%%%%%%%%%%%%%%%%%%
for m=1:NP
Ob(m)=func2(x(:,m));
end
trace(1)=min(Ob);
%%%%%%%%%%%%%%%%%%%%%%%差分进化循环%%%%%%%%%%%%%%%%%%%%%
for gen=1:G
%%%%%%%%%%%%%%%%%%%%%%变异操作%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%r1,r2,r3和m互不相同%%%%%%%%%%%%%%%
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==m)|(r2==r1)
r2=randi([1,NP],1,1);
end
r3=randi([1,NP],1,1);
while (r3==m)|(r3==r1)|(r3==r2)
r3=randi([1,NP],1,1);
end
v(:,m)=x(:,r1)+F*(x(:,r2)-x(:,r3));
end
%%%%%%%%%%%%%%%%%%%%%%交叉操作%%%%%%%%%%%%%%%%%%%%%%%
r=randi([1,D],1,1);
for n=1:D
cr=rand(1);
if (cr<=CR)|(n==r)
u(n,:)=v(n,:);
else
u(n,:)=x(n,:);
end
end
%%%%%%%%%%%%%%%%%%%边界条件的处理%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%边界吸收%%%%%%%%%%%%%%%%%%%%%%%%%
for n=1:D
for m=1:NP
if u(n,m)<Xx
u(n,m)=Xx;
end
if u(n,m)>Xs
u(n,m)=Xs;
end
end
end
%%%%%%%%%%%%%%%%%%%%%%选择操作%%%%%%%%%%%%%%%%%%%%%%%
for m=1:NP
Ob1(m)=func2(u(:,m));
end
for m=1:NP
if Ob1(m)<Ob(m)
x(:,m)=u(:,m);
end
end
for m=1:NP
Ob(m)=func2(x(:,m));
end
trace(gen+1)=min(Ob);
end
[SortOb,Index]=sort(Ob);
x=x(:,Index);
X=x(:,1); %最优变量
Y=min(Ob); %最优值
%%%%%%%%%%%%%%%%%%%%%%%%%画图%%%%%%%%%%%%%%%%%%%%%%%%%%
figure
plot(trace);
xlabel('迭代次数')
ylabel('目标函数值')
title('DE目标函数曲线')
%%%%%%%%%%%%%%%%%%%%%%%适应度函数%%%%%%%%%%%%%%%%%%%%%%%%%
function value=func2(x)
value=3*cos(x(1)*x(2))+x(1)+x(2);
end
[求最大值]用离散差分进化算法求函数 f ( x , y ) = − ( ( x 2 + y − 1 ) 2 + ( x + y 2 − 7 ) 2 ) / 200 + 10 f(x,y)=-((x^2+y-1)^2+(x+y^2-7)^2)/200+10 f(x,y)=−((x2+y−1)2+(x+y2−7)2)/200+10的最大值,其中x的取值为-100~100之间的整数,y的取值为-100~100之间的整数,其函数值图形如图所示。
%%%%%%%%f(x,y)=-((x^2+y-1).^2+(x+y^2-7)^2)/200+10%%%%%%%%
clear all; %清除所有变量
close all; %清图
clc; %清屏
x=-100:1:100;
y=-100:1:100;
N=size(x,2);
for i=1:N
for j=1:N
z(i,j)=-((x(i)^2+y(j)-1).^2+(x(i)+y(j)^2-7)^2)/200+10;
end
end
mesh(x,y,z)
xlabel('x')
ylabel('y')
解:仿真过程如下:
(1)初始化个体数目为 N P N_{P} NP=20,变量维数为D=2,最大进化代数为G=100,变异算子F=0.5,交叉算子CR=0.1。
(2)产生数值为[-100,100]内整数的初始种群,计算个体目标函数;进行变异操作,对变异后的种群内数值进行取整操作,然后进行交叉操作、边界条件处理操作,产生临时种群,其中边界条件处理采用边界吸收方式。
(3)计算临时种群个体目标函数,与原种群对应个体进行“一对一”选择操作,产生新种群。
(4)判断是否满足终止条件:若满足,则结束搜索过程,输出优化值;若不满足,则继续进行迭代优化。
优化结束后,DE目标函数曲线如图所示,优化后的结果为:x=-2,y=-3,函数f(x,y)的最大值为10
MATLAB源程序如下:
%%%%%%%%%%%%%%%%%离散差分进化算法求函数极值%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%初始化%%%%%%%%%%%%%%%%%%%%%%%%
clear all; %清除所有变量
close all; %清图
clc; %清屏
NP=20; %个体数目
D=2; %变量的维数
G=100; %最大进化代数
F=0.5; %变异算子
CR=0.1; %交叉算子
Xs=100; %上限
Xx=-100; %下限
%%%%%%%%%%%%%%%%%%%%%%%%%赋初值%%%%%%%%%%%%%%%%%%%%%%%%
x=zeros(D,NP); %初始种群
v=zeros(D,NP); %变异种群
u=zeros(D,NP); %选择种群
x=randi([Xx,Xs],D,NP); %赋初值
%%%%%%%%%%%%%%%%%%%%计算目标函数%%%%%%%%%%%%%%%%%%%%%%%
for m=1:NP
Ob(m)=func3(x(:,m));
end
trace(1)=max(Ob);
%%%%%%%%%%%%%%%%%%%%%%%差分进化循环%%%%%%%%%%%%%%%%%%%%%
for gen=1:G
%%%%%%%%%%%%%%%%%%%%%%变异操作%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%r1,r2,r3和m互不相同%%%%%%%%%%%%%%%
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==m)|(r2==r1)
r2=randi([1,NP],1,1);
end
r3=randi([1,NP],1,1);
while (r3==m)|(r3==r1)|(r3==r2)
r3=randi([1,NP],1,1);
end
v(:,m)=floor(x(:,r1)+F*(x(:,r2)-x(:,r3)));
end
%%%%%%%%%%%%%%%%%%%%%%交叉操作%%%%%%%%%%%%%%%%%%%%%%%
r=randi([1,D],1,1);
for n=1:D
cr=rand(1);
if (cr<=CR)|(n==r)
u(n,:)=v(n,:);
else
u(n,:)=x(n,:);
end
end
%%%%%%%%%%%%%%%%%%%边界条件的处理%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%边界吸收%%%%%%%%%%%%%%%%%%%%%%%%%
for n=1:D
for m=1:NP
if u(n,m)<Xx
u(n,m)=Xx;
end
if u(n,m)>Xs
u(n,m)=Xs;
end
end
end
%%%%%%%%%%%%%%%%%%%%%%选择操作%%%%%%%%%%%%%%%%%%%%%%%
for m=1:NP
Ob1(m)=func3(u(:,m));
end
for m=1:NP
if Ob1(m)>Ob(m)
x(:,m)=u(:,m);
end
end
for m=1:NP
Ob(m)=func3(x(:,m));
end
trace(gen+1)=max(Ob);
end
[SortOb,Index]=sort(Ob);
X=x(:,Index);
Xbest=X(:,end); %最优变量
Y=max(Ob); %最优值
%%%%%%%%%%%%%%%%%%%%%%%%%画图%%%%%%%%%%%%%%%%%%%%%%%%%%
figure
plot(trace);
xlabel('迭代次数')
ylabel('目标函数值')
title('DE目标函数曲线')
%%%%%%%%%%%%%%%%%%%%%%%适应度函数%%%%%%%%%%%%%%%%%%%%%%%%%
function y=func3(x)
y=-((x(1).^2+x(2)-1).^2+(x(1)+x(2).^2-7).^2)/200+10;
end
[1]包子阳 余继周 杨彬.智能优化算法及其MATLAB实例[M]电子工业出版社,2021