一个例子入坑布谷鸟算法(附完整py代码)

article/2025/10/5 7:54:24

布谷鸟是比较新的启发式最优化算法,但其与传统的遗传算法,退火算法等相比,被证明收敛速度更快,计算效率更高!

文章目录

  • 本文诞生的缘由
  • 布谷鸟算法思想简介
  • 更新位置的方式
      • 莱维飞行
      • 局部随机行走
  • 抛出个栗子
  • 一些参数的建议
  • 完整的python实现
  • 运行结果
  • 参考文献


本文诞生的缘由

       由于布谷鸟算法比较新,所以国内外的网上对于该算法的介绍都比较少,虽然算法整体的思想看起来简单,但真正落实到实践时往往发现有些细节还是不甚清楚。令人尴尬的是,我搜索了国内外对于布谷鸟算法的教程,这些教程恰恰点到算法思想上就止住了,并且给出的代码千篇一律地还是Xin-She Yang(布谷鸟算法提出者之一)给出的matlab代码1,对初学者很不友好,于是我就打算写一篇教程,通过详细地举一个例子来带大家入门布谷鸟算法,并且我写了份python代码(可直接运行),需要者可在下面的github链接中自取。

 


布谷鸟算法思想简介

       布谷鸟算法的启发当然来自于布谷鸟,因为布谷鸟这种鸟很有意思,生出来的孩子自己不养,直接被扔到其他鸟的鸟巢中去了,但有时候,这些布谷鸟蛋会被被寄宿的那些鸟妈妈发现,然后就被抛弃,有时候,这些宿主会直接放弃整个鸟巢寻找新住处。然而道高一尺魔高一丈,有些品种的布谷鸟生下来的布谷鸟蛋的颜色能和去寄宿的鸟的鸟蛋颜色很相似,并且布谷鸟的破壳时间往往比那些宿主的鸟蛋早,这样,一旦小布谷鸟破壳,它就会将一些鸟蛋扔出鸟巢去以求获得更多的食物,并且,小布谷鸟能模拟宿主鸟孩子的叫声来骗取更多的食物!简单来说,就是如何更高效地去骗吃骗喝。

图1 寄宿到其他鸟的布谷鸟蛋

       这时,心急的朋友可能会问,这和最优化有啥蛋关系呢?如果光让我看到这种自然现象我也很难和最优化联系起来,但有些细心的人做到了。我们现在来简单概括一下他们是咋联系起来的。

  1. 他们假设最初在可行域内随机生成一组点(布谷鸟)
  2. 计算这些点的适应值(鸟的健康程度),并记录下最健康鸟的位置及其适应值
  3. 然后通过某种方式更新这些点的位置(布谷鸟找其他鸟的鸟巢下蛋)
  4. 这些寄宿到其他鸟的布谷鸟蛋有一定几率被抛弃,这时布谷鸟需要找新的位置来下新的布谷鸟蛋,没被发现的布谷鸟蛋就保持原样(也就是保持每次迭代的点的总数不变)
  5. 这些布谷鸟蛋成功被孵化然后长大,原有的布谷鸟则会死去,现在评估新的这些点的适应值(新长大的布谷鸟的健康程度),若比原有记录下最好适应值要好则更新最好适应值
  6. 新的这批布谷鸟从第3步继续迭代,直至满足迭代次数或精度要求

一头雾水?别怕,后面一个例子就懂了!

 


更新位置的方式

       细心的朋友在看上面算法步骤时可能会问,以某种方式更新位置,是啥子方式呢?更新位置的算法同样很重要,它也会关系到最后算法的收敛速度,在上述的算法步骤中,我们在第3步和第4步都需要更新点的位置,现在就来解答这个问题。其实这些更新点的方式说的直白些其实很简单,就是让这些点乱走,当然它有个洋气的名字(random walk),乱走的方式也很简单粗暴,随机生成一个方向和长度,叠加到原有点上就成了新的点,但是需要指出的是,这个随机生成的方向和长度都是有讲究的,有研究发现通过莱维飞行(Levy Flight)的方式能比较有效地去寻找全局最优解而不至于陷入局部最优解中,并且它和布谷鸟算法配合达到了相当不错的效果,接下来就是解答什么是莱维飞行了。

莱维飞行

       在介绍莱维飞行相关公式之前,我们先来简单说一下它背后的思想,莱维飞行是由较长时间的短步长和较短时间的长步长组成,说起来很拗口,我们先来看一下它的演示图吧:

图2 莱维飞行动画

       从上面的动画中我们可以看到,点大多数时间都只有小距离移动,偶尔会有大距离移动的情况。这和自然界中大多数动物觅食方式方式类似,也就是找到一块区域后细致的查找猎物,如果没找到,就换一片区域找。
       那么,该如何实现这种移动方式呢?我们现在假设我们就是捕食者,需要捕猎去了,但尚不清楚猎物在哪,那好,我们先随机选个方向(服从均匀分布,因为在不知道任何信息前提下,对于我们来说各个方向存在猎物的可能性相等),接下来就得确定要走多远了,根据上面的思想,Levy分布要求大概率落在值比较小的地方,而小概率落在值比较大的地方,Mantegna就提出了近似满足这种分布的计算公式(levy分布很难满足,有兴趣的小伙伴可以查阅相关资料):
s = u ∣ v ∣ 1 β s=\frac{u}{\left | v \right |^{\frac{1}{\beta }}} s=vβ1u
(说明:u服从 N ( 0 , σ u ) N(0,\sigma _{u}) N(0,σu)正态分布,v服从 N ( 0 , σ v ) N(0,\sigma _{v}) N(0,σv)正态分布,而 σ u = { Γ ( 1 + β ) sin ⁡ ( π β 2 ) Γ [ ( 1 + β ) 2 β ⋅ 2 ( β − 1 ) 2 ] } 1 β \sigma _{u} = \left \{ \frac{\Gamma (1+\beta )\sin (\frac{\pi\beta }{2})}{\Gamma \left [ \frac{(1+\beta )}{2}\beta \cdot2^{\frac{(\beta -1)}{2}} \right ]}\right \}^{\frac{1}{\beta }} σu=Γ[2(1+β)β22(β1)]Γ(1+β)sin(2πβ)β1 σ v = 1 \sigma _{v}=1 σv=1,其中 Γ ( z ) = ∫ 0 ∞ t z − 1 e t d t \Gamma (z)=\int_{0}^{\infty }\frac{t^{z-1}}{e^{t}}dt Γ(z)=0ettz1dt β \beta β取值最好落在(1,2)上)。上面的公式乍一看十分复杂,但幸运的是,无论是matlab还是python,关于正态分布和 Γ \Gamma Γ函数都有现成的函数,我们做伸手党即可。而这个公式咋来的便是数学家的事情了,我也不懂啊(ಥ_ಥ),但我们可以编个小程序直观地感受到其生成的步长确实短步长多,长步长少(可见上面的动画)。概括地来讲,实现莱维飞行,一要通过均匀概率分布生成一个方向,二要确认步长!

局部随机行走

       我们再来介绍一种随机行走的方法(random walk),但这种方法只适用于局部,很容易陷入局部最优解,优点是比较稳定,因为是局部走嘛。它的计算公式如下:
x i t + 1 = x i t + α s ⨂ H ( p a − ϵ ) ⨂ ( x j t − x k t ) x_{i}^{t+1}=x_{i}^{t}+\alpha s\bigotimes H(p_{a}-\epsilon )\bigotimes (x_{j}^{t}-x_{k}^{t}) xit+1=xit+αsH(paϵ)(xjtxkt)
(说明: x i t x_{i}^{t} xit是第i个点t时刻的位置, α \alpha α是步长系数,也就是让步长增量和你问题的规模相匹配,举个例子,你的问题的规模是个位数级别的,你肯定不希望步长增量是十位数级别或者毫米数级别的,这就需要你适当缩小或扩大步长了,H是跃迁函数,也就是x大于等于1时数值为1,否则为0, ⨂ \bigotimes 代表点乘, x j t x_{j}^{t} xjt x k t x_{k}^{t} xkt是t时刻任意选取的两个点)。
       相对于莱维飞行的随机性,局部随机行走时已有一定的方向性了,其最大程度地利用已有点的位置信息,新产生的点便是这些已有点的“折中”。

 


抛出个栗子

       看完上面一些理论知识,你可能更晕了,那么,接下来吃下这颗栗子,你可能便会豁然开朗了。

       我们要优化的问题是这样的:
3 ( 1 − x ) 2 ⋅ e − x 2 − ( y + 1 ) 2 − 10 ( x 5 − x 3 − y 5 ) ⋅ e − x 2 − y 2 − e − ( x + 1 ) 2 − y 2 3 3(1-x)^{2}\cdot e^{-x^{2}-(y+1)^{2}}-10(\frac{x}{5}-x^{3}-y^{5})\cdot e^{-x^{2}-y^{2}}-\frac{e^{-(x+1)^{2}-y^2}}{3} 3(1x)2ex2(y+1)210(5xx3y5)ex2y23e(x+1)2y2其中x和y都落在(-3,3)上,求其最大值。
       为了简化起见,我们这里只取5个点。
 


第一步、我们现在先在可行域内随机生成5个点:

第二步、计算它们的适应度(适应值函数我们就取为上面那个要优化的函数):

我们从中挑出最好的并记录下来,我们可以看到,最好的适应值为下标4对应的点,为7.648。

第三步、利用莱维飞行更新点,莱维飞行公式中的 β \beta β我们取为1.5,剩下的把公式敲上去获得步长,但是,这样生成的步长的规格是大于问题的规模的,后面我们需要调参,但这里为了简便我就把我后来调出来的结果摆出来,莱维飞行的步长需要乘以系数0.4才能让莱维飞行不至于走的太放飞自我,也不至于走的太畏畏缩缩(多数情况下,系数取为0.1和0.01)。这里我们还用到了一个小技巧,我们当然是希望上一轮产生的最好点能在下一轮保留下来,所以我们可以在步长前乘以个系数 ( x i 上 一 轮 − x b e s t 上 一 轮 ) (x_{i}^{上一轮}-x_{best}^{上一轮}) (xixbest),这里的 i i i就是步长对应的点下标。当然,有了步长还不够,还得有个步长方向,这个方向我们就用0-1均匀概率分布产生,步长方向(矢量)点乘步长(矢量)就是步长增量。这是莱特飞行更新后的结果:

第四步、接下来,一些布谷鸟蛋可能会被宿主发现并被抛弃,这个抛弃的概率 P a P_{a} Pa我们设置为0.25,当有布谷鸟蛋被抛弃时,我们需要寻找新的寄宿地点,而寻找新的寄宿地点的算法就是上面提到的局部随机行走算法,我们可以把 α \alpha α这个系数定为1,步长s我们也取为1,后面两个随机选取的点 x j t , x k t x_{j}^{t},x_{k}^{t} xjt,xkt,我们通过均匀概率分布选出,这里我们不使用跃迁函数H。更新后的结果如下:

第五步、计算这些新点的适应值,并挑出最大值和记录的最好点的适应值比较,若该轮更新得到的最大值更好,则将该轮得到的最大点设为最好点并记录下来。遗憾的是,这里,该轮点的最大值没有比记录的最好点好,所以我们不用更新最好点的值。

第六步、回到上面的第三步,继续循环直至满足迭代次数要求或精度要求。
补充:由于随机行走(莱维飞行是随机行走的一种特殊形式)可能会超出我们的可行域范围,我们可以利用简单的边界条件,即当点超过下边界时,则用下边界的值代替,同理,当点超过上边界时,则用上边界的值代替。
 


一些参数的建议

       布谷鸟算法提出者之一的Xin-She Yang教授试了多组参数,发现种群规模在15到40,布谷鸟蛋被发现的概率 p a p_{a} pa取0.25时1 2,对于大多数优化问题已足够,并且结果和分析也表明收敛速度在一定程度上对所使用的参数不敏感。这意味着对于任何问题都不需要进行仔细地调整。至于迭代次数,我在实验中发现100次的迭代次数已能很好地找到最优解,但迭代次数往往取决你问题的规模,并没有一组所谓的万能参数。
 


完整的python实现

       在这份代码中,我写了详细的注释,每个函数的功能和输入输出参数都有详细的说明,如果对上面的一些讲解还有些疑惑,可以直接查看代码的相关部分,我想应该很快就能茅塞顿开了。下载地址如下:https://github.com/SJ2050SJ/Optimization_Algorithms(如果对你有帮助的话不要忘点个star哦 ! (^_ ^)
 


运行结果

上面那个优化函数的图像在这篇文章中可以看到遗传算法(白话文版)。在这次测试中,我们选择种群规模为25,迭代次数为100。由精确分析可知,上述优化问题在可行域内的最大值为8.1062,在 [ − 0.0093 , 1.5814 ] T [-0.0093,1.5814]^{T} [0.0093,1.5814]T上取到,可以看到,我们优化的结果已经很接近精确答案了,并并且每次优化出来的结果很稳定!

3 4
 
 
 
 
 
 
 


参考文献


  1. Xin-She Yang. 《Nature Inspired Optimization Algorithm.2nd》 ↩︎ ↩︎

  2. 布谷鸟搜索算法 ↩︎

  3. 布谷鸟算法详细讲解 ↩︎

  4. 通俗易懂的布谷鸟算法与莱维飞行,(附求解函数最小值matlab源码) ↩︎


http://chatgpt.dhexx.cn/article/udOCx05g.shtml

相关文章

基于布谷鸟搜索算法的函数寻优算法

文章目录 一、理论基础1、算法原理2、算法流程图 二、Matlab代码三、参考文献 一、理论基础 1、算法原理 布谷鸟采用一种特殊的寄生宿主巢穴的方式孕育繁殖,它将孵育的蛋置入寄生宿主的巢穴,让寄生宿主孵化布谷鸟蛋。由于布谷鸟幼雏能发出比寄生宿主幼雏更闪亮的叫…

布谷鸟算法(Cuckoo Search,CS)MATLAB案例详细解析

目录 一、布谷鸟算法理论二、CS算法应用于函数优化1.流程图3.代码解析3.1 主函数 Csmain.m3.2 Levy飞行 func_levy.m3.3 与上一代比较,返回较优的鸟巢 func_bestNestPop.m3.4 根据发现概率,舍弃一个鸟巢并建立一个新鸟巢 func_newBuildNest.m3.5 目标函数…

智能优化算法——布谷鸟搜索算法原理(附代码)

目录 基本概念 算法具体流程 算法流程图 测试函数 优化结果 visual studio2017C代码 基本概念 布谷鸟搜索算法(Cuckoo Search,缩写 CS)是由剑桥大学杨新社教授和S.戴布于2009年提出的一种新兴启发算法。根据昆虫学家的长期观察研究发现&#…

布谷鸟算法

布谷鸟算法是将布谷鸟育雏行为与Levy飞行算法相结合的一种算法。 在布谷鸟算法中,有两个算法或者说两个位置更新是关键: 第一个是布谷鸟寻找最优解时的算法: 一个是布谷鸟寻找鸟窝下蛋的寻找路径是采用早已就有的萊维飞行3,如上…

布谷鸟算法浅谈与简单应用

简介 布谷鸟算法是由剑桥大学Xin-She Yang教授和S.Deb于2009年提出的一种新兴的启发算法,是一种通过模拟自然界当中布谷鸟(也就是杜鹃,故该算法也称为杜鹃算法)在繁育后代的行为而提出的一种搜索算法。 本文章将以在工程实践当中…

布谷鸟搜索算法学习

0、引言 布谷鸟搜索算法(Cuckoo Search, CS)是2009年Xin-She Yang 与Suash Deb在《Cuckoo Search via Levy Flights》一文中提出的一种优化算法。布谷鸟算法是一种集合了布谷鸟巢寄生性和莱维飞行(Levy Flights)模式的群体智能搜索…

布谷鸟搜索算法

布谷鸟搜索(Cuckoo Search,缩写 CS),也叫杜鹃搜索,是由剑桥大学杨新社(音译自:Xin-She Yang)教授和S.戴布(S.Deb)于2009年提出的一种新兴启发算法。 1.定义 …

优化算法|布谷鸟算法原理及实现

布谷鸟算法 一、布谷鸟算法背景知识二、布谷鸟算法思想简介三、布谷鸟算法流程四、布谷鸟算法的Python实现五、布谷鸟算法matlab实现 一、布谷鸟算法背景知识 2009年,Xin-She Yang 与Suash Deb在《Cuckoo Search via Levy Flights》一文中提出了布谷鸟算法(简称CS)…

CS_2022_01

2022-1-3 08:33:52 用OBS录完之后的视频是mkv格式的,PR不支持mkv格式的视频,于是需要转码,一开始用FFmpeg,有点不方便,但是也能用。后来一看OBS原本自带转码工具。 发现过程: 打开OBS,点击左下角…

CSP-S 2020

[CSP-S2020] 动物园 题目描述 动物园里饲养了很多动物,饲养员小 A 会根据饲养动物的情况,按照《饲养指南》购买不同种类的饲料,并将购买清单发给采购员小 B。 具体而言,动物世界里存在 2 k 2^k 2k 种不同的动物,它…

cs231n(1)

图像分类 目标:已有固定的分类标签集合,然后对于输入的图像,从分类标签集合中找出一个分类标签,最后把分类标签分配给该输入图像。 图像分类流程 输入:输入是包含N个图像的集合,每个图像的标签是K种分类标…

CS61A 02

Control Expressions evaluate to values Statements perform actions print(print(1), print(2))1 2 None None Boolean Expressions T and F False values: False, None, 0, ‘’ True values: everything else Operators and, or, not True and 5 2 and 88 False …

CS224N 2019 Assignment 2

Written: Understanding word2vec Let’s have a quick refresher on the word2vec algorithm. The key insight behind word2vec is that ‘a word is known by the company it keeps’. Concretely, suppose we have a ‘center’ word c c c and a contextual window surr…

【CS231N】

损失函数和后向传播 铰链损失函数:SVM常用,打击和正确结果相似度高的错误答案 正则化:获得更简单的模型,获得更平均的模型,避免过拟合(绿色线) Softmax:先指数计算(去除负…

Stanford CS230深度学习(一)

斯坦福CS230可以作为深度学习的入门课,最近我也在跟着看视频、完成编程作业。首先列出使用的资源链接,然后给出第一课的理解和编程作业的代码。 所有资料如下: 一、课程连接: b站课堂讲授版:Stanford CS230(吴恩达 …

csp-202206

202206 题目一:归一化处理【100分】题目二:寻宝!大冒险!【100分】题目三:角色授权【100分】题目四:光线追踪【15分】 题目一:归一化处理【100分】 水题,直接上 AC代码: …

cs229-1

本文全部参考自https://blog.csdn.net/stdcoutzyx?typeblog,仅作学习使用 文章目录 监督学习supervised learning线性回归局部加权回归LWR,Locally/Loess Weighted Regression最小二乘法的概率解释逻辑斯蒂回归logistic regression感知器算法牛顿方法NewTons Metho…

CS231n_learn

CS231n CS 程序:https://cs.stanford.edu/people/karpathy/convnetjs/demo/cifar10.html CS 课件http://cs231n.stanford.edu/slides/2017/: CS 课程首页:http://cs231n.stanford.edu/ CS 附带教程网页版:https://cs.stanford…

csp-202203

202203 题目一&#xff1a;未初始化警告【100分】题目二&#xff1a;出行计划【100分】题目三&#xff1a;计算资源调度器 【100分】 题目一&#xff1a;未初始化警告【100分】 简单数组操作题 #include<iostream> using namespace std; int n,k; bool ready[10000000]…

【CS231n系列】

Stanford-cs231n课程学习笔记&#xff08;一&#xff09; Stanford课程原版是英文&#xff0c;奈何本人英语菜的一批。原版网站放在下面&#xff0c;xdm可以多多学习。BUT&#xff01; B站up<同济子豪兄>yyds好吧&#xff01;&#xff01;&#xff01; Stanford231n 文章…