布谷鸟搜索算法

2023-05-16

        布谷鸟搜索(Cuckoo Search,缩写 CS),也叫杜鹃搜索,是由剑桥大学杨新社(音译自:Xin-She Yang)教授和S.戴布(S.Deb)于2009年提出的一种新兴启发算法。

1.定义

        CS算法是通过模拟某些种属布谷鸟的寄生育雏(BroodParasitism),来有效地求解最优化问题的算法。同时,CS也采用相关的Levy飞行搜索机制。

2.算法

(1)使用布谷鸟搜索算法的三个理想规则

        a.每只布谷鸟一次只下一个蛋,然后把蛋放进随机选择的鸟巢里;(Each cuckoo lays one egg at a time, and dumps it in a randomly chosen nest)

        b.在随机选择的鸟巢中,最好的鸟巢将被保留到下一代;(The best nests with high-quality eggs will be carried over to the next generations)

        c.可用的寄主巢的数量是固定的,而且布谷鸟产卵的概率是由寄主鸟发现的。在这种情况下,宿主鸟要么扔掉蛋,要么干脆放弃鸟巢,建造一个全新的鸟巢。(The number of available host nests is fixed, and the egg laid by a cuckoo is discovered by the host bird with a probability . In this case, the host bird can either get rid of the egg, or simply abandon the nest and build a completely new nest)

        从实现的角度来看,我们可以使用以下简单的表示法,即巢穴中的每个蛋代表一个解决方案,而每个布谷鸟只能产一个蛋(因此代表一个解决方案),目的是使用新的和潜在更好的解决方案(布谷鸟)来替换巢穴中不太好的解决方案。显然,该算法可以扩展到更复杂的情况,即每个嵌套有多个表示一组解的蛋。在目前的介绍中,我们将使用最简单的方法,即每个巢只有一个蛋。在这种情况下,蛋、巢或布谷鸟之间没有区别,因为每个巢对应一个蛋,也代表一只布谷鸟。

(2)算法相关参数

        该算法采用局部随机游走全局探索性随机游走的平衡组合,由切换参数控制。

局部随机游走可以写成:

                                       (1)

        其中,x_{j}^{t}x_{k}^{t}是通过随机置换随机选择的两个解,H_{u}是Heaviside函数,\epsilon是从均匀分布中提取的随机数,s是步长。⊗是一种新的运算符(点乘)。

另一方面,全局探索性随机游走是通过Levy飞行实现的:

而,

        其中 ,这里\alpha >0是步长比例因子,它应该与感兴趣问题的规模相关。在大多数情况下,我们可以使用α=O(L/10),L是感兴趣问题的特征量表,而在某些情况下,α=O(L/100)可以更有效,避免飞得太远。上述方程本质上是随机行动的随机方程。一般来说,随机游走是一个马尔可夫链,其下一个状态/位置仅取决于当前位置(上述等式中的第一项)和转移概率(第二项)。

附:Levy Flight的简单代码实现

>> clc;
clear;
x = [0,0];
y = [0,0];
beta = 3/2;
alpha_u = (gamma(1+beta)*sin(pi*beta/2)/(gamma(((1+beta)/2)*beta*2^((beta-1)/2))))^(1/beta);
alpha_v = 1;
for i=1:1000 
   u=normrnd(0,alpha_u,1);
   v=normrnd(0,alpha_v,1);
   s = u/(abs(v))^(1/beta);
   x(:,1) = x(:,2);
   x(:,2) = x(:,1)+1*s;
   u=normrnd(0,alpha_u,1);
   v=normrnd(0,alpha_v,1);
   s = u/(abs(v))^(1/beta);
   y(:,1) = y(:,2);
   y(:,2) = y(:,1)+1*s;
   plot(x,y);
   hold on;
end
axis square;

3.特点

        a.满足全局收敛性;

        b.布谷鸟搜索有两种搜索能力:局部搜索和全局搜索,由切换/发现概率控制。局部搜索非常密集,大约占搜索时间的1/4,而全局搜索大约占总搜索时间的3/4。这使得搜索空间可以在全局范围内得到更有效的探索,从而以更高的概率找到全局最优性。

4.算法步骤

        步骤1:设置鸟巢的个数为n,搜索空间的维数为d,初始化鸟巢的位置p_{0}=[x_{1}^{(0)},x_{2}^{(0)}...x_{n}^{(0)},]^{T},并找出最优鸟巢的位置x_{b}^{(0)}b\epsilon [1,2,...,n]和最优解f_{min}

        步骤2:循环体

(1)保留上代最优鸟巢的位置x_{b}^{t-1}t为整数,并利用(1)式更新其他鸟巢的位置;

(2)利用Levy Flight得到一组新的鸟巢的位置p_{t}=[x_{1}^{(t)},x_{2}^{(t)},...,x_{n}^{(t)}]^{T}

(3)与上一组产生的鸟巢位置p_{t-1}=[x_{1}^{t-1},x_{2}^{t-1},...,x_{n}^{t-1}]^{T}进行对比,用适应值较好的鸟巢位置替换适应值较差的鸟巢位置,从而得到一组较优的鸟巢位置g_{t}=[x_{1}^{(t)},x_{2}^{(t)},...,x_{n}^{(t)},]^{T};

 (4)通过位置更新后,用随机数\gamma =[0,1]与宿主鸟发现外来鸟蛋的概率是p_{\alpha }p_{\alpha }一般设置为0.25)进行对比,若\gamma >p_{\alpha },则对x_{t}^{t+1}的位置进行随机改变。保留g_{t}中发现概率较小的鸟蛋的位置,并随机改变发现概率较大的鸟巢的位置,得到一组新的鸟巢的位置,与g_{t}中鸟巢的位置进行对,用测试值较好的鸟巢位置代替测试值较差的鸟巢位置,得到一组较优的鸟巢位置p_{t}=[x_{1}^{(\omega)},x_{2}^{(\omega)},...,x_{n}^{(\omega)}]^{T}

        步骤3:找出步骤2中最后得到的p_{t}中的最优鸟巢位置x_{b}^{(t)}和最优值f_{min},若达到迭代条件(规定的迭代次数或要求的精度)则输出全局最优值f_{min}和全局最优位置x_{b}^{(t)},反之,返回步骤2继续迭代更新。

附.布谷鸟算法Java实现(别人写的)

package com.gxx.matrix;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

/**
 * 布谷鸟算法
 * 原理是,使用多个 散列函数,通过计算放到 表 中,当其中一个散列函数计算到的对应位置为空,则放入,
 * 当都不为空就进行一层层替换,达到一定次数后还是插入不了,则进行扩容,或者重新散列
 */
public class Cuckoo {
    private String [] array ;//表
    private static final int DEFAULTSIZE = 7;
    private int  size ;
    private int reHash =0;
    private int tryCount = 33;

    List<HashAlgorithm>  hashAlgorithmList = new ArrayList<HashAlgorithm>();
    {//初始2个散列函数。
        hashAlgorithmList.add(new HashAlgorithm(17));
        hashAlgorithmList.add(new HashAlgorithm(23));
    }

    void remove(String key){
        if (key == null) {
            return;
        }
        for (HashAlgorithm hashAlgorithm : hashAlgorithmList) {//遍历算法集合 计算index值,
            int hashCode = hashAlgorithm.hashCode(key);
            int index = getIndex(hashCode);
            if (array[index]!=null && array[index].equals(key)) {
                array[index] = null;
                size--;
            }
        }
    }

    void insert(String key){
        while(true){
            for (int i = 0; i < tryCount; i++) {

                for (HashAlgorithm hashAlgorithm : hashAlgorithmList) {//遍历算法集合 计算index值,
                    int hashCode = hashAlgorithm.hashCode(key);
                    int index = getIndex(hashCode);
                    if (array[index] == null ) {
                        array[index] = key;//当表中索引无值,将元素放到表中
                        size++;
                        return;
                    }
                }

                //执行到这说明 算法集合计算的index全部有值 进行替换操作

                int hashAlgorithmListIndex = new Random().nextInt(hashAlgorithmList.size());//随机选取一个函数
                int hashCode = hashAlgorithmList.get(hashAlgorithmListIndex).hashCode(key);
                int index = getIndex(hashCode);

                String oldKey = array[index];//原本表中这个索引对应的值
                array[index] = key;//把要插入的值 放到当前索引上
                key = oldKey; //现在就是要插入原来替换掉的值

            }

            if (++reHash >1 || size>=array.length) {//说明要进行扩容操作了
                expandArray();
                reHash =0;
            }else {
                computeHash();//重新计算hash值
            }
        }
    }
    /**
     * 更新 hash函数 重新计算
     */
    private void computeHash() {
        hashAlgorithmList.clear();//清空原有的函数
        int one = new Random().nextInt(100);
        int two = new Random().nextInt(100);
        two = one == two ? two*2 : two;//只是两个不一样的值
        hashAlgorithmList.add(new HashAlgorithm(one));
        hashAlgorithmList.add(new HashAlgorithm(two));
        rehash(array.length);
    }

    private void expandArray() {
        rehash(nextPrime(array.length*2));
    }

    /**
     * 重新计算所有的 hash 同时放到表中
     * @param length
     */
    private void rehash(int length) {
        String [] oldArray = array;
        array = new String[length];
        size = 0 ;
        for (String string : oldArray) {
            if (string != null) {
                insert(string);
            }
        }
    }

    public static void main(String[] args) {
        Cuckoo cuckoo = new Cuckoo();
        for (int i = 0; i < 8; i++) {
            cuckoo.insert("a"+new Random().nextInt(1000));
        }
        for (String string : cuckoo.array) {
            System.out.println(string);
        }
    }


    //素数计算
    public static Integer nextPrime(Integer begin) {
        int i;
        int j;
        for (i = begin;; i++) {
            boolean flag = true;
            for (j = 2; j <= i / 2; j++) {
                if (i % j == 0) {
                    flag = false;
                    break;
                } else if (i % j != 0) {
                    continue;
                } else {
                    break;
                }
            }
            if (flag) {
                return i;
            }
        }
    }
    /**
     * 是否包含当前元素
     * @param key
     * @return
     */
    Boolean cotains(String key){
        for (HashAlgorithm hashAlgorithm : hashAlgorithmList) {
            int hashCode = hashAlgorithm.hashCode(key);
            int index = getIndex(hashCode);
            if (array[index] !=null ) {
                return true;
            }
        }
        return false;
    }


    /**
     * 获取hash值对应的表中索引
     * @param hashCode
     * @return
     */
    int getIndex(int hashCode){
        int index = hashCode % array.length;
        index =  index < 0 ? index + array.length : index;
        return index;
    }

    public Cuckoo() {
        this(DEFAULTSIZE);
    }


    public Cuckoo(int size) {
        array = new String[size];
    }



    public int getSize() {
        return size;
    }

    //定义散列函数集合
    class HashAlgorithm{

        private int initNumber;

        public HashAlgorithm(int initNumber) {
            super();
            this.initNumber = initNumber;
        }

        public int hashCode(String key){
            return (initNumber +key).hashCode();//传递进来的固定值 +key 模拟两个不同的 hashcode
        }
    }
}

5.应用

        a.Walton等人改进的布谷鸟搜索已被证明对解决网格搜索等非线性问题非常有效;

        b.Vazquez使用布谷鸟搜索来训练尖峰神经网络模型;

        c.Chifu等人使用布谷鸟搜索优化语义web服务组合过程;

        d.Kumar和Chakarverty使用布谷鸟搜索实现了可靠嵌入式系统的优化设计;

        e.Kaveh和Bakhshpoori使用CS成功设计了钢框架;

        f.Yildiz使用CS在铣削操作中选择最佳的机器参数,结果得到了增强;

        g.Zheng和Zhou则提供了一种使用高斯过程的布谷鸟搜索

        h.Tein和Ramli提出了一种离散布谷鸟搜索算法来解决护士排班问题;

        i.布谷鸟搜索也被用于生成软件测试和测试数据生成的独立路径;

        j.布谷鸟搜索与基于量子的方法相结合的一种变体已经被开发出来,以有效地解决背包问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

布谷鸟搜索算法 的相关文章

  • DSP28335 看门狗初始化函数

    DSP28335 看门狗初始化函数 看门狗初始化程序 入口参数为系统定时复位时间 在需要复位看门狗计数器的地方调用程序ServiceDog 此程序在文件DSP2833x SysCtrl c中 详细说明在 TMS320x
  • Keil5编译error:core_cm3.h

    当打开现成的工程项目时 xff0c 编译出现一堆错误 xff0c 大部分错误出现关于 core cm3 h 这个文件 xff0c 那么大概率可能跟Keil5的版本有关 xff0c 如下 xff1a 可能原因 xff1a 打开魔术棒 gt T
  • Simulink创建子系统,创建引用模型,调用模型,加密模型

    Simulink创建子系统 创建引用模型 调用模型 加密模型 一 创建子系统 1 创建新工程 并添加Logical Operator Unit Delay连线 完成如下图 全选所有模块 右键选择 基于所选内容创建子系统 ctrl G 完成如
  • 自动驾驶 2D 单目\双目\多目视觉方法 一(Pseudo-LiDAR,Mono3D,FCOS3D,PSMNet)

    文章目录 概述单目3D感知3D目标检测单目深度估计 双目3D感知双目3D目标检测双目深度估计 Pseudo LiDAR1 核心思路总结2 要点分析 Mono3DFCOS3DPSMNet 概述 自动驾驶中必不可少的3D场景感知 因为深度信息
  • [C语言] 利用库函数实现查找指定键值对功能

    1 功能描述 键值对 xff08 key 61 value xff09 字符串 xff0c 在开发中经常使用 要求1 xff1a 请自己定义一个接口 xff0c 实现根据key获取 要求2 xff1a 编写测试用例 要求3 xff1a 键值
  • 【C++】Clang-Format:代码自动格式化(看这一篇就够了)

    文章目录 Clang format格式化C代码1 引言 amp 安装1 1引言1 2 安装 2 配置字解释2 1 language 编程语言2 2 BaseOnStyle 基础风格2 3 AccessModifierOffset 访问性修饰
  • 生产者消费者问题(Producer-consumer problem)

    概述 生产者消费者问题 xff0c 也称有限缓冲问题 xff08 英语 xff1a Bounded buffer problem xff09 xff0c 是一个多线程同步问题的经典案例 该问题描述了两个共享固定大小缓冲区的线程 即所谓的 生
  • Yolov3+C+++opencv+VS2015训练过程及检测(很详细)

    运行环境 我的运行环境是C 43 43 43 opencv 43 VS2015 43 yolov3 xff0c 切记opencv的版本最好是opencv 3 4 2版以上的 xff0c 这个版本以后才有了DNN函数库来实现机器学习的相关内容
  • RAID容量在线计算器

    RAID容量计算器在线工具 xff0c 可以简单快速地获取各RAID需要的硬盘 xff0c 可用容量 以下地址任意打开一个即可快速获取RAID硬盘 容量 好用的工具就是要给大家一起分享 https www synology cn zh cn
  • C++代码自动检测工具clang-format和clang-tidy

    文章目录 96 clang format 96 安装方法命令格式使用案例更多关于 96 clang format 96 96 clang tidy 96 简单介绍检测原理安装方法使用方法更多关于 96 clang tidy 96 clang
  • Python作为人工智能首选编程语言,你能了解多少呢?

    为何人工智能 AI 首选Python xff1f 读完这篇文章你就知道了 我们看谷歌的TensorFlow基本上所有的代码都是C 43 43 和Python xff0c 其他语言一般只有几千行 如果讲运行速度的部分 xff0c 用C 43
  • 错误代码:WHEA_INTERAL_ERROR—蓝屏

    非常奇怪哦 xff0c 什么都没干 xff0c 笔记本电脑打不开 xff0c 蓝屏 xff0c 呀呀呀 xff0c 搞了一个小时 xff0c 最后终于解决解决办法很简单 xff0c 拔掉所有外设 xff0c 如鼠标 xff0c 键盘 xff
  • NB-IoT技术实战开发 ----- NB-IoT介绍

    一 1 初识NB IoT 1 NB IoT介绍2 物联网技术发展2 1有线物联网2 2 无线网络网 3 为什么需要NB IOT4 NB IOT优势5 NB IOT解决方案亮点和价值5 1 广覆盖5 2 低功耗5 3低成本5 4 大连接 6
  • 已知两个长度分别为m 和 n 的升序链表,若将它们合并为一个长度为 m+n 的降序链表,则最坏情况下的时间复杂度是()

    王道书第七面的第六题 xff0c 理解了一下午终于解决 xff01 算法的本质 xff1a 两个表进行比较 xff0c 其中一个表比较完之后 xff0c 剩下的直接插入 因此最好的情况 xff0c 不用想的太复杂 xff0c 其实就只是短的
  • 用例间的三种关系(小白必看)

    用例间的三种关系 xff0c 瞎子都能看懂 xff01 xff01 xff01 1 包含2 泛化3 扩展 1 包含 指向分解出来的用例 把一个复杂的步骤分解为较小的步骤 2 泛化 指向父用例 继承关系 xff0c 子用例有特别功能 eg1
  • ev加密视频转换成MP4格式,亲测可用

    需要的话私信我即可 ev4加密视频转换 觉得有用的话点个关注吧 xff0c 谢谢大家 需要该破解软件的话 xff0c 直接评论区留言即可 xff0c 我每天都会看csdn的 xff0c 杜绝二次间接收费 xff0c 全程免费分享 xff0c
  • 机器学习个人总结(王道版)

    机器学习流程 xff1a 预处理 gt 特征工程 gt 机器学习算法 选择合适的算法 gt 评估 强化学习 xff1a 用人工智能去调参 数据也是一种财富离散型数据 xff1a 由记录不同类别个体的数目所得到的数据 xff0c 又称计数数据
  • 深度学习(王道学习篇)

    在ubuntu中安装虚拟环境 设置pip安装源步骤 1 mkdir pip 2 cd pip 3 vim pip conf 4 往pip conf放入 global timeout 61 6000 index url 61 http pyp
  • python程序打包成exe文件

    1 打包成多文件 把你的运行环境导出来 pip intsall requests pip freeze span class token operator gt span requirets span class token punctua
  • K8S之Docker容器的备份和容灾方案

    数据安全在当今复杂的IT世界中变得越来越重要 xff0c 甚至超越了网络安全和信息安全 xff0c 因为一切企业基本上都是以业务和应用的线上商业发展之道 所以大家变得尤为重视 Docker 是一个开源的应用容器引擎 xff0c 基于 Go

随机推荐

  • 基于matlab的车牌识别系统的实现

    1 项目背景及目标 随着人们生活水平的提高 xff0c 机动车辆的数量也逐渐增加 xff0c 2020年全国的机动车保有总数量为3 72亿辆 xff0c 其中汽车保有量为2 81亿辆 xff0c 占75 54 如此庞大的汽车保有量 xff0
  • Linux命令-find命令之exec

    exec 参数后面跟的是command命令 xff0c 它的终止是以 为结束标志的 xff0c 所以这句命令后面的分号是不可缺少的 xff0c 考虑到各个系统中分号会有不同的意义 xff0c 所以前面加反斜杠 花括号代表前面find查找出来
  • ubuntu18.04 安装新版本的clang-format 9

    在安装RoboWare Studio过程中 xff0c 为了获得更好的代码阅读体验 xff0c 自动格式化整理代码 xff0c 需要安装clang format xff1a sudo apt get update sudo apt get
  • 【PX4(一)】PX4二次开发环境搭建-QGroundcontrol配置和gazebo环境搭建

    以前装PX4二次开发环境遇到了很多坑 xff0c 也查过了很多帖子都很难达到理想的效果 xff0c 现在重新捡起来 xff0c 在安装时遇到的问题一个一个记录与解决 xff0c 现在我把我成功安装与编译运行所遇到的问题与解决方案全都记录下来
  • 【PX4(二)】PX4编译脚本与模块编译脚本的修改-程序烧录

    一 编译与烧写方法 编译命令 xff1a nanorobot 64 ubuntu Documents Firmware make px4 fmu v5 default 下载命令 xff1a nanorobot 64 ubuntu Docum
  • 【3D激光SLAM(一)】Velodyne激光SLAM学习之Velodyne-16线雷达室内建图基本使用

    一 Velodyne16线激光雷达基本描述 VLP 16激光雷达是Velodyne公司出品的最小型的3维激光雷达 xff0c 保留了电机转速可调节的功能 实时上传周围距离和反射率的测量值 VLP 16具有100米的远量程测量距离 精巧的外观
  • Kalibr相机标定功能包的安装编译与问题解决-Kalibr踩坑过程

    编译的网络环境 xff1a 能上外网 系统 xff1a ubuntu18 04 一 安装准备 xff1a 安装第三方库依赖 sudo apt get install python setuptools python rosinstall i
  • 【视觉SLAM(二)】Realsense D455在Jetson Nano上的安装Realsense和ROS驱动安装

    一 安装驱动 cd git clone https github com jetsonhacksnano installSwapfile cd installSwapfile installSwapfile sh reboot cd git
  • 嵌入式面试准备一---USART、IIC、SPI、CAN

    USART IIC SPI CAN通信原理 USART串口通信原理IIC通信原理SPI通信原理CAN通信原理 USART串口通信原理 http blog sina com cn s blog 915534580102yaa0 html 特点
  • 关于 Java 的代码注释

    1 单行注释 以 开头 xff0c 后面皆为注释 xff0c 示例如下 xff1a span class token keyword public span span class token keyword class span span
  • AI绘画(以后也叫AI视频)

    大概半年前 xff0c AI 绘画工具 Disco Diffusion 从 Text to Image 开发社区和设计行业 xff0c 火到了普通用户的视野中 即便它界面简陋 xff0c 满屏英文和代码 xff0c 也 劝退 不了人们 因为
  • ArrayList集合笔记

    ArrayList数据结构 xff1a 底层数据结构就是一个数组 xff0c 元素类型都是object类型 xff0c 对ArrayList的所有操作底层都是基于数组 ArrayList的线程安全性 xff1a 对ArrayList集合进行
  • HashMap集合笔记

    HashMap数据结构 xff1a 底层数据结构由数组和链表构成的 xff0c 数组其实是HashMap的主体 xff0c 链表则是为了解决Hash冲突而存在的 java8以后链表长度超过8会自动转成红黑树 HashMap主干为一个Entr
  • 阿里云Linux服务器安装配置ftp及java代码实现上传服务器全教程

    1 首先使用连接工具连接到云服务器 xff0c 这里我是使用PuTTY 端口号22 xff0c SSH连接 xff0c open进行连接 span class token number 2 span 输入命令行下载安装vsftpd和ftp
  • linux下安装redis

    1 首先在服务上安装wget下载工具 yum install wget 2 下载redis安装包 wget http span class token operator span span class token operator span
  • cas 4.0单点登录服务端部署

    1 首先下载tocams和cas4 0服务端代码 cas4 0代码链接如下 xff1a https github com apereo cas releases tag v4 0 0 tomcat链接如下 xff1a 我这里用的是tomca
  • linux配置jdk1.8环境

    配置环境变量 vim span class token operator span etc span class token operator span profile 加入 根据自己jdk存放的路径 export JAVA HOME sp
  • Lock和Rlock

    Lock acquire blocking 获取一把锁 xff0c 阻塞的或者非阻塞的 当调用时blocking参数设置为True xff08 默认值 xff09 xff0c 将阻塞直至锁变成unblocked xff0c 然后设置它的状态
  • 酒店管理系统项目模板、毕业设计

    下载地址 xff1a 酒店管理系统模板 毕业设计 xff1b 附带项目sql Java文档类资源 CSDN下载 hotel db hotel sql ssm hotel out artifacts ssm hotel Web explode
  • 布谷鸟搜索算法

    布谷鸟搜索 xff08 Cuckoo Search xff0c 缩写 CS xff09 xff0c 也叫杜鹃搜索 xff0c 是由剑桥大学杨新社 xff08 音译自 xff1a Xin She Yang xff09 教授和S 戴布 xff0