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

article/2025/10/5 7:49:47

目录

基本概念

算法具体流程

         算法流程图

测试函数

优化结果

visual studio2017C++代码


基本概念

布谷鸟搜索算法(Cuckoo Search,缩写 CS)是由剑桥大学杨新社教授和S.戴布于2009年提出的一种新兴启发算法。根据昆虫学家的长期观察研究发现,一部分布谷鸟以寄生的方式养育幼鸟,它们不筑巢,而是将自己的卵产在其他鸟的巢中(通常为黄莺、云雀等),由其他鸟(义亲)代为孵化和育雏。然而,如果这些外来鸟蛋被宿主发现,宿主便会抛弃这些鸟蛋或新筑鸟巢。

通俗理解就是,布谷鸟蛋找到能成功在其他鸟巢成功孵化这个过程就是寻优过程。布谷鸟算法源于对布谷鸟繁育行为的模拟,为了简化自然界中布谷鸟的繁衍习性,Yang 等将布谷鸟的产卵行为假设为3个理想状态。

  1. 布谷鸟一次只产一个卵,并随机选择鸟窝位置来孵化它。
  2. 在随机选择的一组鸟窝中,最好的鸟窝将会被保留到下一代。
  3. 可选择的寄生巢的数量固定的,寄生巢主人发现外来鸟蛋的概率为pa,其中 0\leq pa\leqslant 1

基于这 3 个理想状态,Yang 等采用式(1)对下代鸟巢位置X_{i}^{t+1}进行更新

                                      X_{i}^{t+1}=X_{i}^{t}+\alpha \bigotimes Levy(\lambda )                                           (1)

式中: X_{i}^{t}表示第i(i=1,2,3,...,n)个鸟巢在第t代的位置;\bigotimes 表示点对点乘法; \alpha表示步长控制量,用来控制步长大小,通常情况下,取\alpha=1Levy(\lambda )为Levy随机搜索路径,属于随机行走,采用莱维飞行机制,其行走的步长满足一个重尾的稳定分布,而随机步长为levy分布:

                                     Levy:\mu =t^{-\lambda },1\leq \lambda \leqslant 3                                               (2)

基本布谷鸟搜索算法先按照式(1)对下一代的鸟巢位置进行更新,并且计算目标函数的适应度值,如果该值优于上一代的目标函数值,则更新鸟巢位置,否则保持原来位置不变。通过位置更新后,用随机产生的服从 0 到 1 均匀分布的数值𝑅与鸟巢主人发现外来鸟蛋的概率pa相比较,若R>pa,则X_{i}^{t+1}对进行随机改变,反之不变。最后保留测试值较好的一组鸟窝位置 X_{i}^{t+1},记为X_{i}^{t+1} 。判断算法是否满足设置的最大迭代次数:若满足,结束迭代寻优,输出全局最优值fmin  ;否则,继续迭代寻优。该算法具有全局探索局部开发性能的平衡以及种群的多样性

算法具体流程

Step 1(初始化)确定目标函数f(x),X=(x_{1},...,x_{d})^{T}初始化群体,随机产生n个鸟窝的初始位置X_{i}(i=1,2,...,n)设置算法参数:种群规模N、维度D、发现概率pa、界值大小L、最大迭代次数MaxN、最优鸟窝位置X_{best}^{0}和最优解f_{min} 。

Step 2(循环体)按式(1)、(2)更新当代鸟窝的位置;将当代鸟窝与上一代鸟窝位置P_{t-1}=\left [ X_{1}^{t-1} ,X_{2}^{t-1},...,X_{n}^{t-1} \right ]^{T}进行对比,用适应度值较好的鸟窝位置替换适应度值较差的鸟窝位置:g_{t}=\left [ X_{1}^{t} ,X_{2}^{t},...,X_{n}^{t} \right ]^{T}

Step 3(循环体)用随机数𝑅作为鸟窝主人发现外来鸟蛋的可能性,将其与鸟被淘汰的概率pa进行比较。若𝑅 >pa则随机改变 g_{t}中的鸟窝位置,得到一组新的鸟窝位置。再更新鸟窝位置,得到一组较好的鸟窝位置:p_{t}=\left [ X_{1}^{t} ,X_{2}^{t},...,X_{n}^{t} \right ]^{T}。更新最优鸟窝位置X_{best}^{t}和最优解f^{t}_{min}

Step 4 判断算法是否满足设置的最大迭代次数:若满足,结束搜索过程,输出全局最优值f_{min},否则,重复step2进行迭代寻优

算法流程图

测试函数

优化变量:x_{1},x_{2}

约束条件:x_{low}=\left \{ -2,-2 \right \},x_{high}=\left \{ 2,2 \right \}

目标函数:f(x)=\left [ 1+(x_{1}+x_{2}+1)^{2} (19-14x_{1}+3x_{1}^{2}-14x_{2}+6x_{1}x_{2}+3x_{2}^{2})\right ]\times \left [ 30+(2x_{1}-3x_{2})^{2} (18-32x_{1}+12x_{1}^{2}+48x_{2}-36x_{1}x_{2}+27x_{2}^{2})\right ]

式中, Goldstein-Price函数f(x)是一个二元八次多项式,作为常见的算法测试函数,许多科研人员利用它研究其局部最小值。上式为该优化问题的数学优化模型,该函数的理论结果为在(0,-1)处取得最小值3。

优化结果

 从上图可以看出,布谷鸟搜索算法优化最小值为3.02573,迭代400次用时2.119s。

visual studio2017C++代码

头文件:

//布谷鸟搜索算法
//开发人员:chenshuai      开发日期:2019.11.25  邮箱:chenshuai0614@hrbeu.edu.cn 
//************************************************************************************//
//布谷鸟算法参数设定
//************************************************************************************//
#ifndef PCH_H
#define PCH_H
#include <iostream>
# include <fstream>
#include <iomanip>
#include <math.h>
#include <cstdlib> // 标准库
#include <ctime> // 时间库
#include <vector> //容器头文件
#include<random>
#define  PI    3.1415926535897    //π值
using namespace std;
//产生随机小数或整数
class RandomNumber {
public:RandomNumber() {srand((unsigned)time(NULL));    //析构函数,在对象创建时数据成员执行初始化操作}int integer(int begin, int end){return rand() % (end - begin + 1) + begin;}double decimal(double a, double b){return double(rand() % 10000) / 10000 * (b - a) + a;}
};
class cs {
private:int N_nest;//种群(布谷鸟巢总数)int Max_iteration;//最大迭代次数,int D_egg;//变量个数(布谷鸟蛋维数)double pa;//布谷鸟蛋被发现的概率double cs_alpha;//步长控制量double R;  //随机数R
public:double lambda;vector<double>fmin;                      //最优解vector<vector<double>>f_nest;            //鸟窝的适应度值vector<vector<double>>p_t;              //与上一代比较后最优的鸟窝种群vector<vector<double>>g_t;              //被发现之后,更新的最优鸟窝种群vector<double>nest_best;        //最好的鸟窝vector<double>nest_low = { -2,-2 };   //储存变量上限值  (鸟窝的上限)vector<double>nest_high = { 2,2 };   //储存变量下限值   (鸟窝的下限)//*******************************************////定义函数//*******************************************//void setParameters();//设置算法参数int N_nest,int Max_iteration,int D_egg,double cs_alphavoid initialize();                //初始化double select_optimal(vector<vector<double>>x);            //选择最优的鸟巢double fit_function(vector<double> x); //目标函数vector<vector<double>> update_Levyflight(vector<vector<double>>x, int t);//莱维飞行更新鸟窝位置vector<vector<double>> update_Rrandomnumber(vector<vector<double>>x);//随机数R更新鸟窝位置
};#endif //PCH_H

函数文件:

#include "pch.h"
//***********************************************
//设置布谷鸟算法参数
//**********************************************
void cs::setParameters()
{N_nest = 100; //种群(布谷鸟巢总数)Max_iteration = 400;//最大迭代次数,D_egg = 2;//变量个数(布谷鸟蛋维数)pa = 0.25;//布谷鸟蛋被发现的概率cs_alpha = 1.0;//步长控制量
}
//**********************************************
//初始化群体,N个鸟窝的初始位置
//**********************************************
void cs::initialize()
{extern RandomNumber r;       //定义随机数fmin.resize(Max_iteration);p_t.resize(N_nest, vector<double>(D_egg));g_t.resize(N_nest, vector<double>(D_egg));f_nest.resize(Max_iteration, vector<double>(N_nest));nest_best.resize(D_egg);for (int i = 0; i < N_nest; i++){for (int j = 0; j < D_egg; j++){p_t[i][j] = r.decimal(nest_low[j], nest_high[j]);//初始化鸟窝的值}}
}
//***********************************************
//鸟窝位置的适应度
//**********************************************
double cs::fit_function(vector<double>x)
{double fx = 0;//Rastrigin函数/*for (int i = 0; i < 2; i++){fx = fx + x[i] * x[i] - 10 * cos(2 * PI*x[i]) + 10;}*///Goldstein	-Price函数fx = (1 + pow((1 + x[0] + x[1]), 2)*(19 - 14 * x[0] + 3 * x[0] * x[0] - 14 * x[1] + 6 * x[0] * x[1] + 3 * x[1] * x[1]))*(30 + pow((2 * x[0] - 3 * x[1]), 2)*(18 - 32 * x[0] + 12 * x[0] * x[0] + 48 * x[1] - 36 * x[0] * x[1] + 27 * x[1] * x[1]));//SiX-Hump Camel函数//fx = 4 * x[0] * x[0] - 2.1*pow(x[0], 4) + 1.0 / 3.0*pow(x[0], 6) + x[0] * x[1] - 4 * x[1] * x[1] + 4 * pow(x[1], 4);return fx;
}
//**********************************************
//计算每个鸟窝的目标函数值并记录当前的最优解
//**********************************************
double cs::select_optimal(vector<vector<double>>x)
{double fmin = 0;fmin = fit_function(x[0]);for (int i = 1; i < N_nest; i++){if (fmin > fit_function(x[i])){fmin = fit_function(x[i]);for (int j = 0; j < D_egg; j++){nest_best[j] = x[i][j];}}}return fmin;
}
//**********************************************
//随机数R更新鸟窝位置
//**********************************************
vector<vector<double>> cs::update_Rrandomnumber(vector<vector<double>>x)
{extern RandomNumber r;       //声明全局随机数for (int j = 0; j < N_nest; j++){for (int k = 0; k < D_egg; k++){R = r.decimal(0, 1);if (R > pa){x[j][k] = r.decimal(nest_low[k], nest_high[k]);}}}return x;
}
//**********************************************
//莱维飞行更新每个鸟窝的位置
//**********************************************
vector<vector<double>> cs::update_Levyflight(vector<vector<double>>x, int t)
{extern RandomNumber r;       //声明全局随机数for (int j = 0; j < N_nest; j++){for (int k = 0; k < D_egg; k++){lambda = r.decimal(1, 3);x[j][k] = x[j][k] + cs_alpha * pow(t, -1 * lambda);if (x[j][k]< nest_low[k] || x[j][k] > nest_high[k]){x[j][k] = r.decimal(nest_low[k], nest_high[k]);}}}return x;
}

主函数:

#include "pch.h"
#include <iostream>
RandomNumber r;       //随机数
int main()
{clock_t startTime, endTime; //定义程序开始运行时间和结束时间startTime = clock();  //计时开始cs CS;          //定义布谷鸟种群CS.setParameters();//设置算法参数CS.initialize(); //初始化CS.fmin[0] = CS.select_optimal(CS.p_t);//选择初代最优个体cout << CS.fmin[0] << endl;//循环体ofstream out("布谷鸟算法优化结果.txt");for (int i = 1; i < size(CS.fmin); i++){CS.p_t = CS.update_Levyflight(CS.p_t, i);  //莱维飞行更新鸟窝的位置CS.fmin[i] = CS.select_optimal(CS.p_t);if (CS.fmin[i] > CS.fmin[i - 1]){CS.fmin[i] = CS.fmin[i - 1];}CS.p_t = CS.update_Rrandomnumber(CS.p_t);//随机数R发现更新鸟窝的位置if (CS.fmin[i] > CS.select_optimal(CS.p_t)){CS.fmin[i] = CS.select_optimal(CS.p_t);}out << i << fixed << setw(12) << setprecision(5) << CS.fmin[i] << endl;}out << "最优变量:" << endl;for (int ii = 0; ii < size(CS.nest_best); ii++){out << "x" << ii << "=" << fixed << setw(12) << setprecision(5) << CS.nest_best[ii] << endl;//输出最优变量}out << "最优值=" << fixed << setw(12) << setprecision(5) << CS.fmin[size(CS.fmin) - 1] << endl;endTime = clock();//计时结束out << "run time:" << (double)(endTime - startTime) / CLOCKS_PER_SEC << "s" << endl;
}

各位阅读文章的朋友觉得文章可以给个好评或者点赞,大家觉得有问题可以指出来或者发邮箱chenshuai0614@hrbeu.edu.cn联系我!如需要转载请附上链接,谢谢各位朋友!

 


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

相关文章

布谷鸟算法

布谷鸟算法是将布谷鸟育雏行为与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…

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; 网络中的…