function DE(Gm,F)%标准差分进化算法程序
F=0.8;%F是变异因子
Gm=200; %最大迭代次数
Np=50; %种群规模
CR=0.5; %交叉概率常数
G=1;%初始化进化代数
D=10;%所求问题的维数
ge=zeros(1,Np);%各代的最优值
bestx=zeros(Np,D);%各代的最优解
xmin=0;xmax=pi;
function y=f(Z);
y=sum(sin(Z));
end
X0=(xmax-xmin)*rand(Np,D)+xmin;%产生初始种群
X=X0;
%%%%%%%%%%变异操作
V=zeros(Np,D);%变异矢量初始化
U=zeros(Np,D);%初始化
X1=zeros(Np,D);%初始化
value=zeros(1,Np);
while G<=Gm
for i=1:Np
%产生j,k,p三个不同的数
a=1;b=Np;
dx=randperm(b-a+1);
j=dx(1);k=dx(2);p=dx(3);
if j==i
j=dx(4);
elseif k==i
k=dx(4);
elseif p==i
p=dx(4);
end
%namd=exp(1-Gm/(Gm+1-G));%变异算子
%F=F0*2.^namd;
%bon=X(p,:)+F*(X(j,:)-X(k,:));
bon=X(p,:)+F*(X(j,:)-X(k,:));
if (bon>xmin)&(bon<xmax) %防止变异超出边界
V(i,:)=bon;
else V(i,:)=(xmax-xmin)*rand(1,D)+xmin;
end
end
%%%%%%%%%%%%交叉操作
for i=1:Np
for j=1:D
if (rand<=CR|j==rand(D)) %利用二项分布来交叉
U(i,j)=V(i,j);
else
U(i,j)=X(i,j);
end
end
end
%%%%%%%%%%%%%%%选择操作
for i=1:Np
if f(U(i,:))>f(X(i,:))
X1(i,:)=U(i,:);
else
X1(i,:)=X(i,:);
end
end
%找出最大值
for i=1:Np
value(i)=f(X1(i,:));
end
[fmax,nmax]=max(value);
ge(G)=fmax;
bestx(G,:)=X1(nmax,:);
G=G+1;
X=X1;
end
ii=linspace(1,Gm,Gm);
plot(ii,ge)
[gmax,n]=max(ge);
bestvalue=gmax
bestsolution=bestx(n,:)
end
评论1
最新资源