www.gusucode.com > matlab编程PSO算法优化求解PID参数源码程序 > gusucode/code/stdpso1.m
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