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

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

  • 1 从布谷鸟的育雏到布谷鸟算法
  • 2 布谷鸟算法
  • 3 萊维飞行与公式(1)的深层含义
  • 4 附:CS算法求解函数最小值代码
  • 5 源码下载
  • 6 参考文献


1 从布谷鸟的育雏到布谷鸟算法

这里写图片描述
布谷鸟不会做窝,也不会育雏,在春末夏初,向北飞,趁别的鸟(宿主鸟)外出觅食时,将卵蛋产在宿主鸟窝里,让宿主鸟抚养自己孩子 。当然,布谷鸟在产卵前,为了不被宿主鸟发现鸟窝的异常,会把宿主的卵移走。而一旦靠养母孵化的雏鸟,也有将宿主鸟本身的雏鸟推出巢穴的本性,并且会模仿其他鸟的行为来增大不被宿主鸟发现的概率1

2009年,Xin-She Yang2 与Suash Deb在《Cuckoo Search via Levy Flights》一文中提出了布谷鸟算法(简称CS)。假设每只布谷鸟一次只产一枚卵 ,并且宿主鸟发现外来鸟蛋后,就舍弃该鸟窝,另寻他地建造新的鸟窝 ,那么可以认为 :鸟窝=卵蛋=解,卵蛋是否能够成功被宿主鸟孵化并茁长成长是衡量解好坏的唯一标准 。布谷鸟寻找鸟窝下蛋的过程就是在D维空间中寻找解的过程 ,而鸟窝的好坏象征着解的好坏。

2 布谷鸟算法

布谷鸟算法是布谷鸟育雏行为和萊维飞行结合的一种算法 。
这里写图片描述
在CS算法中,有两个路径(或者说成是两个位置的更新)备受关注:

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

    Xt+1=Xt+αLevy(β) X t + 1 = X t + α ⨂ L e v y ( β ) , 公式(1)

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

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

    Xt+1=Xt+rHeaviside(Paϵ)(XiXj) X t + 1 = X t + r ⨂ H e a v i s i d e ( P a − ϵ ) ⨂ ( X i − X j ) , 公式(2)

    其中, r,ϵ r , ϵ 是服从均匀分布的随机数, Heaviside(x) H e a v i s i d e ( x ) 是跳跃函数(x>0,=1;x<0,=0) , Xi,Xj X i , X j 是其他任意的连个鸟窝。

CS算法的执行过程如下:
这里写图片描述

3 萊维飞行与公式(1)的深层含义

从数学的发展史上说,早在1937年, P. Levy6确定了对称Levy稳定分布的积分形式为 Levy(s)=1π+0exp(β|k|λ)cos(ks)dk L e v y ( s ) = 1 π ∫ 0 + ∞ e x p ( − β | k | λ ) c o s ( k s ) d k ,但是该积分并没有明确的解析,要生成一个服从该分布的随机数是难上加难的问题,不过当 ss0>0s s ≫ s 0 > 0 , 即 s → ∞ 时, Levy(s)λβΓ(λ)sin(πλ2)π.1s1+λ L e v y ( s ) ≈ λ β Γ ( λ ) s i n ( π λ 2 ) π . 1 s 1 + λ ,通常 β=1 β = 1 。这个近似的分布呈现幂律行为(重尾或长尾巴),这个行为类似于二八原则[^6],或者说少部分人集中了世界大部分的财富,正如下图所示的,这个分布总是有一个长尾巴或者称之为重尾巴,有时也叫做一个翼。
这里写图片描述

萊维飞行的方差随时间呈现指数的关系,即 σ2(t)t3β,1β3 σ 2 ( t ) ~ t 3 − β , 1 ≤ β ≤ 3 ,所以萊维飞行比布朗运动更加的出色。

此后,不少学者根据这个近似部分提出很多用于生成服从萊维分布的随机数的实现方法,其中就包含了Mantegna7在1994年提出的一种用正太分布求解随机数的方法,有时也叫Mantegna方法,生成服从萊维分布的随机步长的方法如下:

s=u|v|1β s = u | v | 1 β

其中, uN(0,σ2),vN(0,1) u ~ N ( 0 , σ 2 ) , v ~ N ( 0 , 1 ) , σ={Γ(1+β)sin(πβ2)βΓ(1+β2)2β12}1β σ = { Γ ( 1 + β ) s i n ( π β 2 ) β Γ ( 1 + β 2 ) 2 β − 1 2 } 1 β

在matlab中用Mantegna方法模拟二维平面萊维飞行:

% Mantegna方法模拟萊维飞行
%author zhaoyuqiang 
x = [0,0];
y = [0,0];
beta = 1.5;
sigma_u = (gamma(1+beta)*sin(pi*beta/2)/(gamma((1+beta)/2)*beta*2^((beta-1)/2)))^(1/beta);
sigma_v = 1;
for i=1:1000u = normrnd(0,sigma_u);v = normrnd(0,sigma_v);s = u/(abs(v))^(1/beta);x(:,1) = x(:,2);x(:,2) = x(:,1)+1*s;u = normrnd(0,sigma_u);v = normrnd(0,sigma_v);s = u/(abs(v))^(1/beta);y(:,1) = y(:,2);y(:,2) = y(:,1)+1*s;plot(x,y);hold on;
end
axis square;

这里写图片描述

从模拟上来看,图形的路径确实符合萊维飞行的长短相间的特征,Mantegna用正太分布实现了生成服从萊维分布随机步长的方法是可靠的 。

时间到了2009年,Xin-She Yang 与Suash Deb提出了布谷鸟算法,同时,Yang把Levy分布函数经过简化和傅立叶变换后得到其幂次形式的概率密度函数8 : Levyu=tβ,1β3 L e v y ~ u = t − β , 1 ≤ β ≤ 3 。并把萊维飞行用在了鸟窝位置的更新上,于是产生了公式(1) Xt+1=Xt+αLevy(β) X t + 1 = X t + α ⨂ L e v y ( β ) 。这个计算式其实就是 Xt+1=Xt+αS X t + 1 = X t + α S S S 就是服从Levy分布Levyu=tβ,1β3的随机步长,考虑到具体怎么计算时,Yang采用的正是1994年的Mantegna方法 。

所以在布谷鸟算法中,我们可以用下面的具体计算公式来计算鸟窝的更新位置:

Xt+1=Xt+αS=Xt+α.N(0,σ2)|N(0,1)|1β X t + 1 = X t + α S = X t + α . ∗ 服 从 N ( 0 , σ 2 ) 的 随 机 数 | 服 从 N ( 0 , 1 ) 的 随 机 数 | 1 β

其中, σ={Γ(1+β)sin(πβ2)βΓ(1+β2)2β12}1β σ = { Γ ( 1 + β ) s i n ( π β 2 ) β Γ ( 1 + β 2 ) 2 β − 1 2 } 1 β ,通常, β=1.5 β = 1.5

这在matlab等一些编程工具中都是可以计算的。

值得一提的是, α α 是步长缩放因子,通常 α=1 α = 1 ,在之后的布谷鸟算法发展中,针对 α α 有各种各样的变种,如Yang[^8]为了让算法适应不同的解,让 α=α0(XiXj) α = α 0 ( X i − X j ) , Xi,Xj X i , X j 为任意不同的解 。

4 附:CS算法求解函数最小值代码

求函数 f(x)=ni=1x2i,(20x20n=10) f ( x ) = ∑ i = 1 n x i 2 , ( − 20 ≤ x ≤ 20 , n = 10 ) 最小值

% Script 布谷鸟算法,求解函数最小值
% @author zhaoyuqiang 
%#ok<*SAGROW> Remove hints of syntax
%#ok<*CLALL>
%#ok<*FNDSB>
clear all ; 
close all ;
clc ;
N = 25; % Number of nests(The scale of solution)
D = 10 ; %  Dimensionality of solution
T = 200 ; % Number of iterations
Xmax = 20 ;
Xmin = -20 ;
Pa = 0.25 ; % Probability of building a new nest(After host bird find exotic bird eggs)
nestPop = rand(N,D)*(Xmax-Xmin)+Xmin ;  % Random initial solutions
for t=1:Tlevy_nestPop =  func_levy(nestPop,Xmax,Xmin) ; % Generate new solutions by Levy flightsnestPop = func_bestNestPop(nestPop,levy_nestPop);  % Choose a best nest among  new and old nests     rand_nestPop = func_newBuildNest(nestPop,Pa,Xmax,Xmin); % Abandon(Pa) worse nests and build new nests by (Preference random walk )nestPop = func_bestNestPop(nestPop,rand_nestPop) ; % Choose a best nest among  new and old nests[~,index] = max(func_fitness(nestPop)) ; % Best neststrace(t) = func_objValue(nestPop(index,:)) ; 
end
figure 
plot(trace);
xlabel('迭代次数') ;
ylabel('适应度值') ;
title('适应度进化曲线') ;
function [ result ] = func_levy( nestPop,Xmax,Xmin)
%FUNC_LEVY : Update position of nest by using Levy flights
%@author : zhaoyuqiang 
[N,D] = size(nestPop) ;
% Levy flights by Mantegna's algorithm
beta = 1.5 ;
alpha = 1 ;
sigma_u = (gamma(1+beta)*sin(pi*beta/2)/(beta*gamma((1+beta)/2)*2^((beta-1)/2)))^(1/beta) ;
sigma_v = 1 ;
u = normrnd(0,sigma_u,N,D) ;
v = normrnd(0,sigma_v,N,D) ;
step = u./(abs(v).^(1/beta)) ;
% alpha = 0.1.*(nestPop(randperm(N),:)-nestPop(randperm(N),:)); % Bad effect
nestPop = nestPop+alpha.*step ;
% Deal with bounds
nestPop(find(nestPop>Xmax)) = Xmax ; %#ok<*FNDSB>
nestPop(find(nestPop<Xmin)) = Xmin ;
result = nestPop ; 
end
function [ nestPop ] = func_bestNestPop( nestPop,new_nestPop )
%FUNC_ 此处显示有关此函数的摘要
%@author zhaoyuqiang
index = find(func_fitness(nestPop)<func_fitness(new_nestPop)) ;
nestPop(index,:) = new_nestPop(index,:) ;
end
function [ nestPop ] = func_newBuildNest( nestPop ,Pa ,Xmax,Xmin)
%FUNC_NEWBUILDNEST new solutions are generated by using the similarity 
% between the existing eggs/solutions and the host eggs/solutions with a discovery rate pa .
%@author zhaoyuqiang
[N,D] = size(nestPop) ;
nestPop = nestPop+rand.*heaviside(rand(N,D)-Pa).*(nestPop(randperm(N),:)-nestPop(randperm(N),:));
% Deal with bounds
nestPop(find(nestPop>Xmax)) = Xmax ; %#ok<*FNDSB>
nestPop(find(nestPop<Xmin)) = Xmin ;
end

这里写图片描述

5 源码下载

https://download.csdn.net/download/g425680992/10517545

6 参考文献


  1. 布谷鸟搜索算法研究综述 , 兰少峰 ↩
  2. Cuckoo search via Lévy flights. Yang XS ↩
  3. Cuckoo search via Lévy flights. Yang XS ↩
  4. 逐维改进的布谷鸟搜索算法 , 王李进 ↩
  5. Cuckoo search for inverse problems and simulated-driven shape optimization ,Yang XS ↩
  6. P. Levy, Theoric de l’Addition des Variables Aleatoires ↩
  7. Nature-Inspired Metaheuristic Algorithms Second Edition,Yang XS ↩
  8. Nature-Inspired Metaheuristic Algorithms Second Edition,Yang XS ↩

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

相关文章

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

算法思想 布谷鸟鸟群最终只有最健康的蛋才能孵化出来。 布谷鸟群每只鸟都在拼命寻找好巢穴以达到下最健康的蛋的母的。 算法步骤 步骤一 初始化 初始化布谷鸟种群数量&#xff08;鸟窝个数&#xff09;&#xff0c;计算各个鸟窝&#xff08;解&#xff09;的函数适应值&…

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…