www.gusucode.com > matlab编程DPSO离散二进制粒子群算法编程以及实现源码程序 > code3/matlab编程DPSO离散二进制粒子群算法编程以及实现源码程序/code/swarmpso.m

    % 粒子群算法解决二进制问题
% 使用平台:Matlab7.0
% 作者:胡健,哈尔滨工业大学大学

clear all
close all
clc
tic

%----------------
%初始化粒子群参数
c1=2; %学习因子
c2=2; %学习因子
%num=13; %粒子长度
num=16; %粒子长度
group=200; %粒子群数
Dmax=1000; %最大循环次数
X=zeros(group,num);
V=zeros(group,num); %初始化粒子群
globe=zeros(1,num); %gbest
globe1=zeros(1,num);
P_p=X;%pbest

%-----------------------------------
%评价每个粒子适应值,寻找出 P_globle
for k=1:group
    xx=X(k,:);
    fz(k)=swarmeval(xx);
end
[P_g,I]=min(fz);
globe=X(I,:);

%-------------
%更新粒子位置
for k=1:Dmax
    W=1;
    for index1=1:group
         r1=rand(1);r2=rand(1);
        for index2=1:num
           r3=rand(1);
            V(index1,index2)=W*V(index1,index2)+c1*r1*(P_p(index1,index2)-X(index1,index2))+c2*r2*(globe(index2)-X(index1,index2));
            if( V(index1,index2)>4)
                V(index1,index2)=0.99;
                if(r3<(1/(1+exp(-V(index1,index2)))))
                     X(index1,index2)=1;
                elseif(r3>(1/(1+exp(-V(index1,index2)))))
                     X(index1,index2)=0;
                end
            end
            if( V(index1,index2)<-4)
                V(index1,index2)=0;
                if(r3<(1/(1+exp(-V(index1,index2)))))
                     X(index1,index2)=1;
                elseif(r3>(1/(1+exp(-V(index1,index2)))))
                     X(index1,index2)=0;
                end
             end
             
             if((V(index1,index2)<4)&(V(index1,index2)>-4)&r3<(1-1/(1+exp(-V(index1,index2)))))  %离散问题,把粒子各维0、1化
                X(index1,index2)=1;
             end
             if((V(index1,index2)<4)&(V(index1,index2)>-4)&r3>(1-1/(1+exp(-V(index1,index2)))))
                X(index1,index2)=0;
            end
        end
    end


%-------------------------------------
%评价每个粒子适应值,寻找出每个粒子的最优
  for m=1:group
      xx=X(m,:);
      fz1(m)=swarmeval(xx);
      if fz1(m)<fz(m)
          P_p(m,:)=X(m,:);
          fz(m)=fz1(m);
      end
      %if fz(m)<P_g
         % P_g=fz(m);
     % end
  end


%-------------------------
%寻找出粒子粒子中的最优粒子
 [P_g,I]=min(fz);
  globe1=X(I,:);
  if(swarmeval(globe1)<swarmeval(globe))
     globe=globe1;
  end
end

%disp(fz);
disp(globe);
disp(swarmeval(globe));
%f=[ 0 0 1 0 0 0 0 1 0 0 0 0 0];
%disp(swarmeval(f));
%plotmatrix(globe);
toc
t=toc;