popsize=40; %微粒数
MAXITER=100; %执行次数
dimension=3; %维数
runno=10;
xmin1=0.316115;
xmin2=0.9;
xmin3=0.64057;
xmax1=12.328485;
xmax2=35.1;
xmax3=24.98223;
%x(i,j)的范围50-100
vmax1=(xmax1-xmin1)/2;
vmax2=(xmax2-xmin2)/2;
vmax3=(xmax3-xmin3)/2;
%M=(xmax-xmin)/2;
c1=2;
c2=2;
data2=zeros(runno,MAXITER);
sum2=0;
G=zeros(runno,dimension);
st=0;
for run=1:runno
x1=(xmax1-xmin1)*rand(popsize,1) + xmin1; %初始化x,20*30
x2=(xmax2-xmin2)*rand(popsize,1) + xmin2;
x3=(xmax3-xmin3)*rand(popsize,1) + xmin3;
v1=2*vmax1*rand(popsize,1)-vmax1; %初始化v,20*30
v2=2*vmax2*rand(popsize,1)-vmax2;
v3=2*vmax3*rand(popsize,1)-vmax3;
x=rand(popsize,dimension);
v=zeros(popsize,dimension);
v11=zeros(popsize,dimension);
x(:,1)=x1;
x(:,2)=x2;
x(:,3)=x3;
v(:,1)=v1;
v(:,2)=v2;
v(:,3)=v3;
pbest=x; %每个微粒的最优解,20*30
for i=1:popsize
f_x(i)=f1(x(i,:)); %用自定义的函数f1来初始化f_x(i)
f_pbest(i)=f_x(i); %并将f_x(i)的植暂时充当每个微粒的最优函数解f_pbest(i)
end
g=min(find(f_pbest==min(f_pbest(1:popsize)))); %找出20个微粒中f_pbest最小的那个,把该微粒的编号赋予g。
gbest=pbest(g,:); %将这个微粒的最优解当作全局最优解gbest
f_gbest=f_pbest(g); %这个微粒的函数解也当作全局最优函数解f_gbest
MINIUM=f_pbest(g);
for t=1:MAXITER %进入循环2000次
w=(0.9-0.4)*(MAXITER-t)/MAXITER+0.4; %用公式求出权重w
for i=1:popsize
v11(i,:)=w*v(i,:)+2*rand(1,dimension).*(pbest(i,:)-x(i,:))+2*rand(1,dimension).*(gbest-x(i,:)); %根据PSO公式求出速度进化值
v11(i,1)=sign(v(i,1)).*min(abs(v(i,1)),vmax1); %给速度加上上下限,
v11(i,2)=sign(v(i,2)).*min(abs(v(i,2)),vmax2);
v11(i,3)=sign(v(i,3)).*min(abs(v(i,3)),vmax3);
x(i,:)=x(i,:)+v11(i,:); %根据PSO公式求出该微粒的位置进化值。
%x(i,:)=sign(y).*min(abs(y),xmax);
if x(i,1)<=xmin1
x(i,1)=xmin1;
end
if x(i,1)>xmax1
x(i,1)=xmax1;
end
if x(i,2)<=xmin2
x(i,2)=xmin2;
end
if x(i,2)>xmax2
x(i,2)=xmax2;
end
if x(i,3)<=xmin3
x(i,3)=xmin3;
end
if x(i,3)>xmax3
x(i,3)=xmax3;
end
% z=x(i,:)-(xmax+xmin)/2;
% z=sign(z).*min(abs(z),M);
% x(i,:)=z+(xmax+xmin)/2;
f_x(i)=f1(x(i,:)); %用新求出的位置代入函数f1求出新的函数值f_x(i)
if f_x(i)<f_pbest(i) %假设这个新的函数值f_x(i)比原来该微粒自身的函数最优解要好,
pbest(i,:)=x(i,:); %就将这个新位置记录为该微粒的最好位置
v(i,:)=v11(i,:);
f_pbest(i)=f_x(i); %并且记录该微粒现在的函数最优值
end
if f_pbest(i)<f_gbest %假如这个微粒现在更新后的函数最优值比全局函数最优值还要好
gbest=pbest(i,:); %那就将这个微粒的位置记录为全局最优位置
f_gbest=f_pbest(i); %同时记录全局最优函数值
end
MINIUM=f_gbest;
end
data2(run,t)=MINIUM;
MINIUM;
end %2000次循环结束。
MINIUM;
G(run,:)=gbest; %返回2000次循环中找到的全局最优位置,1*30
%sum2=sum2+MINIUM;
%time=cputime-T;
%st=st+time;
end
G