%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;
|