前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >麻雀算法

麻雀算法

作者头像
六四零
发布2021-03-09 16:06:56
2.3K1
发布2021-03-09 16:06:56
举报
文章被收录于专栏:小白VREP

优化问题是科学研究和工程实践领域中的热门问题。智能优化算法大多是受到人类智能、生物群体社会性或自然现象规律的启发,在解空间内进行全局优化。麻雀算法于2020年由薛建凯[1]首次提出,是基于麻雀种群的觅食和反捕食行为的一种新型智能优化算法。

麻雀搜索算法的具体步骤描述以及公式介绍:

构建麻雀种群:

其中,d表示待优化问题的维数,n表示麻雀种群的数量。所有麻雀种群的适应度函数可以表示成如下形式:

其中,Fx表示适应度函数值。

麻雀算法中的麻雀具有两大类分别是发现者和加入者,发现者负责为整个种群寻找食物并为加入者提供觅食的方向,因此,发现者的觅食搜索范围要比加入者的觅食搜索范围大。在每次迭代过程中,发现者按照公式(3)进行迭代。

其中,t表示当前迭代次数,Xij表示第i个麻雀种群在第j维中的位置信息,阿尔法表示的0到1的随机数,itermax表示最大迭代次数,Q表示一个服从正态分布的随机数,L是一个1*d并且元素全为1的矩阵,R2属于0-1表示麻雀种群位置的预警值,ST属于0.5-1表示麻雀种群位置的安全值。

当R2<ST时表示 预警值小于安全值,此时觅食环境中没有捕食者,发现者可以进行广泛搜索操作;当R2>ST时意味着种群中有部分麻雀已经发现捕食者,并向种群中的其他麻雀发出预警,所有麻雀都需要飞往安全区域进行觅食。

在觅食过程中,部分加入者会时刻监视发现者,当发现者发现更好的食物,加入者会与其进行争夺,若成功,会立即获得该发现者的食物,否则加入者按照公式(4)进行位置更新。

其中,XP表示目前发现者所发现的最优位置,Xworst表示当前全局最差的位置,A表示其元素随机赋值为1或-1的1*d的矩阵并且满足一下关系:

L仍然是一个1*d并且元素全为1的矩阵。当i>n/2时这表明第i个加入者没有获得食物,处于饥饿状态,此时需要飞往其他地方进行觅食,以获得更多的能量。

在麻雀种群中,意识到危险的麻雀数量占总数的10%到20%,这些麻雀的位置是随机产生的,按照公式(5)对意识到危险的麻雀的位置进行不断更新。

其中,Xbest表示当前全局最优位置,是服从标准正态分布的随机数用来作为步长控制参数,贝塔是一个属于-1到1的随机数,fi表示当前麻雀个体的适应度值,fg表示全局最佳适应度值,fw表示全局最差适应度值,像左耳朵一样的这个是读"一不洗诺"吗?"一不洗诺"表示一个避免分母为0的常数。当fi>fg时表示此时麻雀处于种群边缘,极易受到捕食者的攻击,当fi=fg时表示处于种群中间的麻雀也受到了危险,此时需要靠近其他麻雀以减少被捕食的风险。

麻雀搜索算法具有较好的全局探索和局部开发的能力,将种群中的所有因素考虑在内,能够使种群中的麻雀向全局最优值移动,迅速的在最优值附近收敛。在优化算法一开始收敛速度就很明显,文献1指出该算法具有稳定性好、全局搜索能力强、参数少的特点,为解决复问题优化提供了一种全新的方法。

代码部分:

SSA代码主体部分

代码语言:javascript
复制
function [fMin , bestX,Convergence_curve ] = SSA(pop, M,c,d,dim,fobj  )
%其中:fobj是函数
 %捕食者站整个种群规模的百分比    The population size of producers accounts for "P_percent" percent of the total population size       
P_percent = 0.2;         

%捕食者的人口规模   百分比*中群内个体数量
pNum = round( pop *  P_percent );    % The population size of the producers   

%下限/界限/向量
lb= c.*ones( 1,dim );    % Lower limit/bounds/     a vector
%上限/界限/向量
ub= d.*ones( 1,dim );    % Upper limit/bounds/     a vector

%Initialization 初始化
for i = 1 : pop%对各异进行遍历
    %初始化个体以及适应度函数
    x( i, : ) = lb + (ub - lb) .* rand( 1, dim );  
    fit( i ) = fobj( x( i, : ) ) ;                       
end

pFit = fit; 

%与pfit对应的个人最佳值
pX = x;                            % The individual's best position corresponding to the pFit
%fMin表示全局最优适应度值
[ fMin, bestI ] = min( fit );      % fMin denotes the global optimum fitness value
%bestX 表示对应于fMin全局最优位置的
bestX = x( bestI, : );             % bestX denotes the global optimum position corresponding to fMin
 

 % Start updating the solutions.
 %开始更新解决方案
for t = 1 : M    %  M为最大迭代次数
  
  [ ans, sortIndex ] = sort( pFit );% Sort.排序
     
  [fmax,B]=max( pFit );
   worse= x(B,:);  
         
   r2=rand(1);
   
if(r2<0.8)  %st=0.8
    for i = 1 : pNum   %对于捕食者                     % Equation (3)
         r1=rand(1);
        x( sortIndex( i ), : ) = pX( sortIndex( i ), : )*exp(-(i)/(r1*M));
        x( sortIndex( i ), : ) = Bounds( x( sortIndex( i ), : ), lb, ub );
        fit( sortIndex( i ) ) = fobj( x( sortIndex( i ), : ) );   
    end
  else
  for i = 1 : pNum   
          
  x( sortIndex( i ), : ) = pX( sortIndex( i ), : )+randn(1)*ones(1,dim);
  x( sortIndex( i ), : ) = Bounds( x( sortIndex( i ), : ), lb, ub );
  fit( sortIndex( i ) ) = fobj( x( sortIndex( i ), : ) );
       
  end
      
end
 
 
 [ fMMin, bestII ] = min( fit );      
  bestXX = x( bestII, : );            


   for i = ( pNum + 1 ) : pop          % Equation (4)  对于加入者
     
         A=floor(rand(1,dim)*2)*2-1;
         
          if( i>(pop/2))
           x( sortIndex(i ), : )=randn(1)*exp((worse-pX( sortIndex( i ), : ))/(i)^2);
          else
        x( sortIndex( i ), : )=bestXX+(abs(( pX( sortIndex( i ), : )-bestXX)))*(A'*(A*A')^(-1))*ones(1,dim);  

         end  
        x( sortIndex( i ), : ) = Bounds( x( sortIndex( i ), : ), lb, ub );
        fit( sortIndex( i ) ) = fobj( x( sortIndex( i ), : ) );
        
   end
   
  c=randperm(numel(sortIndex));
   b=sortIndex(c(1:20));
    for j =  1  : length(b)      % Equation (5)  对于遇到危险的麻雀 其位置随机

    if( pFit( sortIndex( b(j) ) )>(fMin) )

        x( sortIndex( b(j) ), : )=bestX+(randn(1,dim)).*(abs(( pX( sortIndex( b(j) ), : ) -bestX)));

        else

        x( sortIndex( b(j) ), : ) =pX( sortIndex( b(j) ), : )+(2*rand(1)-1)*(abs(pX( sortIndex( b(j) ), : )-worse))/ ( pFit( sortIndex( b(j) ) )-fmax+1e-50);

          end
        x( sortIndex(b(j) ), : ) = Bounds( x( sortIndex(b(j) ), : ), lb, ub );
       
       fit( sortIndex( b(j) ) ) = fobj( x( sortIndex( b(j) ), : ) );
 end
    for i = 1 : pop 
        if ( fit( i ) < pFit( i ) )
            pFit( i ) = fit( i );
            pX( i, : ) = x( i, : );
        end
        
        if( pFit( i ) < fMin )
           fMin= pFit( i );
            bestX = pX( i, : );
         
            
        end
    end
  
    Convergence_curve(t)=fMin;
  
end

% Application of simple limits/bounds
%应用于一个简单的给定条件
function s = Bounds( s, Lb, Ub)
  % Apply the lower bound vector  应用于下限向量
  temp = s;
  I = temp < Lb;
  temp(I) = Lb(I);
  
  % Apply the upper bound vector   应用于上限向量
  J = temp > Ub;
  temp(J) = Ub(J);
  % Update this new move   更新新举动
  s = temp;

%---------------------------------------------------------------------------------------------------------------------------

调用不同的主体函数:

代码语言:javascript
复制
%%调用不同的函数主体
function [lb,ub,dim,fobj] = Get_Functions_details(F)

switch F
    case 'F1'              
        fobj = @F1;%函数名
          lb=-100;%下限
        ub=100;%上限
        dim=5; %维度
       
        
    case 'F2'            
        fobj = @F2;
        lb=-10;
        ub=10;
        dim=5;

    case 'F3'
        fobj = @F3;
        lb=-100;
        ub=100;
        dim=5;
        
    case 'F4'
        fobj = @F4;
        lb=-100;
        ub=100;
        dim=5;
        
    case 'F5'
        fobj = @F5;
        lb=-30;
        ub=30;
        dim=5;
        
    case 'F6'
        fobj = @F6;
        lb=-100;
        ub=100;
        dim=5;
end
end

% F1调用的函数

function o = F1(x)
o=sum(x.^2);
end

% F2

function o = F2(x)
o=sum(abs(x))+prod(abs(x));
end


% F3

function o = F3(x)
dim=size(x,2);
o=0;
for i=1:dim
    o=o+sum(x(1:i))^2;
end
end

% F4

function o = F4(x)
o=max(abs(x));
end

% F5

function o = F5(x)
dim=size(x,2);
o=sum(100*(x(2:dim)-(x(1:dim-1).^2)).^2+(x(1:dim-1)-1).^2);

end

% F6

function o = F6(x)
o=sum(abs((x+.5)).^2);
end

主函数:

代码语言:javascript
复制
%%
clear all 
clc
%%
SearchAgents_no=100; % Number of search agents

Function_name='F2'; % Name of the test function that can be from F1 to F23 (Table 1,2,3 in the paper)

Max_iteration=1000; % Maximum numbef of iterations自迭代次数

% Load details of the selected benchmark function  加载函数的详细信息,分别对应两个函数
[lb,ub,dim,fobj]=Get_Functions_details(Function_name);

[fMin,bestX,SSA_curve]=SSA(SearchAgents_no,Max_iteration,lb,ub,dim,fobj);  %种群数量100,最大迭代次数1000,上限、下限、最优值

%%
%Draw objective space  画出坐标系
semilogy(SSA_curve,'Color','r')
  
axis ([0 1000 0 1 ])
title('Objective space')
xlabel('Iteration');
ylabel('Best score obtained so far');
%axis tight
grid on
box on
legend('SSA')
display(['The best solution obtained by SSA is : ', num2str(bestX)]);
display(['The best optimal value of the objective funciton found by SSA is : ', num2str(fMin)]);

大家可以根据自己的实际应用在此代码的基础上进行改进。

注:参考文献导不出来,将文献题目与作者列出

[1]一种新型的群智能优化技术的研究与应用:麻雀搜索算法,薛建凯

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-02-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小白VREP 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档