一、获取代码方式
获取代码方式1:
完整代码已上传我的资源:【优化算法】细菌粒子群优化算法【含Matlab源码 1195期】
获取代码方式2:
通过订阅紫极神光博客付费专栏,凭支付凭证,私信博主,可获得此代码。
备注:
订阅紫极神光博客付费专栏,可免费获得1份代码(有效期为订阅日起,三天内有效);
二、细菌粒子群优化算法简介
1 前言
针对细菌觅食算法在优化过程中,环境感知能力较弱且容易陷入局部极值的缺陷,将粒子群算法的基本思想引入细菌觅食算法中,改进原算法的收敛速度和收敛能力,并据此建立了混合型的细菌觅食优化算法。细菌粒子群优化算法具有良好的搜索速度与精度,可以有效弥补细菌觅食算法的速度不快和粒子群算法的精度不高缺陷,同时部分的避免了局部收敛的问题,从而适用于解决复杂函数的优化。
2 粒子群算法
1995年, J.Kennedy和R.C.Eberhart p在他们提交给IEEE神经网络国际会议的论文中首次提出了粒子群优化算法(PSO) 。PSO是一种基于群集智能方法的演化计算技术, 算法产
生于一组初始解,通过迭代搜寻最优值,迭代过程中粒子始终追随个体极值和群体极值。同其它智能算法一样, PSO算法的粒子在运算后期, 由于缺乏有效机制跳出局部极值, 容易发生“早熟”现象,因此其特征可以用速度较快、精度稍低来描述。
假设所求问题维数为D,种群规模为m。粒子群优化算法首先初始化一群随机粒子(m
个随机解),假设用xi表示第i个粒子的位置,则x, =(x, X 2, ……, Xay…, xp每个粒子的位置都代表所求问题的一个候选解,这些解的好坏由适应度函数值决定,粒子在搜索时,由速度决定更新的方向和距离。用pi表示第i个粒子的历史最优位置,pg表示整个种群的历史最优位置,vi表示第i个粒子的速度,则:
粒子的位置和速度根据如下方程进行更新:
这里,是粒子i在第k次迭代中第d维的速度,P,是第k代全局最优解,Ped为其第d维的值,为非负数,称为惯性权重,它使粒子保持运动惯性,使其具有扩展收索空间的趋势,有助于新区域的搜索。cl和c2为正常数,称为学习因子,使粒子具有自我总结和向群体中优秀个体学习的能力,向自己的个体最优点以及群体内的全局最优点靠近。可见,粒子在搜索过程中,通过跟踪两个“极值”来更新自己,一个是粒子本身找到的最优位置,这个位置被称作个体极值P best; 另一个极值是粒子邻域目前找到的最优位置, 通常被称作全局极值G best。
3 细菌觅食算法
生物学研究表明,大肠杆菌的觅食行为中主要包括以下步骤:寻找可能存在食物源的区
域;决定是否进入此区域:在所选定的区域中寻找食物源;消耗掉一定量的食物后,决定是否继续在此区域觅食, 或者迁移到一个更理想的区域。BFO算法正是模拟Ecoli大肠杆菌在人体肠道内吞噬食物的觅食行为,所提出的一种新型仿生类优化算法。
该算法在求解优化问题的一般过程为:产生初始解群体、计算评价函数的值、利用群体
的相互影响进行优化。在BFO模型中, 优化问题的解对应搜索空间中细菌的状态, 即评价函数的适应值。BFO算法的包括趋化(Chemotaxis) 、复制(Reprod ution) 和迁移(Elimination and dispersal) 3个步骤。
趋化是一种实现最优化觅食的行为,这种行为过程就是细菌向营养丰富地方的集中方式
(即寻找越来越小的评价函数J值),表现为不断寻找出路而实现的一种有倾向的游动。在
细菌的趋化过程中, 细菌的运动行为包括翻转(tumble) 和游动(run) 两种。首先, 我们
定义细菌向任意方向移动的单位步长为翻转,如果细菌完成一次翻转后的适应值得到改善,将沿同一方向继续移动若干步,直至适应值不再改善,或达到预定的移动步数为止,这一过程定义为游动。细菌觅食算法中的趋化行为,可描述如下:设细菌个体代表解空间的一个解,P(i,j,k,1)表示细菌个体i的位置,其中j表示第j代趋化循环,k表示第k代复制循环,1表示第1代迁移循环,方向调整用公式(2)表示。
其中C(i)表示按选定的方向游动的步长,A(i)为变向中生成的随机向量,中(i)表示进行方向调整后选定的方向。细菌觅食优化的趋化操作其实就是细菌在解空间中对可行解的搜索、判定和调整的过程,这种调整还包括依据适应度函数,来确定调整的依据、调整的方向和调整的力度等问题。
大肠杆菌经过一段时间的趋化搜索之后,某些细菌的搜索策略已经很明显地失败了,为了提高搜索的精度和缩短搜索时间,一部分觅食能力强的细菌进行自身的分裂,分裂出的细菌与原来完全相同,以替换被淘汰掉的大肠杆菌。在此,算法设定趋化的生命周期,即临界趋化次数,细菌将遵循自然界“优胜劣汰,适者生存”原则进行繁殖。以趋化过程中各细菌适应值累加和为标准,较差的半数细菌死亡,较好的半数细菌分裂成两个子细菌。子细菌将继承母细菌所以的生物特性,且具有与母细菌相同的位置及步长。趋化过程可以确保细菌的局部搜索能力,复制过程能加快细菌的搜索速度,但对于许多的优化问题,趋化和复制都无可避免的使细菌陷入局部极小地区。
另外,细菌群体所依附的生存环境不可能一成不变,由于细菌对食物的消化而导致环境改变,也可能因为一些其它原因的影响而突然变化。比如说,当前环境的温度突然上升可以杀死该环境下的细菌,水的冲刷作用或其它生物的影响可以将细菌由一个环境带到一个新的环境。这样,某个区域内的细菌或者某个细菌群体便移动到了一个新的环境下开始生存。觅食算法中的迁移操作就是按照给定的概率Ped, 如果某细菌个体满足迁移操作的条件, 那么就按照随机算法重新生成一个新个体, 等同于将原个体迁移到一个新位置BFO引入迁移操作,有效地加强了该算法的全局寻优能力。
4 混合算法设计
由粒子群算法的基本原理可以看出,粒子通过追踪自身局部最优和全部粒子的全局最优为目标更新位置。因此,我们借鉴这种思想,赋予细菌对于环境一定的感知能力,同样细菌可以通过比较自身历史最优和全部细菌的全局最优来进行迭代。相关研究表明,粒子群算法可以更快的寻找到局部最优点的大致位置,从而加快了细菌觅食优化算法的寻优速度和能力。
在BFO算法中, 最为主要的步骤是趋化操作。在实际的设计中, 较大的变向与游动步
长能够较快的进行收敛,也能够轻易地跳出局部最优点,但是也常常越过了全局最优点。相反,较小的游动步长收敛速度会很慢,也很容易进入局部最优区域而无法跳出,但是一
旦找到全局最优点,那么就能达到较高的精度。因此,我们在细菌觅食算法的基础上,
引入粒子群算法,其目的是为了给细菌的趋化操作提供方向性指引,算法设计的主要思
路如图1所示。借助于这种方式,位置较差的细菌可以很快聚集到一个较好的区域内,
而本身较好的细菌则在其邻域内进行下一步的局部搜索。
算法的主要步骤设计如下:
a)在变量的设计范围内对细菌规模数s,迁移次数Ned、繁殖次数N re、趋化次数Nc,
游动次数Ns和迁移概率进行参数设定。
b)细菌位置随机初始化,为每一个细菌随机产生任意方向的单位步长向量。
c)粒子群算法参数设计,设定每一个细菌的局部极值初始值、全部细菌的全局极值初始值。
d)趋化循环操作。对每一个细菌按照翻转方式更新位置,如果位置更好,则向前游动。
e)更新细菌个体的局部极值和细菌群的全局极值,按照粒子群算法的公式(1)来更
新细菌的翻转方向,而非任意方向。
f)繁殖操作。对于经过一个趋化循环的细菌群体,对每个细菌按照适应度的累加和进行
排序,淘汰掉适应值较差的半数细菌,从适应值较好的半数细菌中分裂出同样的细菌群,这批细菌继承母细菌的位置和特性。
g)迁移操作。经过一个繁殖操作的循环后,细菌有可能走向局部极值。在此,对于每一
个细菌按照一定的迁移概率进行迁移,为了保证算法的收敛,设定一定的迁移细菌数目。
在程序的设定中,最为主要的是趋化操作,其次是繁殖,最后是迁移。因此,该算法的
趋化频率高于繁殖频率,而繁殖频率高于迁移频率。即一个细菌在繁殖前要经历许多个趋化步,在一次迁移前也要经历好几代的繁殖过程。
三、部分源代码
%% Bacterial Foraging Orientec by Particle swarm optimization
% Animiation of bacteria movement to get the global minimum solution every chemotactic
%
% I
%have used this techique in PID tunning and i got better result thatn BG
%and PSO
%%
%Initialization
clear all
clc
p=2; % dimension of search space
s=10; % The number of bacteria
Nc=20; % 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.5*ones(s,1); % the run length
for i = 1:s
Delta(:,i)=(2*round(rand(p,1))-1).*rand(p,1);
end
for m=1:s % the initital posistions
P(1,:,1,1,1)= 50*rand(s,1)';
P(2,:,1,1,1)= 0.2*rand(s,1)';
%P(3,:,1,1,1)= .2*rand(s,1)';
end
c1 =1.2; % PSO parameter C1 1.2
c2 = 0.5; % PSO parameter C2 .5
R1 = rand(p,s); % PSO parameter
R2 = rand(p,s); % PSO parameter
Plocal_best_position=0*ones(p,s,Nc); % PSO
Pglobal_best_position=0*ones(p,s,Nc); % PSO
velocity = .3*randn(p,s); % PSO
current_position=0*ones(p,s,Nc); % PSO
%%
%Main loop
%Elimination and dispersal loop
for ell=1:Ned
%Reprodution loop
for K=1:Nre
% swim/tumble(chemotaxis)loop
for j=1:Nc
for i=1:s
J(i,j,K,ell)=Live_fn(P(:,i,j,K,ell));
% Tumble
Jlast=J(i,j,K,ell);
Jlocal(i,j)=Jlast;
P(:,i,j+1,K,ell)=P(:,i,j,K,ell)+c(i,K)*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) ;
J(i,j+1,K,ell)=Live_fn(P(:,i,j+1,K,ell));
current_position(:,i,j+1)= P(:,i,j+1,K,ell) ; % PSO
Jlocal(i,j+1) = J(i,j+1,K,ell) ; % PSO
else
Jlocal(i,j+1) = J(i,j+1,K,ell) ;
current_position(:,i,j+1)= P(:,i,j+1,K,ell);
m=Ns ;
end
end
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
%For each chemotactic evaluate the local and global best position
%Local best position over all chemotactic that each bacteria move through it
[Jmin_for_each_chemotactic,index]=min(Jlocal,[],2);
for m=1:s
Plocal_best_position(:,m,j) = current_position(:,m,index(m,:));
end
%Global best position over all chemotactic and for each bacteria
[Y,I]=min(Jmin_for_each_chemotactic);
global_best_position =current_position(:,I,index(I,:));
for m =1:s
Pglobal_best_position(:,m,j)=global_best_position;
end
%Caluculate the new direction for each bacteria
velocity =.9* velocity + c1*(R1.*(Plocal_best_position(:,:,j)-current_position(:,:,j+1))) + c2*(R2.*(Pglobal_best_position(:,:,j)-current_position(:,:,j+1)));
Delta = velocity ;
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
function fposition=Live_fn(x)
p=0;q=0;
for k=1:5
p=p+k*cos((k+1)*x(1)+k);
q=q+k*cos((k+1)*x(2)+k);
end
fposition=p*q+(x(1)+1.42513)^2+(x(2)+.80032)^2;
四、运行结果
五、matlab版本及参考文献
1 matlab版本
2014a
2 参考文献
[1] 包子阳,余继周,杨杉.智能优化算法及其MATLAB实例(第2版)[M].电子工业出版社,2016.
[2]张岩,吴水根.MATLAB优化算法源代码[M].清华大学出版社,2017.
[3]周品.MATLAB 神经网络设计与应用[M].清华大学出版社,2013.
[4]陈明.MATLAB神经网络原理与实例精解[M].清华大学出版社,2013.
[5]方清城.MATLAB R2016a神经网络设计与应用28个案例分析[M].清华大学出版社,2018.