布谷鸟搜索算法学习

article/2025/10/5 7:52:08

0、引言
布谷鸟搜索算法(Cuckoo Search, CS)是2009年Xin-She Yang 与Suash Deb在《Cuckoo Search via Levy Flights》一文中提出的一种优化算法。布谷鸟算法是一种集合了布谷鸟巢寄生性和莱维飞行(Levy Flights)模式的群体智能搜索技术,通过随机游走的方式搜索得到一个最优的鸟巢来孵化自己的鸟蛋。这种方式可以达到一种高效的寻优模式。
基于对布谷鸟此习性的观察和模仿,提出了布谷鸟搜索算法。本文对布谷鸟搜索算法进行介绍;分析布谷鸟搜索算法的优缺点并与粒子群算法、蜂群算法、蚁群算法进行对比;最后在python语言环境下利用布谷鸟搜索算法解决二元二次方程最大值的求解。

1.布谷鸟搜索算法基本原理
1.1布谷鸟的巢寄生性
布谷鸟最特殊的习性是寄巢产卵。由于其本身没有孵化行为,大自然中有一些布谷鸟会将自己的卵产在寄生鸟巢中,依靠养父母孵化和育雏。为了不被寄主察觉,大布谷鸟在产卵前,会把寄主一枚或数枚卵移走,使得巢穴中卵的数量相等或相近。而当寄主发现鸟巢中陌生的卵。这是,寄主鸟类会丢弃布谷鸟所产的卵,或直接重新筑巢。
在布谷鸟搜索算法中有三个基本假设:
1.每只布谷鸟一次只产一枚卵,并且随机选择一个鸟巢存放;
2.在寻窝的过程中,卵最好的鸟巢将会被保留到下一代;
3.可用鸟巢的数量是固定的,并且设鸟巢中外来卵被发现的概率是P,P∈[0,1]。如果发现外来鸟蛋,则鸟窝主人重新建立一个鸟窝。
基于以上三个假设,可以认为,鸟窝和卵用来指代待求解问题的解,卵是否能够被宿主鸟孵化并茁壮成长,是衡量解好坏的唯一标准。布谷鸟寻找鸟窝下蛋的过程就是在n维空间内寻找解的过程,鸟窝的好坏象征着解的好坏。

1.2莱维飞行
在自然界中,动物会以随机或准随机的方式寻找食物。一般来说,是根据当前的位置或状态和到下一个位置的转移概率而做出下一次移动,因此动物的觅食过程实际上是随机行走,其选取的方向可以用数学建模方法来表示。例如,大量实验表明,动物界中许多如信天翁、蜜蜂等动物的寻觅食物轨迹符合莱维飞行的典型特征。
莱维飞行是一类非高斯随机过程,其平稳增量服从莱维稳定分布。在飞行过程中,步长较小的短距离行走与偶尔较大步长的长距离行走相互交替,有利于增加种群多样性、扩大搜索范围,不至于陷入局部最优。
图1.模拟莱维飞行轨迹示意图图1.模拟莱维飞行轨迹示意图

1.3 布谷鸟搜索算法的实现过程
根据布谷鸟的孵化鸟蛋的过程,布谷鸟搜索算法描述如下:
步骤1 定义目标函数,对搜索函数初始化,并随机生成n个鸟窝的初始位置,设置种群规模、问题维数、最大发现概率P和最大迭代次数等参数;
步骤2 选择适应度函数(目标函数)并计算每个鸟窝位置的目标函数值,得到当前的最优函数值;
步骤3 记录上一次最优函数值,利用莱维飞行对其他鸟窝的位置和状态进行更新;
步骤4 现有位置函数值与上一代最优函数值进行比较,若较好,则改变当前最优值;
步骤5 通过位置更新后,用随机数r∈[0,1]与最大发现概率P进行比较,若r<P,则对该巢的位置进行随机改变,反之则不变,最后保留最好的一组鸟窝位置;
步骤6 若未达到最大迭代次数或最小误差要求,则返回步骤2,否则,继续下一步;
步骤7 输出全局最优位置。

2.算法优缺点分析及对比:
CS算法与遗传算法(GA)、蚁群算法(ACO)、粒子群算法(PSO)、蜂群算法(ABC)等均属于群只能优化算法,它们皆为基于种群,借助迭代来实现优化步骤的概率搜索算法。总结与对比了这5种算法的优点、缺点以及适合求解的问题,结果如表1所示:
表1 CS于GA、ACO、PSO、ABC算法的比较在这里插入图片描述

虽然GA、ACO、PSO和ABC的研究及应用比较成熟,但从表1可知,CS算法在参数数目、全局寻优能力等方面综合优势更大,算法可灵活地跟其他算法进行多种组合,并具有更广泛的适用性。CS算法作为后起之秀,它的优越性使其广泛应用于各个研究领域。
3.实验仿真:
本实验采用python编程语言,基于tensorflow框架进行。Python版本为3.7.6,anaconda版本为4.8.3,tensorflow版本为2.1.0,scipy版本为1.4.1,numpy版本为1.18.3。本实验要解决的问题为,在x∈[-3,3],y∈[-3,3]的情况下,寻找能使-(x-1)2-(y+2)2取到最大值的x值和y值。
假设同时可以存在25个布谷鸟寄生鸟巢,布谷鸟蛋被寄主鸟发现的概率为0.25,迭代次数为100次,可以得到实验结果如图2所示:
在这里插入图片描述
图2. 实验结果图
通过观察实验结果,发现该程序可以较好的完成令目标函数取最大值的参数寻优,所得到的结果较为精确。
实验的全部代码见附录。
4.结论
①布谷鸟搜索算法具有很好的全局搜索能力,能够很好的解决实验中遇到的连续型优化问题,但是在离散优化问题上,难以解决,需要进一步优化该算法,才能够解决离散优化问题。
②针对文中所设置的实验,布谷鸟算法能够很好的解决该优化问题,适合进一步优化和开发。
5.心得体会与收获
布谷鸟搜索算法是一种新型元启发式搜索算法,具有十分广阔的研究前景。与其他群智能算法相比,其优越性已被众多学者认可,不仅表现出鲁棒性强、通用性好等优点,还具有可移植性,平台无关性等强大的活力。为我后续的课程学习和课题研究打下了坚实的基础。
6.附录

import numpy as np
import scipy.special as sc_specialdef levy_flight(n, m, beta):sigma_u = (sc_special.gamma(1+beta) * np.sin(np.pi*beta/2) / (sc_special.gamma ((1+beta)/2) * beta * (2**((beta-1)/2))))**(1/beta)sigma_v = 1u =  np.random.normal(0, sigma_u, (n, m))v = np.random.normal(0, sigma_v, (n, m))steps = u/((np.abs(v))**(1/beta))
return stepsdef fit_func(nest):x, y = nest        #一个*表示乘号,连续两个*表示次方#return 3*(1-x)**2*np.e**(-x**2-(y+1)**2) - 10*(x/5-x**3-y**5)*np.e**(-x**2-y**2) - (np.e**(-(x+1)**2-y**2))/3return -(x-1)**2-(y+2)**2def calc_fitness(fit_func, nests): n, m = nests.shapefitness = np.empty(n)for each_nest in range(n):fitness[each_nest] = fit_func(nests[each_nest])
return fitnessdef abandon_nests(nests, lower_boundary, upper_boundary, pa):lower_boundary = np.array(lower_boundary)upper_boundary = np.array(upper_boundary)n, m = nests.shapefor each_nest in range(n):if (np.random.rand() < pa):step_size = np.random.rand() * (nests[np.random.randint(0, n)] - nests[np.random.randint(0, n)])nests[each_nest] += step_size# apply boundary condtions 应用边界条件nests[each_nest][nests[each_nest] < lower_boundary] = lower_boundary[nests[each_nest] < lower_boundary]nests[each_nest][nests[each_nest] > upper_boundary] = upper_boundary[nests[each_nest] > upper_boundary]
return nestsdef update_nests(fit_func, lower_boundary, upper_boundary, nests, best_nest, fitness, step_coefficient):lower_boundary = np.array(lower_boundary)upper_boundary = np.array(upper_boundary)n, m = nests.shapesteps = levy_flight(n, m, 1.5)new_nests = nests.copy()for each_nest in range(n):step_size = step_coefficient * steps[each_nest] * (nests[each_nest] - best_nest)step_direction = np.random.rand(m)new_nests[each_nest] += step_size * step_directionnew_nests[each_nest][new_nests[each_nest] < lower_boundary] = lower_boundary[new_nests[each_nest] < lower_boundary]new_nests[each_nest][new_nests[each_nest] > upper_boundary] = upper_boundary[new_nests[each_nest] > upper_boundary]new_fitness = calc_fitness(fit_func, new_nests)nests[new_fitness > fitness] = new_nests[new_fitness > fitness]
return nestsdef generate_nests(n, m, lower_boundary, upper_boundary):lower_boundary = np.array(lower_boundary)upper_boundary = np.array(upper_boundary)nests = np.empty((n, m))for each_nest in range(n):nests[each_nest] = lower_boundary + np.array([np.random.rand() for _ in range(m)]) * (upper_boundary - lower_boundary)
return nestsdef cuckoo_search(n, m, fit_func, lower_boundary, upper_boundary, iter_num = 100,pa = 0.25, beta = 1.5, step_size = 0.1):
nests = generate_nests(n, m, lower_boundary, upper_boundary)fitness = calc_fitness(fit_func, nests)best_nest_index = np.argmax(fitness)best_fitness = fitness[best_nest_index]best_nest = nests[best_nest_index].copy()for i in range(iter_num):nests = update_nests(fit_func, lower_boundary, upper_boundary, nests, best_nest, fitness, step_size)nests = abandon_nests(nests, lower_boundary, upper_boundary, pa)fitness = calc_fitness(fit_func, nests)max_nest_index = np.argmax(fitness)max_fitness = fitness[max_nest_index]max_nest = nests[max_nest_index] if (max_fitness > best_fitness):best_nest = max_nest.copy()best_fitness = max_fitness
return (best_nest, best_fitness)if __name__=='__main__':best_nest, best_fitness = cuckoo_search(25, 2, fit_func, [-3, -3], [3, 3], step_size = 0.4)print('最大值为:%.5f, 在(%.5f, %.5f)处取到!'%(best_fitness, best_nest[0], best_nest[1]))

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

相关文章

布谷鸟搜索算法

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

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

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

CS_2022_01

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

CSP-S 2020

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

cs231n(1)

图像分类 目标&#xff1a;已有固定的分类标签集合&#xff0c;然后对于输入的图像&#xff0c;从分类标签集合中找出一个分类标签&#xff0c;最后把分类标签分配给该输入图像。 图像分类流程 输入&#xff1a;输入是包含N个图像的集合&#xff0c;每个图像的标签是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】

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

Stanford CS230深度学习(一)

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

csp-202206

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

cs229-1

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

CS231n_learn

CS231n CS 程序&#xff1a;https://cs.stanford.edu/people/karpathy/convnetjs/demo/cifar10.html CS 课件http://cs231n.stanford.edu/slides/2017/&#xff1a; CS 课程首页&#xff1a;http://cs231n.stanford.edu/ CS 附带教程网页版&#xff1a;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 文章…

斯坦福CS230官方指南:CNN、RNN及使用技巧速查(打印收藏)

向AI转型的程序员都关注了这个号&#x1f447;&#x1f447;&#x1f447; 机器学习AI算法工程 公众号&#xff1a; datayx 作为全球计算机四大名校之一&#xff0c;斯坦福大学的CS230《深度学习》课程一直受到全球计算机学子和从业人员的热烈欢迎。 CS230授课人为全球著名计算…

CS230学习笔记(一)

CS230学习笔记(一) 1.前言 ok&#xff0c;前思后想&#xff0c;左思右想&#xff0c;我还是觉得自己得督促一下自己&#xff0c;所以&#xff0c;我觉得开始更新cs230的笔记&#xff0c;当然&#xff0c;我前面的六篇pytorch学习笔记我是不会放着不管的&#xff0c;后面肯定会…

目标检测(CS230)

内容来自CS230课程。 目录 目标定位&#xff08;Object localization&#xff09; 特征点检测&#xff08;Landmark detection&#xff09; 基于滑动窗口的目标检测算法 滑动窗口的卷积实现 &#xff08;Convolutional implementation of sliding windows&#xff09; 网络中的…

PHP配置环境变量

1.找到“高级系统设置”&#xff08;二选一的方法找到环境变量&#xff09; ① 我的电脑-属性-高级-环境变量 ②win8,10 直接在搜索框搜 “查看高级系统设置”-环境变量 2.找到变量"Path" ①加上 “E:\phpStudy\PHPTutorial\php\php-7.0.12-nts” &#xff08;php.e…

PHPstudy 设置PHP为环境变量

1.首先启动phpstudy点击‘切换版本’查看当前使用环境的php版本 2.在右键点击桌面的phpstudy图标进入文件夹位置 2.点击PHPTutorial->PHP 3.点击你的开发版本的php文件&#xff0c;我们会看到php.exe文件&#xff0c;复制当前文件位置路径 4.右键点击计算机或者我的电脑选择…

windows环境下设置多个PHP版本的环境变量

windows环境下设置多个PHP版本的环境变量 所在位置修改系统变量修改用户变量重启电脑 所在位置 我的电脑->属性->高级系统设置->高级->环境变量 根据图示&#xff0c;找到相应的变量 修改系统变量 环境变量->系统变量->Path 系统变量&#xff1a;把两个…