这是小鱼学习后自己整理的相关知识和撰写的代码,如有不妥之处,希望大家可以在评论区进行指正,小鱼很感激!
差分进化算法的基本理论
什么是差分进化算法
简介:差分进化算法是一种随机的、并行的、直接的搜索算法,属于基于种群的自适应全局优化算法(演化算法的一种)。
特点:结构简单、易实现、收敛快速、鲁棒性强、自适应性、内在并行性等。
基本思想:
(1)初始化种群X
(2)变异:X中随机选两个向量,进行差分计算,其结果作为加权,按照一定的规则和第三个个体进行求和,完成变异。
(3)交叉:将变异个体与预先确定的目标个体进行参数混合,完成交叉。
(4)选择:个体的适应度值优于阈值,下一代用该个体取代目标个体,否则不变,完成选择。
(5)迭代:基于上述步骤,保留优良个体,引导搜索过程向全局最优解逼近。
算法实现:
(1)确定控制参数(种群规模NP【5D~10D,且满足大于等于4】、变异算子F和交叉算子CR【0~1,越大收敛越快】)、适应度函数和最大进化代数
(2)随机初始化:
(3)评价每个个体的适应度值
(4)判断是否产生终止条件,若是则终止进化,此时得到的个体作为最佳个体(最优解)输出;否则,继续进化
(5)变异: ,
自适应变异算子为:
(6)交叉:
(7)选择:根据是否目标函数最小化来选择,得到新一代种群。
(8)边界问题:当产生新的个体,不符合边界条件时,采用(1)式进行代替。
(9)G=G+1,重复(3)-(8).
求某函数最小值:即测试函数
clc,clear,close all;
Gm=1000;%最大迭代数
F0=0.6;%初始变异算子
NP=100;%种群规模
CR=0.9;%交叉算子
G=1;%初始迭代数
N=30;%维数
xl=-5.12;
xu=5.12;
%% 初始化
ge=zeros(1,NP);
Bx=zeros(NP,N);
X0=(xu-xl)*rand(NP,N)+xl;
X=X0;
X1new=zeros(NP,N);
X1_new=zeros(NP,N);
X1=zeros(NP,N);
value=zeros(1,NP);
a=1;
b=NP;
%% 迭代
while G<Gm
for i = 1:NP
dx=randperm(b-a+1)+a-1;
j=dx(1);
k=dx(2);
p=dx(3);
if j==i
j=dx(4);
elseif k==i
k=dx(4);
elseif p==i
p=dx(4);
end
lambda=exp(1-Gm/(Gm+1-G));
F=F0*2.^lambda;
bon=X(p,:)+F*(X(j,:)-X(k,:));
if(bon>xl)&(bon<xu)
X1new(i,:)=bon;
else
X1new(i,:)=(xu-xl)*rand(1,N)+xl;
end
end
for i=1:NP
if rand>CR
X1_new(i,:)=X(i,:);
else
X1_new(i,:)=X1new(i,:);
end
end
for i=1:NP
if fun(X1_new(i,:))<fun(X(i,:))
X1(i,:)=X1_new(i,:);
else
X1(i,:)=X(i,:);
end
end
for i=1:NP
value(i)=fun(X1(i,:));
end
[fl,nl]=min(value);
ge(G)=fl;
bx(G,:)=X1(nl,:);
G=G+1;
X=X1;
end
[gl,n]=min(ge);
bvalue=gl
bs=bx(n,:)
plot(bs);
function y=fun(x)
y=sum(x.^2-10.*cos(2.*pi.*x)+10);
end
解读:
首先,设定预设值与初始化;
其次,对X进行变异和交叉得到Xnew,后对Xnew和X进行测试,选最小值对应的位置向量和该最小值;
接着,进行迭代,重复上述该步骤;
最后,得到最小函数值对应的最小值和对应的位置向量。
其本质:
X向量所有元素都在上下界之间,计算该X向量下的函数,将变异交叉后和原X向量进行计算,将选择更小的进行保留,最后在NP个种群中找最小的,进而完成,最后的向量及其对应的函数值。
缺点:
早熟、收敛慢、全局搜索能力欠佳等问题