布谷鸟算法是将布谷鸟育雏行为与Levy飞行算法相结合的一种算法。

布谷鸟哈希散列java实现 布谷鸟算法详细讲解_ide

在布谷鸟算法中,有两个算法或者说两个位置更新是关键:

第一个是布谷鸟寻找最优解时的算法:

一个是布谷鸟寻找鸟窝下蛋的寻找路径是采用早已就有的萊维飞行3,如上图所示,无敌的走位是一种长步长与短步长相间的走位,这其实就是萊维飞行的主要特点,学者们也证实了自然界中很多鸟类的飞行也遵从萊维飞行,这也是最有效寻找目标的方法之一 。所以采用萊维飞行更新鸟窝位置的公式被定义如下: 

   

   

布谷鸟哈希散列java实现 布谷鸟算法详细讲解_算法_02

 

   其中 , α是步长缩放因子,Levy(β)是萊维随机路径,⨂ 就是.∗.∗运算

第二个是发现新巢的位置更新

宿主鸟以一定概率Pa发现外来鸟后重新建窝的位置路径,这个路径可以用萊维飞行或者随机方式4,(本文采用随机) , 除此之外,这个位置普遍采用偏好随机游动的方式,即利用了其他鸟窝的相似性。所以新建的鸟窝的位置的公式被定义如下: 

   

布谷鸟哈希散列java实现 布谷鸟算法详细讲解_ide_03

其中,r,

布谷鸟哈希散列java实现 布谷鸟算法详细讲解_算法_04

是服从均匀分布的随机数,Heaviside(x) 是跳跃函数(x>0,=1;x<0,=0) , 

布谷鸟哈希散列java实现 布谷鸟算法详细讲解_随机数_05


布谷鸟哈希散列java实现 布谷鸟算法详细讲解_最小值_06

是其他任意的两个鸟窝。

 布谷鸟算法的流程图:

布谷鸟哈希散列java实现 布谷鸟算法详细讲解_算法_07

 举一个例子:

为了使大家容易理解,我还是用y=(x-0.5)^2+1来举例子,例如我们有4个布谷鸟蛋(也就是4个x坐标),鸟妈妈发现不是自己的宝宝的概率是0.25,我们x的取值范围是[0,1]之间,于是我们就可以开始计算了。 

目标:求x在[0,1]之内的函数y=(x-0.5)^2+1最小值 

(1)初始化x的位置,随机生成4个x坐标,x1=0.4,x2=0.6,x3=0.8,x4=0.3 ——> X=[0.4, 0.6 ,0.8, 0.3] 

(2)求出y1~y4,把x1~x4带入函数,求得Y=[1,31, 1.46, 1.69, 1.265],并选取当前最小值ymin= y4=1.265 

(3)开始定出一个y的最大值为Y_global=INF(无穷大),然后与ymin比较,把Y中最小的位置和值保留,例如Y_global=INF>ymin=1.265,所以令Y_global=1.265 

(4)记录Y_global的位置,(0.3,1.265)。 

(5)按概率0.25,随机地把X中的值过塞子,选出被发现的蛋。例如第二个蛋被发现x2=0.6,那么他就要随机地变换位子,生成一个随机数,例如0.02,然后把x2=x2+0.02=0.62,之后求出y2=1.4794。那么X就变为了X=[0.4, 0.62 ,0.8, 0.3],Y=[1,31, 1.4794, 1.69, 1.265]。 

(6)进行莱维飞行,这名字听起来挺高大上,说白了,就是把X的位置给随机地改变了。怎么变?有一个公式

布谷鸟哈希散列java实现 布谷鸟算法详细讲解_算法_02


获得x1=0.3985 

之后同理计算: 
x2=0.6172  
x3=0.7889  
x4=0.3030 
(7)更新矩阵X,X=[0.3985, 0.6172, 0.7889, 0.3030] 
(8)计算Y=[1.3092, 1.4766, 1.6751, 1.2661],并选取当前最小值ymin= y4=1.2661,然后与ymin比较,把Y中最小的位置和值保留,例如Y_global=1.265<ymin=1.2661,所以令Y_global=1.265 
(9)返回步骤(5)用更新的X去循环执行,经过多次计算即可获得y的最优值和的最值位置(x,y)