差分进化算法例题(题目和解答以及Matlab代码)

题目:计算函数f(x)= ∑ i = 1 n x i 2 \sum_{i=1}^{n}x_i^2 i=1nxi2(-20≤ x i x_i xi≤20)的最小值,其中个体x的维数n=10。
解答:优化结束后,根据所得的图可知,优化后的结果为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。

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=rand(1,1,[1,NP]);
        while(r1==m)
            r1=randi(1,1,[1,NP]);
        end
        r2=randi(1,1,[1,NP]);
        while(r2==m)|(r2==r1)
            r2=randi(1,1,[1,NP]);
        end
        r3=randi(1,1,[1,NP]);
        while(r3==m)|(r3==r1)|(r3==r2)
            r3=randi(1,1,[1,NP]);
        end
        v(:,m)=x(:,r1)+F*(x(:,r2)-x(:,r3));
    end
    %交叉操作
    r=randi(1,1,[1,D]);
    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)<yz
        break
    end
end
[SortOb,Index]=sort(Ob);
x=x(:,Index);
X=x(:,1);   %最优变量
Y=min(Ob);  %最优值
%画图
figure
plot(trace);
xlabel('迭代次数');
ylabel('目标函数值');
title('DE 目标函数曲线');
%适应度函数
function result=func1(x);
summ=sum(x.^2);
result=summ;
end 

猜你喜欢

转载自blog.csdn.net/qq_36294338/article/details/108584698