www.gusucode.com > PSO粒子群算法简单应用源码程序 > PSO粒子群算法简单应用源码程序/code/pso.m

    function vmfit=pso(data,number)
wmax=0.9;
wmin=0;
itmax=number;
c1=2;
c2=2;
for iter=1:itmax
    W(iter)=wmax-((wmax-wmin)/itmax)*iter;
end;

a=-1;
b=2;
N=number;
D=2;
m=0.1;
n=3;
tcl=0.05;
f='data';
[x,y]=meshgrid(a:tcl:b,a:tcl:b);
vxp=x;
vyp=y;
vzp=eval(f);
x=[];
vmfit=[];

x=a+(b-a)*rand(N,D,1);
V=wmin+(wmax-wmin)*rand(N,D,1);


for i=1:N
    F(i,1,1)=x(i,1,1)*sin(4*pi*x(i,1,1))-x(i,2,1)*sin(4*pi*x(i,2,1)+pi+1);
end;
media=mean(F(:,1,1));
vmfit=[vmfit media];

[C,I]=max(abs(F(:,1,1)));
B(1,1,1)=C;


gbest(1,1,1)=x(I,1,1);
gbest(1,2,1)=x(I,1,1);

for p=1:N
    for r=1:D
        G(p,r,1)=gbest(1,r,1);
    end
end
Fbest(1,1,1)=G(1,1,1)*sin(4*pi.*G(1,1,1))-G(1,2,1)*sin(4*pi.*G(1,2,1)+pi+1);
for i=1:N
    pbest(i,:,1)=x(i,:,1);
    pbest;
end
Fb(1,1,1)=gbest(1,1,1)*sin(4*pi.*gbest(1,1,1))-gbest(1,2,1)*sin(4*pi.*gbest(1,2,1)+pi+1);

for j=2:itmax
    V(:,:,j)=W(j-1)*V(:,:,j-1)+c1*rand*(pbest(:,:,j-1)-x(:,:,j-1))+c2*rand*(G(:,:,j-1)-x(:,:,j-1));
    x(:,:,j)=x(:,:,j-1)+V(:,:,j);
    for xx=1:N
        for yy=1:D
            if x(xx,yy,j)<a
                x(xx,yy,j)=a;
            end;
            if x(xx,yy,j)>b
                x(xx,yy,j)=b;
            end;
        end;
    end;
    for i=1:N
        F(i,1,j)=x(i,1,j)*sin(4*pi.*x(i,1,j))-x(i,2,j)*sin(4*pi.*x(i,2,j)+pi+1);
    end;
    media=mean(F(:,1,j));
    vmfit=[vmfit media];
    [C,I]=max(abs(F(:,:,j)));
    B(1,1,j)=C;
    gbest(1,1,j)=x(I,1,j);
    gbest(1,2,j)=x(I,2,j);
    Fb(1,1,j)=gbest(1,1,j)*sin(4*pi.*gbest(1,1,j))-gbest(1,2,j)*sin(4*pi.*gbest(1,2,j)+pi+1);
    [C,I]=max(Fb(1,1,:));
    if C>Fb(1,1,j)
        gbest(1,1,j)=gbest(1,1,I);
        gbest(1,2,j)=gbest(1,2,I);
    end;
    
    for p=1:N
        for r=1:D
            G(p,r,j)=gbest(1,r,j);
        end;
    end;
    Fbest(1,1,j)=G(1,1,j)*sin(4*pi.*G(1,1,j))-G(1,2,j)*sin(4*pi.*G(1,2,j)+pi+1);
    for i=1:N
        [C,I]=max(F(i,1,:));
        if F(i,1,j)>=C
            pbest(i,:,j)=x(i,:,j);
        else
            pbest(i,:,j)=x(i,:,I);
        end;
    end;
end

gbest(1,:,itmax);
Fbest(1,1,itmax);