y=x;
bestfit=zeros(1,maxiter);
gbestfit=inf;
for i=1:popsize
B=fitness(x(i,:));
if B<gbestfit
gbestfit=B;
gbest=x(i,:);
end
end
gbestfit0=gbestfit;
% gbest1;
%S=[1,2,6,5,10,20,25,50]; %
S=[2,3,5,6,10,15,30];
cc=0;
pyfit=zeros(1,popsize);
py=zeros(popsize,dim);
for u=1:maxiter
if cc==0 %如果上一次迭代全局最優(yōu)沒(méi)有任何更新,則s值要更新
s=S(round(6*rand)+1);
k=dim/s;
end
cc=0;
for j=1:k %分組,對(duì)于第j組執(zhí)行
p=(j-1)*s+1;
q=j*s;
for i=1:popsize
gbest1=gbest;
gbest1(p:q)=x(i,p:q); %將全局最優(yōu)的粒子的p到q個(gè)元素置換為分組的第i個(gè)粒子的p到q部分
B=fitness(gbest1); %計(jì)算置換后的粒子的適應(yīng)度B
gbest1(p:q)=y(i,p:q); %將全局最優(yōu)粒子的第p到q個(gè)元素置換為分組的第i個(gè)粒子的歷史最優(yōu)的p到q部分
C=fitness(gbest1); %計(jì)算置換后的粒子適應(yīng)度C
if B<C
y(i,p:q)=x(i,p:q); %更新個(gè)體最優(yōu)
% gbest1(p:q)=gbest(i,p:q);
D=fitness(gbest);
if C<D %更新全局最優(yōu)
gbest(p:q)=y(i,(p:q));
cc=cc+1; %如果最優(yōu)有更新則改變cc
end
end
end
for i=1:popsize %將gbest1的p到q部分置換為第i個(gè)個(gè)體最優(yōu)的p到q部分,記錄第i個(gè)置換結(jié)果的適應(yīng)度記為pyfit(i)
gbest1=gbest;
gbest1(p:q)=y(i,p:q);
pyfit(i)=fitness(gbest1);
end
for i=1:popsize
if i==1 %對(duì)于第一個(gè)粒子
B=pyfit(popsize); %將B定義為最后一個(gè)粒子的適應(yīng)度
b=popsize;
D=pyfit(2); %將D定義為第二個(gè)粒子的適應(yīng)度
d=2;
elseif i==popsize %對(duì)于最后一個(gè)粒子
B=pyfit(i-1); %將B定義為前一個(gè)粒子的適應(yīng)度
b=i-1;
D=pyfit(1); %將D定義為第一個(gè)粒子的適應(yīng)度
d=1;
else %對(duì)于其他粒子
B=pyfit(i-1); %B為前一個(gè)粒子適應(yīng)度
b=i-1;
D=pyfit(i+1); %D為后一個(gè)粒子的適應(yīng)度
d=i+1;
end
C=pyfit(i); %C為該粒子的適應(yīng)度
c=i;
if B<C&&B<D %求本地最優(yōu)粒子
py(i,p:q)=y(b,p:q);
elseif C<B&&C<D
py(i,p:q)=y(c,p:q);
else
py(i,p:q)=y(d,p:q);
end
end
end
for j=1:k %生成新粒子群
p=(j-1)*s+1;
q=j*s;
for i=1:popsize
if rand<=0.5
x(i,p:q)=y(i,p:q)+(tan(pi*(rand-0.5)))*abs(y(i,p:q)-py(i,p:q)); %柯西分布更新規(guī)則
else
x(i,p:q)=py(i,p:q)+normrnd(0,1)*abs(y(i,p:q)-py(i,p:q)); %高斯分布更新規(guī)則
end
end
end
gbestfit=fitness(gbest);
bestfit(u)=gbestfit;
end
bestfit=[gbestfit0,bestfit];
plot (bestfit,'-b');
title('D=150,Rosenbrock','fontsize',12);
xlabel('迭代次數(shù)','fontsize',12);ylabel('適應(yīng)度','fontsize',12)
t=cputime-t;