布谷鸟算法(C++实现)

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

算法思想

布谷鸟鸟群最终只有最健康的蛋才能孵化出来。
布谷鸟群每只鸟都在拼命寻找好巢穴以达到下最健康的蛋的母的。

算法步骤

在这里插入图片描述

步骤一 初始化

初始化布谷鸟种群数量(鸟窝个数),计算各个鸟窝(解)的函数适应值,并保存最好的鸟窝(当前最优解)。

步骤二 循环体

算法主体的位置更新包含两个,一个是莱维飞行局部随机行走

莱维飞行

在这里插入图片描述

莱维飞行是由较长时间的短步长和较短时间的长步长组成
Levy分布就是小概率值较大和大概率值较小,和自然界中大多数动物觅食方式方式类似,也就是先找到一片区域再细致的查找猎物,如果没找到,就换一片区域找。

在这里插入图片描述
布谷鸟算法使用 Mantegna 算法来实现对称的 Lévy 稳定分布。
在这里插入图片描述

局部随机行走

在宿主鸟发现布谷鸟蛋时,布谷鸟去寻找新的寄生巢时的位置更新。

在这里插入图片描述
a是步长缩放因子。

循环体 步骤(1)位置更新

在这里插入图片描述
注意:
1.保留上代最优鸟窝位置,其余布谷鸟进行莱维飞行寻找寄宿鸟窝,此处可利用小技巧,如下方让 Lévy 稳定分布乘以系数
(i.x - OldNestPop[bestNum].x),当鸟窝是最优解时,此系数为0,避免丢失最优鸟窝位置。

double stepX = (i.x - OldNestPop[bestNum].x) * R(e) / (pow(abs(R1(e)), 1 / beta));
double stepY = (i.x - OldNestPop[bestNum].x) * R(e) / (pow(abs(R1(e)), 1 / beta));

2.布谷鸟群新寄生一组鸟窝群,与原来的鸟窝群对比,替换原来适应度较差的鸟窝,布谷鸟群只守护适应度高的鸟窝。

循环体 步骤(2)存安去险

在这里插入图片描述
注意:
1.布谷鸟群守护的寄生鸟窝的原宿主会跟布谷鸟打架,布谷鸟如果打不过,这只布谷鸟就会在这个鸟巢附近随机寻找一个新
鸟巢下蛋,并守护。(布谷鸟打不过的概率一般是Pa = 0.25)。
正规说法如下图。
在这里插入图片描述
2.布谷鸟群对更新后的鸟窝群里的布谷鸟蛋进行检测,选出最健康的蛋(找出更新后的当前最优解)。

步骤三 终止条件

在这里插入图片描述

应用举例

以下是对一个二维函数求最小值的C++程序:
此函数为
在这里插入图片描述
此函数图像
在这里插入图片描述
算法结果图

在这里插入图片描述
在这里插入图片描述

C++程序如下

#include <iostream>
#include <vector>
#include <cmath>
#include <random>
#include <time.h>
#include <fstream>
#define pi acos(-1)
//5只布谷鸟
constexpr int NestNum = 40;	
//pi值
//规定X,Y 的取值范围
constexpr double X_max = 5;
constexpr double X_min = 0;
constexpr double Y_max = 5;
constexpr double Y_min = 0;
//最大迭代次数
constexpr int MaxIterationTimes = 300;
//被宿主发现的概率
constexpr double Pa = 0.25;//自变量结构体
struct Nest {double x;double y;double fitness;
};
void fitFunc(Nest& nest);
int findBetterNest(std::vector<Nest>&);
std::vector<Nest> levy(std::vector<Nest> OldNestPop, std::size_t bestNum);
std::vector<Nest> RandomAbandonPaNestPop(std::vector<Nest> OldNestPop);
//随机数引擎
static std::default_random_engine e(time(0));
static std::uniform_real_distribution<double> u(0, 1);
int main(void)
{bool flag_output = false;double Xold;double Xnew;double Yold;double Ynew;std::ofstream outfileX("D:\\cuckoo\\cuckooX.txt");std::ofstream outfileY("D:\\cuckoo\\cuckooY.txt");std::ofstream outfileZ("D:\\cuckoo\\cuckooZ.txt");//现在的鸟巢群std::vector<Nest> current_nestPop;//迭代次数int num = 0;//最优鸟巢int BestNestCurrent;	//初始化for (int i = 0; i < NestNum; ++i){Nest nestinitial;nestinitial.x = (X_max - X_min) * u(e) + X_min;nestinitial.y = (Y_max - Y_min) * u(e) + Y_min;fitFunc(nestinitial);current_nestPop.push_back(nestinitial);}//for (auto i : nestPop)//{//	std::cout << i.fitness << std::endl;//}//寻找最优个体BestNestCurrent = findBetterNest(current_nestPop);outfileX << current_nestPop[BestNestCurrent].x << std::endl;outfileY << current_nestPop[BestNestCurrent].y << std::endl;outfileZ << current_nestPop[BestNestCurrent].fitness << std::endl;while (num < MaxIterationTimes){//储存上次的最优解的X,YXold = current_nestPop[BestNestCurrent].x;Yold = current_nestPop[BestNestCurrent].y;//levy飞行--位置更新std::vector<Nest> NewNestPop = levy(current_nestPop, BestNestCurrent);//用适应值较好的鸟窝位置替换适应值较差的鸟窝位置for (decltype(NewNestPop.size()) i = 0; i < NewNestPop.size(); ++i){if (i != BestNestCurrent && NewNestPop[i].fitness < current_nestPop[i].fitness){current_nestPop[i] = NewNestPop[i];}}//此时得到更优的鸟窝位置//存安去险 保留鸟窝中被发现概率较小的鸟窝位置,并随机改变发现概率较大的鸟窝位置NewNestPop = RandomAbandonPaNestPop(current_nestPop);for (decltype(NewNestPop.size()) i = 0; i < NewNestPop.size(); ++i){if (i != BestNestCurrent && NewNestPop[i].fitness < current_nestPop[i].fitness){current_nestPop[i] = NewNestPop[i];}}//此时得到更优的鸟窝位置BestNestCurrent = findBetterNest(current_nestPop);//现在的最优鸟巢位置Xnew = current_nestPop[BestNestCurrent].x;Ynew = current_nestPop[BestNestCurrent].y;if (Xnew != Xold || Ynew != Yold){outfileX << current_nestPop[BestNestCurrent].x << std::endl;outfileY << current_nestPop[BestNestCurrent].y << std::endl;}outfileZ << current_nestPop[BestNestCurrent].fitness << std::endl;/*std::cout << current_nestPop[BestNestCurrent].fitness << std::endl;std::cout << "(x,y)" << '(' << current_nestPop[BestNestCurrent].x << ',' << current_nestPop[BestNestCurrent].y << ')' << std::endl;*///outfileX << current_nestPop[BestNestCurrent].x << std::endl;//outfileY << current_nestPop[BestNestCurrent].y << std::endl;//outfileZ << current_nestPop[BestNestCurrent].fitness << std::endl;num++;}std::cout << current_nestPop[BestNestCurrent].fitness << std::endl;return 0;
}void fitFunc(Nest& nest)
{nest.fitness = -sin(nest.x) * pow(sin(nest.x * nest.x / pi), 20) - sin(nest.y) * pow(sin(2 * nest.y * nest.y / pi), 20);//nest.fitness = -(nest.x - 1) * (nest.x - 1) + 1;
}int findBetterNest(std::vector<Nest>& nestPop)
{int BestNum = 0;for (decltype(nestPop.size()) i = 0; i < nestPop.size(); ++i){if (nestPop[i].fitness < nestPop[BestNum].fitness){BestNum = i;}}return BestNum;
}std::vector<Nest> levy(std::vector<Nest> OldNestPop,std::size_t bestNum)
{double beta = 1.5;//	double alpha = 0.01 * R(e);//有的论文写double alpha = 0.4;double sigma_u = pow((tgamma(1 + beta) * sin(pi * beta / 2)) / (beta * tgamma((1 + beta) / 2) * pow(2, (beta - 1) / 2)), 1 / beta);double sigma_v = 1;static std::normal_distribution<double> R(0, sigma_u);static std::normal_distribution<double> R1(0, sigma_v);for (auto& i : OldNestPop) {//前面的系数是保证最优鸟巢不会进行levy飞行double stepX = (i.x - OldNestPop[bestNum].x) * R(e) / (pow(abs(R1(e)), 1 / beta));double stepY = (i.x - OldNestPop[bestNum].x) * R(e) / (pow(abs(R1(e)), 1 / beta));//按范围更新Xif (i.x + alpha * stepX > X_max){i.x = X_max;}else if(i.x + alpha * stepX < X_min){i.x = X_min;}else{i.x = i.x + alpha * stepX;}//按范围更新Yif (i.y + alpha * stepY > Y_max){i.y = Y_max;}else if (i.y + alpha * stepY < Y_min){i.y = Y_min;}else{i.y = i.y + alpha * stepY;}fitFunc(i);}return OldNestPop;
}std::vector<Nest> RandomAbandonPaNestPop(std::vector<Nest> OldNestPop)
{double step_sizeX = 0;double step_sizeY = 0;static std::uniform_int_distribution<int> randomInt(0, OldNestPop.size() - 1);for(decltype(OldNestPop.size()) i = 0;i < OldNestPop.size();++i){if (u(e) < Pa)//被宿主发现了,要重新寻找新巢{step_sizeX = u(e) * (OldNestPop[randomInt(e)].x - OldNestPop[randomInt(e)].x);step_sizeY = u(e) * (OldNestPop[randomInt(e)].y - OldNestPop[randomInt(e)].y);if (OldNestPop[i].x + step_sizeX > X_max){OldNestPop[i].x = X_max;}else if(OldNestPop[i].x + step_sizeX < X_min){OldNestPop[i].x = X_min;}else{OldNestPop[i].x += step_sizeX;}if (OldNestPop[i].y + step_sizeY > Y_max){OldNestPop[i].y = Y_max;}else if (OldNestPop[i].y + step_sizeY < Y_min){OldNestPop[i].y = Y_min;}else{OldNestPop[i].y += step_sizeY;}fitFunc(OldNestPop[i]);}}return OldNestPop;
}

算法改进

参考资料:
1.http://blog.sina.com.cn/s/blog_17470b8bb0102xjvg.html
2.https://blog.csdn.net/sj2050/article/details/98496868


http://chatgpt.dhexx.cn/article/3khMGuNp.shtml

相关文章

Python优化算法07——布谷鸟搜索算法

和前面的系列不同&#xff0c;布谷鸟这里没有现成的Python的包&#xff0c;使用我们需要自己写各种源码模块进行组合&#xff0c;达到布谷鸟搜索算法&#xff08;CS&#xff09;的功能。 这里的CS算法是面向过程的编程&#xff0c;都是自定义函数&#xff0c;不涉及类与对象。…

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

布谷鸟是比较新的启发式最优化算法,但其与传统的遗传算法,退火算法等相比,被证明收敛速度更快,计算效率更高! 文章目录 本文诞生的缘由布谷鸟算法思想简介更新位置的方式莱维飞行局部随机行走 抛出个栗子一些参数的建议完整的python实现运行结果参考文献 本文诞生的缘由 由于布…

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

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

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

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

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

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

布谷鸟算法

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

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

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

布谷鸟搜索算法学习

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

布谷鸟搜索算法

布谷鸟搜索&#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…