差分进化算法: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