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

2023-05-16

  • 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:1000
    u = 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:T
    levy_nestPop =  func_levy(nestPop,Xmax,Xmin) ; % Generate new solutions by Levy flights
    nestPop = 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 nests
    trace(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 ↩
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 什么是上下文切换?

    上下文切换指的是内核操作系统的核心在CPU上对进程或者线程进行切换 搞清楚上下文切换需要先搞清楚什么是上下文 CPU在开始执行任务时需要先知道从哪里去加载任务 xff0c 从哪里开始执行 xff0c 上下文的作用就是告诉CPU这些 xff0
  • ubuntu16.04下,ROS+PX4+QGC安装

    ubuntu16 04下 xff0c ROS 43 PX4 43 QGC安装 ROS安装 xff1a 第一步 xff1a ROS安装前准备工作 1 在Ubuntu系统上 xff0c 确认git已经安装 span class token fu
  • TokenEndpoint : Handling Null Pointer Exception

    springboot oauth2 0生成token时报错 详细的日志没有打印出来 需要手动配置log 64 Override public void configure AuthorizationServerEndpointsConfig
  • linux(ubuntu)无法连接网络

    提示 xff1a 版本 xff1a ubuntu16 0 4 问题 xff1a 开机没有网络 xff0c 无法连接网络 xff0c 尝试了很多方法最终才可以 首先查看ifconfig 查看网卡信息 ifconfig 查看ip ip a 查看
  • 八皇后问题

    问题描述 在国际象棋中 xff0c 有一个非常强势的棋子 皇后 xff0c 他的走法可以在网上参考一下 xff0c 概括来说就是可以沿着行 列 与对角线平行的线走 而在计算机中有一个关于他的经典问题 xff0c 8皇后 xff0c 就是在8
  • ubuntu18.04.3如何在终端下切换到指定文件夹或根目录

    看到很多的新手 xff0c 不知道如何在终端切换到根目录的 xff0c 或者是指定的目录的 xff0c 下面介绍一下切换的方法 1 先按键盘 ctrl 43 alt 43 t 弹出终端 xff0c 那么你会看到终端上的提示当前目录为 这个就
  • MySql简单查询——单表查询

    一 DDL xff08 Data Definition Language xff09 xff1a 数据定义语言 xff0c 用来定义数据库对象 xff1a 库 表 列等 xff1b 相关字段 xff1a create drop alter
  • linux下可视化git工具git-cola安装与使用(HTTP方式)

    一 git cola为何物 很多小伙伴 xff0c 特别喜欢使用TortoiseGit xff0c 该软件是做什么的 xff0c 就不用多说吧 奈何 xff0c TortoiseGit只有windows版 xff0c 这让在linux上开发
  • 解决ubuntu下应用程序菜单不在程序的左上角

    测试版本 xff1a ubuntu16 04 问题 xff1a 应用程序菜单不在程序的左上角 xff0c 默认放在了桌面顶部的菜单栏上 如下 xff1a 解决办法 xff1a System Settings gt Appearance gt
  • linux下可视化git工具git-cola安装与使用(SSH方式)

    一 git cola为何物 很多小伙伴 xff0c 特别喜欢使用TortoiseGit xff0c 该软件是做什么的 xff0c 就不用多说吧 奈何 xff0c TortoiseGit只有windows版 xff0c 这让在linux上开发
  • CAS实现SSO单点登录原理

    yale cas可以百度一下 xff0c 这是学习cas后的一点总结 xff0c 以备日后使用 xff01 安全性 xff1a 用户只须在cas录入用户名和密码 xff0c 之后通过ticket绑定用户 xff0c 在cas客户端与cas校
  • 五种知网文献免费下载方式

    1 idata中国知网 网址 xff1a idata中国知网 进入系统 xff0c 注册账号 xff0c 登录即可 每天五篇额度 xff0c 基本够用 xff0c 可注册多个账号使用 2 上海研发公共服务平台 网址 xff1a 上海研发公共
  • 【FreeRTOS】二值信号量实现线程的同步

    FreeRTOS 二值信号量实现线程的同步 测试环境如下 stm32L431RCT6 MDK keil5 stm32cube 43 FreeRTOS 一 添加多个任务 1 引脚配置 LED使用的引脚PA8和PB2设置成output 将按键引
  • 暗影精灵2pro安装win10+ubuntu16.10双系统

    暗影精灵2pro预装win10家庭版 xff0c 默认启动win10系统 xff0c 且无法引导其他系统 xff0c 今天我们来解决这个问题 先进入到win10的磁盘管理器服务 xff0c 为ubuntu单独分配磁盘空间 xff0c 让wi
  • 第二十三讲.从HadoopURL中读取数据

    视频 xff1a 美妙人生 Hadoop课程系列之HDFS 手把手教你精通HDFS 美妙人生 Hadoop课程系列之HDFS 手把手教你精通HDFS 视频笔记 从hadoop URL读取数据 static URL setURLStreamH
  • winform窗体

    一 winform介绍 WinForm xff0c 是 Net开发平台中对Windows Form的一种称谓 WinForm是窗体应用程序 xff0c 由若干个窗体应用组成 xff0c 基于C S架构 二 winform的使用 xff08
  • 赋予人工智能记忆的人,带你梳理深度学习核心算法

    新智元翻译 1 来源 xff1a Idsia 作者 xff1a J rgen Schmidhuber 翻译 xff1a 张巨岩 作者介绍 xff1a J rgen Schmidhuber 被称为是赋予人工智能记忆的人 xff0c 递归神经网
  • C++实现贪吃蛇游戏

    注意 xff1a 本代码是在VC 43 43 6 0环境下编译的 xff0c 在其他环境如codeblocks下运行可能会产生意想不到的问题 xff0c 请尽量使用VC xff01 最近由于小编闲着慌 xff0c 捣鼓了一个贪吃蛇游戏 xf
  • Win10正式版19044.2132(KB5020435)来啦!(附完整更新日志)

    微软发布了Win10正式版KB5020435 xff08 操作系统内部版本 19042 2132 19043 2132 和 19044 2132 xff09 xff0c 此次更新主要解决了某些类型的安全套接字层 xff08 SSL xff0
  • SOUI总结之皮肤说明

    皮肤说明 说明 框架自带的皮肤都是 skin sys XXXX开始 xff0c 自带的皮肤存放位置trunk soui sys resource theme sys res xff0c 图片和名称映射关系可以打开trunk soui sys

随机推荐

  • C++中逗号运算符

    今天测试代码的时候 xff0c 遇到一行代码出现了疑问 xff0c 原因是出现了自减运算符和逗号运算符 xff0c 这就涉及到一个顺序的问题 xff0c 于是写了一个C 43 43 小程序 xff0c 验证了一下这个想法 include u
  • PsExec的问题及其解决办法

    C gt PsExec exe 192 168 1 142 cmd PsExec v1 98 Execute processes remotely Copyright C 2001 2010 Mark Russinovich Sysinte
  • ubuntu 18.04安装protobuf

    今天需要安装protobuf 在网上搜了一篇教程 xff0c 但是篇幅太长 xff0c 于是对其进行简化一下 原文 1 96 96 96 git clone https github com protocolbuffers protobuf
  • 读取配置文件的程序

    时常会遇到需要从配置文件中读取一些信息 xff0c 这里就提供一个例子 xff0c 方便日后使用 xff1a span class token comment ini h span span class token macro proper
  • 命令行读取参数

    有时需要从命令读取一些输入 xff0c 这里找到一个方法 xff0c 怎么实现的没有仔细研究 xff0c 但是可用 cmdline h span class token comment Copyright c 2009 Hideyuki T
  • 如何在一个shell脚本中开启多个应用程序?

    之前在csdn上搜索 xff0c 提示用gnome terminal指令 xff0c 但是发现怎么都不好使 于是找到一种解决方案 span class token comment bin bash span span class token
  • 使用openCV播放视频 在视频中加入滑动条

    include 34 opencv2 highgui highgui hpp 34 include 34 opencv2 imgproc imgproc hpp 34 include lt iostream gt include lt fs
  • Linux下vscode无法查看定义?

    今天要用到vscode查到c 43 43 程序 但是发现vscode无法查看程序的定义 于是找了一下解决方法 vscode无法转到定义可能是因为没有安装插件 由于我需要使用C 43 43 所以我这里安装的是C 43 43 插件 第一步 第二
  • 冒泡排序的实现(基于顺序表)

    对于冒泡排序的含义以及图示表示 这里就不再赘述 这篇博客已经说的很明白了 添加链接描述 于是就用代码实现了一下基于顺序表的冒泡排序 因为一直看的时大话数据结构这本书 于是把上面介绍的三种实现方法都在代码中实现一下 具体实现与书中有一些出入
  • ambiguating new declaration of 问题的解决

    今天在运行代码的时候 一直在报这样的错误 ambiguating new declaration of int NewPartition seqlist int int 查看了许久 原来是头文件中的声明类型与函数实现的声明类型不一致造成的
  • opencv中的MatConstIterator,NAryMatIterator迭代器的使用

    第一个迭代器 MatConstIterator迭代器 使用迭代器计算一个三通道三维数组中 34 最长元素 34 这个代码实现过程中 照着书中的代码抄下来一直报错 后来在查阅代码的时候 发现了问题所在 具体已经在代码中标明了 include
  • 用python实现查询天气的功能

    附上代码 import urllib request import gzip import json print 39 天气查询 39 def get weather data city name 61 input 39 请输入要查询的城市
  • 1.Docker 安装

    安装 wget 命令 yum install wget 安装docker wget q O https get docker com sh O 下载并以指定的文件名保存 以 39 39 作为file参数 xff0c 那么数据将会被打印到标准
  • linux下sudo apt-get update 报Err http://security.ubuntu.com precise-security InRelease 等

    今天在进行linux更新的时候一直报错 尝试了很多办法都不行 于是找到一个方法 切实可行 以根用户运行 cd var lib apt lists rm rm var cache apt archives lock rm var lib dp
  • HTTP Authentication之Basic认证、Digest认证

    本文为博主原创 xff0c 未经许可严禁转载 本文链接 xff1a https blog csdn net zyooooxie article details 109691608 前面说到 Fiddler 的QuickExec Filter
  • Qt学习笔记(5) — Qt 类库【C++】

    目录 一 Qt核心特点1 元对象系统2 信号与槽的关联方式 二 Qt全局定义 xff08 常用头文件 xff09 1 lt QtGlobal gt 头文件1 xff09 数据类型定义2 xff09 函数3 xff09 宏定义 三 容器类1
  • 【C++】STL学习小总结

    经过自学以及查找资料汇总的一些记录 STL概述 长久以来 xff0c 软件界一直希望建立一种可重复利用的东西 xff0c 以及一种得以制造出 可重复运用的东西 的方法 xff0c 从函数 functions xff0c 类别 classes
  • ssh连接云服务器失败,能ping通但是连接不上

    环境 xff1a 腾讯云服务器 远程工具 xff1a xshell 7 问题描述 使用xshell远程工具时 xff0c 输入云服务器地址 xff0c 输入用户名密码之后显示 Connection established To escape
  • cheom 修改文件权限

    Chmod命令主要用于修改 设置文件权限 chmod 修改文件权限主要有两种方式 xff1a 字母法与数字法 1 字母法 xff1a chmod u g o a 43 61 r w x 文件名 以上是chmod的用法 xff0c 每个括号是
  • 通俗易懂的布谷鸟算法与莱维飞行,(附求解函数最小值matlab源码)

    1 从布谷鸟的育雏到布谷鸟算法2 布谷鸟算法3 萊维飞行与公式 1 的深层含义4 附 xff1a CS算法求解函数最小值代码5 源码下载6 参考文献 1 从布谷鸟的育雏到布谷鸟算法 布谷鸟不会做窝 xff0c 也不会育雏 xff0c 在春末