对上一篇博客的SaDE代码进行的改进

如果你没有看上一篇博客可以点击这里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('目标函数值');

运行结果