【优化算法】细菌觅食优化算法(BFOA)【含Matlab源码 1246期】

690 阅读9分钟

一、细菌觅食优化算法简介

[摘 要]细菌觅食优化算法(Bacterial foraging optimization algorithm[BFOA])已经被分布式优化和控制的同行们当作一种全局性的优化算法接受。BFOA是由大肠杆菌的群体觅食行为所启发而总结出来 的。BFOA已经吸引了足够多的研究者的注意,由于它出现在解决真实世界中一些应用领域上优化问题的高效性。E.coli 的群体策略的生物基础是用特别的方式和简单的优化算法来进行模仿。着一张以传统的通俗易懂的BFOA算法大纲开始。然后分析“根据这个简单的数学模型模拟 BFOA的趋向性步骤”的动态。从这个分析过程中找出线索,在运行过程中根据当前的细菌适应情况,调整趋向性步骤的参数大小,最终得出BFOA的适应性变 量。之后在BFOA中细菌复制操作中的动态数据分析将被讨论。这里将讨论BFOA技术与其他的优化技术的混合技术,还将提供一个大多数至今的重要的 BFOA应用的解释。

1介绍 细菌觅食优化算法(BFOA),被Passino所提出,对于仿生学优化算法大家庭来说是一个新兴技术。对于过去的50年来,优化算法,像遗传算法(GA),进 化规划(EA),进化策略(ES),从进化和自然遗传上吸引了许多他们的灵感,已经占领了优化算法领域。最近自然群体激发了算法,像粒子群优化(PSO) 算法,蚁群算法(ACO)已经找到了它们通向领域并且高效性的路。紧接着相同的群体算法趋势,Passino在提出了BFOA算法。大肠杆菌群体觅食策略的应用在多元函数最优化算法中是一个很关键的想法原型。细菌以一种可以最大限度的提高单位时间内获得能量的方式去寻找食物。个体细菌通过发送信号来与其他的细菌进行交流。细菌在考虑前面两个因素之后做出进行觅食的决定。这个过程中,当寻找到食物后细菌做出最小的步长的移动,这个过程叫做趋化。BFOA的关键思想是在问题搜索空间模仿细菌趋化运动。

从该算法出现以来,BFOA吸引了许多来自不同知识领域的研究人员的关注,主要是由于它的生物学驱动方式和神奇优美的结构。研究人员正在尝试着去混合BFOA算法与其他不同的算法,尽量去探索该算法的局部和全局两个方面的特性。它已经被应用到许多现实世界的真实问题上,证明其他GA和PSO等多变量方面的高效性。数学模型,适应性,算法的修改可能是BFOA将来的主要研究方向。

本文的结构如下:第二部份提供BFOA算法的生物动力模型,并且全面的概括该算法。第三部份在传统的梯度下降搜索算法框架下提供一个关于趋化计算的简单数学分析。第四部份讲解了复制操作的数学模型。第五部分对BFOA算法与其他软计算算法的混合进行了探讨。第六部分提供了BFOA算法在不同的科学和能源领域的应用概述。第七部分进行了一个总结。

2 细菌觅食优化算法 在实际的细菌觅食过程中,运动是靠一系列拉伸的鞭毛来实现的。鞭毛帮助的大肠杆菌细菌翻滚或游泳,这是由细菌在觅食时执行两个基本操作[7,8]。当它们顺时针方向翻转时,每一根鞭毛都会拉动细胞。这导致了鞭毛的独立运动,并且最终以最少的代价去翻转。然而,在糟糕的地方则频繁地翻转,去寻找一种营养梯度。逆时针方向移动鞭毛有助于细菌以非常快的速度游泳。在上面提到的算法中,细菌经历了趋化,朝着它们喜欢的营养梯度地方移动并且避免进入有害的环境。通常情况下,细菌在友好的环境中会移动较长的一段距离。图一描述了在营养问题上细菌是如何顺势转逆时针移动的。 在这里插入图片描述 当它们获得了足够的食物,它们的长度增加以及面对着合适的温度,它们将从自己本身的中间断裂开来,形成两个新的细菌。这个现象启发Passino在BFOA中引进繁殖的事件。由于突然的环境变化或攻击发生后,趋化过程可能被破坏和一群细菌可能会转移到其他地方或者一些细菌可能被引进到细菌群中。这些构成了真实细菌环境中的消除-分散事件。一个区域内的所有细菌被杀死或者一组细菌分散到环境的新部分。

现在假设我们想要找到最小的J(θ),其中θ ∈ R (i.e. θ is a p-dimensional vector of real numbers),并且我们没有关于梯度∇J ( θ )的测量或者分析描述。BFOA模拟真是细菌系统中的这四个观察到的主要机制:趋化,群体,复制以及消除-分散。解决这个无梯度优化问题。一个虚拟细菌事实上是一个 让我们定义一个翻转趋化步骤其次一次翻转或者运行后翻转。 让j作为趋化步骤索引。k作为复制步骤索引。l作为消除-分散步骤索引。同时让: p:搜索空间维度 S:群体中细菌的总数 Nc:趋化步骤的步数 Ns:游泳长度 Nre:复制步骤的次数 Ned:消除-分散事件的次数 Ped:消除-分散概率 P( j , k , l ) = {θ ( j , k , l ) | i = 1,2,..., S}
代表j-th趋化步骤中,S细菌群体中的每一个成员的位置,k-th复制步骤,l-th消除-分散事件。 J(i,j,k,l) 表示在i-th细菌 θ ( j , k , l ) ∈ R p (sometimes we drop the indices and refer to the i-th bacterium position as θ i )搜索定位中的消耗(代价)。注意:我们可以将J当作“cost”代价来做参考(用优化理论的术语)。并且当作一个营养面(参考生物连接)。对于事实上的细菌种群,S可能(可以)可能是非常大的(例如:S=109),但是p=3.在我们的计算模拟中,我们将使用非常小的种群数,且将始终保持种群数量固定。BFOA允许p>3,以至于我们能够运用这种方法在高维度优化问题中。下面我们将简要的描述这四种BFOA中的主要步骤。 1)趋化:这个过程模拟一个大肠刚军细胞的运动,通过利用鞭毛的游泳和翻转。生物学一个大肠杆菌可以通过两中不同的方式移动。它可以在一定时间内朝着一个相同的方向游去或者也可以翻转,或者在整个生命周期中在两中操作模式之间来回的轮流替换。 假设θ(j,k,l)代表i-th 细菌在j-th趋化,k-th复制,并且l-th消除-分散步骤中。C(i)是翻转过程中采取 指定的随机方向的步长的大小(运行长度单元)。然后在计算趋向过程中,细菌的运动方向可能根据下式表示: 在这里插入图片描述 其中 指定为一个随机方向向量,元素范围为[-1,1]。

2)群聚:一个有趣的群体行为已被发现自几种能动的细菌物种,包括大肠杆菌,鼠伤寒沙门氏菌,其中复杂性和稳定性的时空格局(群聚)形成在半固体培养基。当使用一个营养化疗效果器放置半固体基质到其中时,A组大肠杆菌细胞依靠拉动营养梯度来安排自己在一个旅游圈中。当使用一个高等级的琥珀酸去刺激时,这个细胞释放一个有吸引力的谷草,这可以帮助他们去聚集成一个群组,从而移动成像高密度细菌群体的同心圆形状图案。这种细胞-细胞信号传导在大肠杆菌群体中可以通过下面的函数来表示出来。 在这里插入图片描述 3)复制:至少当每一个健康的细菌无性分裂成两个细菌,然后放置在原先的位置,健康的细菌才最终死亡。这样将保持细菌群体大小的不变。

4)消除和扩散:细菌生活的环境逐渐的改变或者突然的改变都可能由于各种各样的原因而发生。例如:当地显著的气温上升可能杀死一组目前生活在一个区域内且有高浓度营养盐梯度的细菌。这样的事情可能发生以这样一个方式,以至于一个区域内的细菌都被杀死或者一组细菌扩散到一个新的区域。模拟这种现象在BFOA 一些细菌被以很小概率的随机地清算掉,当新的替代品细胞们在搜索空间被随即初始化后。

伪代码以及完整算法的流程图(FIgure 3)将在下面呈现: BFOA算法: 参数: 【步骤 1】初始化参数p,S,Nc,Ns,Nre,Ned,Ped,C(i)(i=1,2,…S),θi . 算法: 【步骤 2】消除-扩散 循环 loop:l=l+1 【步骤 3】复制循环loop:k=k+1 【步骤 3】复制循环loop:k=k+1 【步骤 4】趋化循环Loop:j=j+1 【步骤 5】如果j<Nc,跳转到步骤4。这种情况下继续进行趋化,因为细菌的生命并未结束。 【步骤 6】复制: 【a】根据给定的k跟l,对i=1,2,……S,循环,让作为健康的i细菌(一种它生命周期中度过多少营养以及怎样成功的避免有害物质的衡量)。排序细菌以及趋化参数C(i)在代价上升J(i)的顺序(高代价意味着低健康)。 【b】拥有最高的Jhealth值的Sr细菌死亡,最好值的细菌分裂开来(这个过程靠复制执行,结果放置在它们原先的父母的位置)。 【步骤 7】如果K<Nre,跳到步骤3.这种情况下,我们没有达到制定复制的数量,所以,我们开始下一次趋化循环,产生后代。 【步骤 8】驱散:以概率Ped进行循环i=1,2,……S,驱散每一个细菌(保持持续不变的细菌种群数量)。做这些,如果一个细菌被消除,驱散另一个去随即查找优化域。如果l<Ned,然后跳转到步骤2;否则结束。

流程图如下所示: 在这里插入图片描述

二、部分源代码



%%
%Initialization
clear all   
clc
p=2;                         % dimension of search space 
s=26;                        % The number of bacteria 
Nc=50;                       % Number of chemotactic steps 
Ns=4;                        % Limits the length of a swim 
Nre=4;                       % The number of reproduction steps 
Ned=2;                       % The number of elimination-dispersal events 
Sr=s/2;                      % The number of bacteria reproductions (splits) per generation 
Ped=0.25;                    % The probabilty that each bacteria will be eliminated/dispersed 
c(:,1)=0.05*ones(s,1);       % the run length  
for m=1:s                    % the initital posistions 
    P(1,:,1,1,1)= 50*rand(s,1)';
    P(2,:,1,1,1)= .2*rand(s,1)';
   %P(3,:,1,1,1)= .2*rand(s,1)';
end                                                                  
     
%%
%Main loop  
for ell=1:Ned %Elimination and dispersal loop 
    for K=1:Nre    %Reprodution loop
        for j=1:Nc%  swim/tumble(chemotaxis)loop 
            for i=1:s        
                J(i,j,K,ell)=Live_fn(P(:,i,j,K,ell)); % evaluate the population
                % Tumble
                Jlast=J(i,j,K,ell);   
                Delta(:,i)=(2*round(rand(p,1))-1).*rand(p,1); 	             	
                P(:,i,j+1,K,ell)=P(:,i,j,K,ell)+c(i,K)*Delta(:,i)/sqrt(Delta(:,i)'*Delta(:,i)); % This adds a unit vector in the random direction            
 
% Swim (for bacteria that seem to be headed in the right direction)     
                
                J(i,j+1,K,ell)=Live_fn(P(:,i,j+1,K,ell));  
                m=0;         % Initialize counter for swim length 
                    while m<Ns     
                          m=m+1;
                          if J(i,j+1,K,ell)<Jlast  
                             Jlast=J(i,j+1,K,ell);    
                             P(:,i,j+1,K,ell)=P(:,i,j+1,K,ell)+c(i,K)*Delta(:,i)/sqrt(Delta(:,i)'*Delta(:,i)) ;  
                             J(i,j+1,K,ell)=Live_fn(P(:,i,j+1,K,ell));  
                          else       
                             m=Ns ;     
                          end        
                    
                    end 
                J(i,j,K,ell)=Jlast;
                sprintf('The value of interation i %3.0f ,j = %3.0f  , K= %3.0f, ell= %3.0f' , i, j, K ,ell );
                   
            end % Go to next bacterium
            
            x = P(1,:,j,K,ell);
            y = P(2,:,j,K,ell);
            clf    
            plot(x, y , 'h')   
            axis([-5 5 -5 5]);
            pause(.1)
        end  % Go to the next chemotactic    

                 
%Reprodution                                              
        Jhealth=sum(J(:,:,K,ell),2);              % Set the health of each of the S bacteria
        [Jhealth,sortind]=sort(Jhealth);          % Sorts the nutrient concentration in order of ascending 
        P(:,:,1,K+1,ell)=P(:,sortind,Nc+1,K,ell); 
        c(:,K+1)=c(sortind,K);                    % And keeps the chemotaxis parameters with each bacterium at the next generation
                                     

%Split the bacteria (reproduction)                             
            for i=1:Sr
                P(:,i+Sr,1,K+1,ell)=P(:,i,1,K+1,ell); % The least fit do not reproduce, the most fit ones split into two identical copies  
                c(i+Sr,K+1)=c(i,K+1);                 
            end   
        end %  Go to next reproduction    


%Eliminatoin and dispersal
        for m=1:s 
            if  Ped>rand % % Generate random number 
                P(1,:,1,1,1)= 50*rand(s,1)';
                P(2,:,1,1,1)= .2*rand(s,1)';
               %P(3,:,1,1,1)= .2*rand(s,1)';   
            else 
                P(:,m,1,1,ell+1)=P(:,m,1,Nre+1,ell); % Bacteria that are not dispersed
            end        
        end 
    end % Go to next elimination and disperstal 

%Report
           reproduction = J(:,1:Nc,Nre,Ned);
           [jlastreproduction,O] = min(reproduction,[],2);  % min cost function for each bacterial 
           [Y,I] = min(jlastreproduction);
           pbest=P(:,I,O(I,:),K,ell);

三、运行结果

在这里插入图片描述

四、matlab版本及参考文献

1 matlab版本 2014a

2 参考文献 [1] 包子阳,余继周,杨杉.智能优化算法及其MATLAB实例(第2版)[M].电子工业出版社,2016. [2]张岩,吴水根.MATLAB优化算法源代码[M].清华大学出版社,2017.