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