ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

【优化算法】猫群优化算法(CSO)【含Matlab源码 1071期】

2021-06-28 14:33:41  阅读:193  来源: 互联网

标签:nVar 搜寻 模式 cat 算法 源码 nPop vel 优化


一、简介

猫群算法 ( Cat Swarm Optimization,缩写为CSO)是由 Shu - An Chu 等人在 2006 年首次提出来的一种基于猫的行为的全局优化算法具有收敛快,寻优能力强的特点。
1 算法原理
在猫群算法中,猫即待求优化问题的可行解。猫群算法将猫的行为分为两种模式,一种就是猫在懒散、环顾四周状态时的模式称之为搜寻模式;另一种是在跟踪动态目标时的状态称之为跟踪模式。猫群算法中,一部分猫执行搜寻模式,剩下的则执行跟踪模式,两种模式通过结合率 MR(Mixture Ratio)进行交互,MR 表示执行跟踪模式下的猫的数量在整个猫群中所占的比例,在程序中 MR应为一个较小的值。利用猫群算法解决优化问题,首先需要确定参与优化计算的个体数,即猫的数量。每只猫的属性(包括由M维组成的自身位置)、每一维的速度、对基准函数的适应值及表示猫是处于搜寻模式或者跟踪模式的标识值。当猫进行完搜寻模式和跟踪模式后,根据适应度函数计算它们的适应度并保留当前群体中最好的解。之后再根据结合率随机地将猫群分为搜寻部分和跟踪部分的猫,以此方法进行迭代计算直到达到预设的迭代次数。

1.1 数学描述
搜寻模式用来模拟猫的当前状态,分别为休息、四处查看、搜寻下一个移动位置。在搜寻模式中,定义了 4 个基本要素:记忆池(SMP)、变化域(SRD)、变化数(CDC)、自身位置判断(SPC)。SMP 定义了每一只猫的搜寻记忆大小,表示猫所搜寻到的位置点,猫将根据适应度大小从记忆池中选择一个最好的位置点。SRD 表示选择域的变异率,搜寻模式中,每一维的改变范围由变化域决定,根据经验一般取值为0.2。CDC 指每一只猫将要变异的维数的个数,其值是一个从 0 到总维数之间的随机值。SPC 是一个布尔值,表示猫是否将已经过的位置作为将要移动到的候选位置之一,其值不影响 SMP 的取值。

1.1.1 搜寻模式过程描述
在这里插入图片描述
1.1.2 跟踪模式过程描述
在这里插入图片描述
在这里插入图片描述
2 算法流程
算法流程图如下:
在这里插入图片描述

二、源代码

clc;
close all;
num=2;     
MaxIt=200;  % Maximum Number of Iterations
nPop=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 Function
c2_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<veln_cat(i,r2))
                                  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
                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 fw
val=0;
n=size(xn,2);
for i=1:n
    val=val+(xn(1)-xn(i)^2)^2+(xn(i)-1)^2;
end
z=val;

三、运行结果

在这里插入图片描述

四、备注

版本:2014a

标签:nVar,搜寻,模式,cat,算法,源码,nPop,vel,优化
来源: https://blog.csdn.net/TIQCmatlab/article/details/118302346

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有