www.pudn.com > xml3.rar > 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)