%function [gbest,gbestfit,bestfit]=ccpso2(x,popsize,dim,maxiter,fitness)
%popsize 粒子群大小,即粒子个数
%dim 粒子维度(未分群之前的总维度)
%k 粒子群的分群的个数
%s 每个分群的变量数,s*k=dim
%x 保存粒子群的各个粒子的当前位置
%y 保存粒子群的各个粒子的当前局部粒子最优
%gbest 保存全局最优粒子位置
%cc 状态参数,只能是整形数,c为0时,则说明粒子迭代后全局最优没有更新;否则粒子迭代后全局最优更新
%bestfit 保存每次迭代的最优解
%fitness 适应度函数
%t 程序运行时间
%gbest 全局最优解,gbestfit 全局最优解适应度值
%py 通过lbest ring topology手段得到的粒子局部最优
%
t=cputime;
popsize=100;
dim=150;
maxiter=10000;
%x=10.24*rand(popsize,dim)-5.12; %Rastrigrin
x=rand(popsize,dim);%Rosenbrock
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;
|