CC BY 4.0 (除特别声明或转载文章外)
如果这篇博客帮助到你,可以请我喝一杯咖啡~
如果你没有看上一篇博客可以点击这里SaDE
上一篇的自适应是建立在种群的最优解是否出现,而通常的LP参数设置不会很大,这就导致我们迭代后期在自适应CRm时经常出现数组A为空的情况。
依此改进为变异种群中的每一个个体相较于上一代的独对应位置的个体(父本)发生进化就将CR和策略的序号存入数组 以下是改进后的代码:
close all;
clear all;
clc;
%--------------------初始化各参数值------------------------------------------------------
cecnum=1;
NP=100;
CRm=0.5;
G=500;
LP=100;
D=30;
a=-100;
b=100;
Aa=1;
A=[];
ikun1=0.25;
ikun2=0.25;
ikun3=0.25;
ikun4=0.25;
c=0;
t=0;
r=0;
l=0;
ck=0.000000001;
x=rand(NP,D)*(b-a)+a; %随机生成初始种群
v=zeros(NP,D);
u=zeros(NP,D);
minx=99999;
best=0;
for i=1:NP %求各个个体的适应度并取出适应度最好的个体的位置
fit(i)=cec17(x(i,:),cecnum);
if fit(i)<minx
minx=fit(i);
best=i;
end
end
trace(1)=minx;
for g=1:G %开始迭代
best1=best;
for i=1:NP
F(i)=normrnd(0,0.33333)*0.1+0.4; %生成符合正态分布的F值
end
for i=1:NP
CR(i)=normrnd(CRm,0.1); %生成符合正态分布的CR值
end
%--------------------变异操作----------------------------------------------------------------
for m=1:NP
num=randsrc(1,1,[1 2 3 4;ikun1 ikun2 ikun3 ikun4]); %对选取的策略按照相应概率进行选取
num1=randperm(NP,1);
while num1==m
num1=randperm(NP,1);
end
num2=randperm(NP,1);
while (num2==m)||(num2==num1)
num2=randperm(NP,1);
end
num3=randperm(NP,1);
while (num3==m)||(num3==num1)||(num3==num2)
num3=randperm(NP,1);
end
num4=randperm(NP,1);
while (num4==m)||(num4==num1)||(num4==num2)||(num4==num3)
num4=randperm(NP,1);
end
num5=randperm(NP,1);
while (num5==m)||(num5==num1)||(num5==num2)||(num5==num3)||(num5==num4)
num5=randperm(NP,1);
end
if num==1
v(m,:)=x(num1,:)+F(m)*(x(num2,:)-x(num3,:));
end
if num==2
v(m,:)=x(best,:)+F(m)*(x(num1,:)-x(num2,:))+F(m)*(x(num3,:)-x(num4,:));
end
if num==3
v(m,:)=x(num1,:)+F(m)*(x(num2,:)-x(num3,:))+F(m)*(x(num4,:)-x(num5,:));
end
if num==4
v(m,:)=x(m,:)+F(m)*(x(best,:)-x(m,:))+F(m)*(x(num1,:)-x(num2,:))+F(m)*(x(num3,:)-x(num4,:));
end
%--------------------交叉操作--------------------------------------------------------
for n=1:D
cr=rand;
if(cr<=CR(m))
u(m,n)=v(m,n);
else
u(m,n)=x(m,n);
end
end
%--------------------修补染色体--------------------------------------------------------
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
%--------------------重新求适应度,优胜劣汰----------------------
fit1(m)=cec17(u(m,:),cecnum);
if fit1(m)<fit(m)
fit(m)=fit1(m);
x(m,:)=u(m,:);
A(1,Aa)=CR(m);
Aa=Aa+1;
if num==1
c=c+1;
end
if num==2
t=t+1;
end
if num==3
r=r+1;
end
if num==4
l=l+1;
end
end
if fit1(m)<minx
minx=fit1(m);
best1=m;
end
end
best=best1;
trace(g+1)=minx;
%--------------------对CR进行自适应取值----------------------
if mod(g,LP)==0
if ~isempty (A)
CRm=mean(A(:)); %求所有发生进化的个体所选用的CR的平均值
clear A;
A=[];
Aa=1;
end
A=[];
Aa=1;
%--------------------根据所选策略与其成功概率决定以后该策略的选取概率----------------------
sk1=c/(LP*NP)+ck;
sk2=t/(LP*NP)+ck;
sk3=r/(LP*NP)+ck;
sk4=l/(LP*NP)+ck;
ikun1=sk1/(sk1+sk2+sk3+sk4);
ikun2=sk2/(sk1+sk2+sk3+sk4);
ikun3=sk3/(sk1+sk2+sk3+sk4);
ikun4=sk4/(sk1+sk2+sk3+sk4);
c=0;
t=0;
r=0;
l=0;
end
end
%--------------------结束迭代,绘制迭代次数与适应度的关系图----------------------
x(1,:);
figure(1);
plot(trace);
title(['差分进化算法(DE)','最小值','num2str(tt)']);
xlabel('迭代次数');
ylabel('目标函数值');