ICode9

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

【优化求解】猫群算法求函数最优值

2021-06-07 22:31:37  阅读:169  来源: 互联网

标签:求函数 end 猫群 pop cat cat1 算法 nPop bitt


 猫群算法( 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<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                % 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<srd)             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

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

 

标签:求函数,end,猫群,pop,cat,cat1,算法,nPop,bitt
来源: https://blog.csdn.net/m0_57702748/article/details/117672625

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

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

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

ICode9版权所有