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;