猫群算法( Cat Swarm Optimization,缩写为CSO) 是由Shu - An Chu 等人在2006 年首次提出来的一种基于猫的行为的全局优化算法。根据 生物学分类,猫科动物大约有 32 种,例如: 狮子、老虎 、豹子 、猫等。尽管生存环境不同 ,但是猫科动物的很多生活习性非常相似。猫的警觉性非常高,即使在休息的时候也处于一种高度的警惕状 态,时刻保持对周围环境的警戒搜寻; 它们对于活动的目标具有强烈的好奇心,一旦发现目标便进行跟踪,并且能够迅速地捕获到猎物。猫群算法正是关注了猫的搜寻和跟踪两种行为。猫群算法中,猫即待求优化问题的可行解。猫群算法将猫的行为分为两种模式,一种就是猫在懒散、环顾四周状态时的模式称之为搜寻模式; 另一种是在跟踪动态目标时的状态称之为跟踪模式。猫群算法中,一部分猫执行搜寻模式,剩下的则执行跟踪模式,两种模式通过结合率 MR( Mix- ture Ratio) 进行交互,MR 表示执行跟踪模式下的 猫的数量在整个猫群中所占的比例,在程序中 MR 应为一个较小的值。利用猫群算法解决优化问题,首先需要确定参与优化计算的个体数,即猫的数量。每只猫的属性( 包括由 M 维组成的自身位 置) 、每一维的速度、对基准函数的适应值及表示猫是处于搜寻模式或者跟踪模式的标识值。当猫进行完搜寻模式和跟踪模式后,根据适应度函数计算它们的适应度并保留当前群体中最好的解。之后再根据结合率随机地将猫群分为搜寻部分和跟踪部分的猫,以此方法进行迭代计算直到达到预设的迭代次数。
clc;close all;num=2; MaxIt=200; % Maximum Number of IterationsnPop=50; %% Algorithm Parameters BINARY CAT 2013 tb=10;bitt=20;nVar=bitt*tb; BestCost1_cat=zeros(num,MaxIt); CostFunction=@(x,tb,bitt) cost_function(x,tb,bitt); % Cost Functionc2_cat=1;for ittt=1:num for ta=1:1 % Number of Decision Variables alpha=0.3; VarSize=[1 nVar]; % Decision Variables Matrix Size %% PSO Parameters SMP=3;%0.25*nPop; SRD=0.2; CDC=0.2; nb=round(nVar*CDC); MR=0.3; num_seek=round(MR*nPop); num_track=nPop-num_seek; cat=randperm(nPop); w_cat=0.5; vmax_cat=4; %******************************** %% Initialization % Define Empty Structure to Hold Particle Data empty_cat.Position=[]; empty_cat.flag=[]; empty_cat.Velocity=[]; empty_cat.Cost=[]; pop=repmat(empty_cat,nPop,1); vel_cat=rand(nPop,nVar)-0.5; one_vel_cat=rand(nPop,nVar)-0.5; zero_vel_cat=rand(nPop,nVar)-0.5; % Initialize Global Best GlobalBest.Cost=inf; for i=1:nPop % Initialize Velocity pop(i).Position = round(rand(1,nVar)); pop(i).Velocity = rand(1,nVar); % Evaluate Solution pop(i).Cost=CostFunction(pop(i).Position,tb,bitt); y=find(cat==i); if(y<=num_seek) pop(i).flag=1; else pop(i).flag=0; end % Update Global Best if pop(i).Cost<=GlobalBest.Cost GlobalBest=pop(i); end end % Define Array to Hold Best Cost Values BestCost=zeros(MaxIt,1); c1=1; %% PSO Main Loop for it=1:MaxIt oneadd_cat=zeros(nPop,nVar); zeroadd_cat=zeros(nPop,nVar); dd3_cat=c2_cat*rand; %****************************************************** for t_i=1:nPop for g_i=1:nVar if(GlobalBest.Position(g_i)==0) oneadd_cat(t_i,g_i)=oneadd_cat(t_i,g_i)-dd3_cat; zeroadd_cat(t_i,g_i)=zeroadd_cat(t_i,g_i)+dd3_cat; else oneadd_cat(t_i,g_i)=oneadd_cat(t_i,g_i)+dd3_cat; zeroadd_cat(t_i,g_i)=zeroadd_cat(t_i,g_i)-dd3_cat; end end end one_vel_cat=w_cat*one_vel_cat+oneadd_cat; zero_vel_cat=w_cat*zero_vel_cat+zeroadd_cat; for t_i=1:nPop for g_i=1:nVar if(abs(vel_cat(t_i,g_i))>vmax_cat) one_vel_cat(t_i,g_i)=vmax_cat*sign(one_vel_cat(t_i,g_i)); zero_vel_cat(t_i,g_i)=vmax_cat*sign(zero_vel_cat(t_i,g_i)); end end end for t_i=1:nPop for g_i=1:nVar if(pop(t_i).Position(g_i)==1) vel_cat(t_i,g_i)=zero_vel_cat(t_i,g_i); else vel_cat(t_i,g_i)=one_vel_cat(t_i,g_i); end end end veln_cat=logsig(vel_cat); %****************************************************** for i=1:nPop if(pop(i).flag==0) for r2=1:nVar if(rand pop(i).Position(r2)=GlobalBest.Position(r2); else pop(i).Position(r2)=pop(i).Position(r2); end end pop(i).Cost = CostFunction(pop(i).Position,tb,bitt); else copy_cat=repmat(pop(i).Position,SMP,1); pop(i).Position=mutate(copy_cat,nVar,nb,SRD,tb,bitt); end try pop(i).Cost = CostFunction(pop(i).Position,tb,bitt); catch tt disp('ll'); end % Update Global Best if pop(i).Cost<=GlobalBest.Cost GlobalBest=pop(i); end end % Store Best Cost Ever Found BestCost(it)=GlobalBest.Cost; % Show Iteration Information disp(['Iteration ' num2str(it) ': Best Cost cat= ' num2str(BestCost(it))]); num_seek=round(MR*nPop); num_track=nPop-num_seek; cat=randperm(nPop); for ii=1:nPop y=find(cat==ii); if(y<=num_seek) pop(ii).flag=1; else pop(ii).flag=0; end end end end % BINARY CAT 2013 BestCost1_cat(ittt,:)=BestCost';end BestCost_all_cat1=mean(BestCost1_cat); BestCost1_cat=BestCost1_cat; %****************************************** std1_cat1=std(BestCost1_cat); std_cat1=std1_cat1(MaxIt); %****************************************** mean1_cat1=mean(BestCost1_cat); mean_cat1=mean1_cat1(MaxIt); %****************************************** best1_cat1=max(BestCost1_cat); best_cat1=best1_cat1(MaxIt); %****************************************** bad1_cat1=min(BestCost1_cat); bad_cat1=bad1_cat1(MaxIt); daa=[mean_cat1;std_cat1;bad_cat1;best_cat1] figure; semilogy(BestCost_all_cat1,'r','LineWidth',2); xlabel('Iteration'); ylabel('Cost'); legend('binary cat','Location','NW');
function z=cost_function(x,tb,bitt)up=50;low=-50;upb=mybin2dec(ones(1,bitt));lowb=mybin2dec(zeros(1,bitt)); xn=[]; for j=1:tb x1=x(1+(j-1)*bitt:j*bitt); x1=mybin2dec(x1)/(upb-lowb)*(up-low)+low; xn=[xn x1]; end % function for test fwval=0;n=size(xn,2);for i=1:n val=val+(xn(1)-xn(i)^2)^2+(xn(i)-1)^2;endz=val;
function y=mybin2dec(x)if x==0 y=0;else l=length(x); y=0; for i=0:l-1 y=y+x(i+1)*2^(i); endend
function j=RouletteWheelSelection(P) r=rand; C=cumsum(P); j=find(r<=C,1,'first');end
function z=mutate(x,nvar,nb,srd,tb,bitt) CostFunction=@(x1,tb,bitt) cost_function(x1,tb,bitt); costv=zeros(1,size(x,1)); P=costv; costv(1)=CostFunction(x(1,:),tb,bitt); for i=2:size(x,1) j=randsample(nvar,nb)'; A=zeros(nvar); A(j)=1; r=find(A==1);% pos_neg=rand(1,numel(r));% for t=1:numel(r)% if(pos_neg(t)<=0.5)% pos_neg(t)= 1;% else% pos_neg(t)=-1;% end% end x(i,:)=x(1,:); for t=1:numel(r) if(rand x(i,r(t))=1-x(i,r(t)); end end costv(i)=CostFunction(x(i,:),tb,bitt); end if(max(costv) == min(costv)) P=ones(1,size(x,1)); else P=abs(costv-max(costv))/(max(costv)-min(costv)); end P=P./sum(P);% [~,uu]=max(P);% x(1,:)% costv(1) r1=RouletteWheelSelection(P); z=x(r1,:);% z=[x(r1,:) costv(r1)] ;end