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 %如果上一次迭代全局最优没有任何更新,则s值要更新
s=S(round(6*rand)+1);
k=dim/s;
end
cc=0;
for j=1:k %分组,对于第j组执行
p=(j-1)*s+1;
q=j*s;
for i=1:popsize
gbest1=gbest;
gbest1(p:q)=x(i,p:q); %将全局最优的粒子的p到q个元素置换为分组的第i个粒子的p到q部分
B=fitness(gbest1); %计算置换后的粒子的适应度B
gbest1(p:q)=y(i,p:q); %将全局最优粒子的第p到q个元素置换为分组的第i个粒子的历史最优的p到q部分
C=fitness(gbest1); %计算置换后的粒子适应度C
if B<C
y(i,p:q)=x(i,p:q); %更新个体最优
% gbest1(p:q)=gbest(i,p:q);
D=fitness(gbest);
if C<D %更新全局最优
gbest(p:q)=y(i,(p:q));
cc=cc+1; %如果最优有更新则改变cc
end
end
end
for i=1:popsize %将gbest1的p到q部分置换为第i个个体最优的p到q部分,记录第i个置换结果的适应度记为pyfit(i)
gbest1=gbest;
gbest1(p:q)=y(i,p:q);
pyfit(i)=fitness(gbest1);
end
for i=1:popsize
if i==1 %对于第一个粒子
B=pyfit(popsize); %将B定义为最后一个粒子的适应度
b=popsize;
D=pyfit(2); %将D定义为第二个粒子的适应度
d=2;
elseif i==popsize %对于最后一个粒子
B=pyfit(i-1); %将B定义为前一个粒子的适应度
b=i-1;
D=pyfit(1); %将D定义为第一个粒子的适应度
d=1;
else %对于其他粒子
B=pyfit(i-1); %B为前一个粒子适应度
b=i-1;
D=pyfit(i+1); %D为后一个粒子的适应度
d=i+1;
end
C=pyfit(i); %C为该粒子的适应度
c=i;
if B<C&&B<D %求本地最优粒子
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)); %柯西分布更新规则
else
x(i,p:q)=py(i,p:q)+normrnd(0,1)*abs(y(i,p:q)-py(i,p:q)); %高斯分布更新规则
end
end
end
gbestfit=fitness(gbest);
bestfit(u)=gbestfit;
end
bestfit=[gbestfit0,bestfit];
plot (bestfit,'-b');
title('D=150,Rosenbrock','fontsize',12);
xlabel('迭代次数','fontsize',12);ylabel('适应度','fontsize',12)
t=cputime-t;