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)=func2(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 互相不同
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 (r2==m)|(r2==r1)|(r3==r2)
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 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)=func2(u(:,m));
end
for m=1:NP
if Ob1(m)<Ob(m)%临时种群与原种群“一对一比较”,选择产生新种群
x(:,m)=u(:,m);
end
end
for m=1:NP
Ob(m)=func2(x(:,m));
end
trace(gen+1)=min(Ob);
if min(Ob(m))<yz%使用阈值终止迭代
break
end
end
[Sort,Index]=sort(Ob);
x=x(:,Index);
X=x(:,1);
Y=min(Ob);
figure
plot(trace);
xlabel('迭代次数');
ylabel('目标函数值');
ttle('目标函数曲线');
差分进化算法(matlab)
最新推荐文章于 2024-04-23 17:09:38 发布