2021-07-20

差分进化算法:matlab ,单目标多参数,

%% 差分进化算法
clc;
close all;
clear all;
NP=50;
D=2;
G=200;
F0=0.4;
CR=0.1;
Xs=100;
Xx=-100;
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)=func_cha(x(:,m));
end
trace(1)=max(Ob);
%% *-*-*-*-*-*-*-*-*-*-*-*-*-差分进化循环*-*-*-*-*-*-*-*-*-*-*-*-*-
for gen=1:G
    %% *-*-*-*-*-*-*-*-*-*-*-*-*-自适应遗传算子*-*-*-*-*-*-*-*-*-*-*-*-*-
    lamda=exp(1-G/(G+1-gen));
    F=F0*2^(lamda);
    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==r2)||(r3==r1)
            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 i=1:D
        for j=1:NP
            if((u(i,j)<Xx)|| u(i,j)>Xs)
                u(i,j)=rand*(Xs-Xx)+Xx;
            end
        end
    end
    %% *-*-*-*-*-*-*-*-*-*-*-*-*-选择操作*-*-*-*-*-*-*-*-*-*-*-*-*-
    for m=1:NP
        Ob1(m)=func_cha(u(:,m));
    end
    for m=1:NP
        if Ob1(m)>Ob(m)
            x(:,m)=u(:,m);
        end
    end
    for m=1:NP
        Ob(m)=func_cha(x(:,m));
    end
    trace(gen+1)=max(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("目标曲线")
function [result] = func_cha(x)
result=-((x(1)^2+x(2)+1)^2+(x(1)+x(2)^2-7)^2)/200+10;
end
上一篇:dbstart和dbshut启动、关闭数据库报错ORACLE_HOME_LISTNER is not SET解决办法


下一篇:vue数据响应式原理 - 数组的响应式