python---布谷鸟搜索算法

2023-05-16

布谷鸟搜索算法(Cuckoo Search,CS)

布谷鸟算法的启发当然来自于布谷鸟,因为布谷鸟这种鸟很有意思,生出来的孩子自己不养,直接被扔到其他鸟的鸟巢中去了,但有时候,这些布谷鸟蛋会被被寄宿的那些鸟妈妈发现,然后就被抛弃,有时候,这些宿主会直接放弃整个鸟巢寻找新住处。然而道高一尺魔高一丈,有些品种的布谷鸟生下来的布谷鸟蛋的颜色能和去寄宿的鸟的鸟蛋颜色很相似,并且布谷鸟的破壳时间往往比那些宿主的鸟蛋早,这样,一旦小布谷鸟破壳,它就会将一些鸟蛋扔出鸟巢去以求获得更多的食物,并且,小布谷鸟能模拟宿主鸟孩子的叫声来骗取更多的食物!简单来说,就是如何更高效地去骗吃骗喝。
流程图如下图所示。
在这里插入图片描述
程序如下:

import numpy as np
import scipy.special as sc_special
import matplotlib.pyplot as plt             #matplotlib的pyplot模块一般是最常用的,可以方便用户快速绘制二位图表
from matplotlib import cm 					 #matplotlib是python最著名的绘图库
from mpl_toolkits.mplot3d import Axes3D    #3D绘图
"""
    Cuckoo search function
    ---------------------------------------------------
    Input parameters:
        n: 巢的数量
        m: 维数
        fit_func: 适用度函数
        lower_boundary: 下边界
        upper_boundary: 上边界
        iter_num: 迭代次数 (默认: 100)
        pa: 被宿主发现蛋的概率 (default: 0.25)
        beta:与问题规模相关的步长比例因子 (note: 1 < beta < 2) (default: 1.5)
        step_size:  与问题规模相关的步长比例因子 (default: 0.1)
    Output:
        最佳解决方案及值
"""

#绘制图像
def plot_3d(ax):
    x = np.arange(-3, 3, 0.1)       #在指定的间隔内返回均匀间隔的数字
    y = np.arange(-3, 3, 0.1)
    x,y = np.meshgrid(x, y)
    z = 3*(1-x)**2*np.e**(-x**2-(y+1)**2) - 10*(x/5-x**3-y**5)*np.e**(-x**2-y**2) - (np.e**(-(x+1)**2-y**2))/3
    ax.plot_surface(x,y,z,rstride=1,cstride=1,cmap=cm.coolwarm)# rstride:行之间的跨度  cstride:列之间的跨度,cmap是颜色映射表
    ax.set_zlim(-10,10)               ##坐标系的下边界和上边界
    ax.set_xlabel('x')
    ax.set_ylabel('y')
    ax.set_zlabel('z')
    plt.pause(3)                      #延时
    plt.show()                        #显示

def fit_func(nest):
        x, y = nest
        return 3*(1-x)**2*np.e**(-x**2-(y+1)**2) - 10*(x/5-x**3-y**5)*np.e**(-x**2-y**2) - (np.e**(-(x+1)**2-y**2))/3

#计算适应度
def calc_fitness(fit_func, nests):
    n, m = nests.shape
    fitness = np.empty(n)

    for each_nest in range(n):
        fitness[each_nest] = fit_func(nests[each_nest])

    return fitness

#主要过程
def cuckoo_search(n, m, fit_func, lower_boundary, upper_boundary, iter_num = 100,pa = 0.25, beta = 1.5, step_size = 0.1):
    # 得到最初蛋的位置
    nests = generate_nests(n, m, lower_boundary, upper_boundary)
    fitness = calc_fitness(fit_func, nests)
    # 得到最好的巢的位置并更新
    best_nest_index = np.argmax(fitness)
    best_fitness = fitness[best_nest_index]
    best_nest = nests[best_nest_index].copy()

    for _ in range(iter_num):
        nests = update_nests(fit_func, lower_boundary, upper_boundary, nests, best_nest, fitness, step_size)
        nests = abandon_nests(nests, lower_boundary, upper_boundary, pa)
        fitness = calc_fitness(fit_func, nests)

        x=np.empty((n, 1))
        y=np.empty((n, 1))
        z=np.empty((n, 1))
        for i in range(20):
           x[i],y[i]=nests[i]
        z=3*(1-x)**2*np.e**(-x**2-(y+1)**2) - 10*(x/5-x**3-y**5)*np.e**(-x**2-y**2) - (np.e**(-(x+1)**2-y**2))/3
        if 'sca' in locals():
            sca.remove()
        sca = ax.scatter(x, y, z, c='black', marker='o');
        plt.show();
        plt.pause(0.1)        #ax.scatter特征值散点图

        max_nest_index = np.argmax(fitness)
        max_fitness = fitness[max_nest_index]
        max_nest = nests[max_nest_index]

        if (max_fitness > best_fitness):
            best_nest = max_nest.copy()
            best_fitness = max_fitness

    return (best_nest, best_fitness)


#生成巢穴位置
def generate_nests(n, m, lower_boundary, upper_boundary):
    lower_boundary = np.array(lower_boundary)  #转成矩阵形式
    upper_boundary = np.array(upper_boundary)
    nests = np.empty((n, m))                   #生成n行m列的数组

    for each_nest in range(n):
        nests[each_nest] = lower_boundary + np.array([np.random.rand() for _ in range(m)]) * (upper_boundary - lower_boundary) #生成在[-3,3]范围内的下x,y的n个样本,即20*2的矩阵

    return nests


#获取新的巢穴位置并用好的替换掉旧的不好的
def update_nests(fit_func, lower_boundary, upper_boundary, nests, best_nest, fitness, step_coefficient):
    lower_boundary = np.array(lower_boundary)
    upper_boundary = np.array(upper_boundary)
    n, m = nests.shape
    # 使用莱维飞行产生步长
    steps = levy_flight(n, m, 1.5)
    new_nests = nests.copy()

    for each_nest in range(n):
        # coefficient 0.01 is to avoid levy flights becoming too aggresive
        # and (nest[each_nest] - best_nest) could let the best nest be remained
        step_size = step_coefficient * steps[each_nest] * (nests[each_nest] - best_nest)
        step_direction = np.random.rand(m)
        new_nests[each_nest] += step_size * step_direction
        # apply boundary condtions
        new_nests[each_nest][new_nests[each_nest] < lower_boundary] = lower_boundary[new_nests[each_nest] < lower_boundary]
        new_nests[each_nest][new_nests[each_nest] > upper_boundary] = upper_boundary[new_nests[each_nest] > upper_boundary]

    new_fitness = calc_fitness(fit_func, new_nests)
    nests[new_fitness > fitness] = new_nests[new_fitness > fitness]

    return nests


#卵被丢弃寻找新巢
def abandon_nests(nests, lower_boundary, upper_boundary, pa):
    lower_boundary = np.array(lower_boundary)
    upper_boundary = np.array(upper_boundary)
    n, m = nests.shape
    for each_nest in range(n):
        if (np.random.rand() < pa):
            step_size = np.random.rand() * (nests[np.random.randint(0, n)] - nests[np.random.randint(0, n)])
            nests[each_nest] += step_size
            # apply boundary condtions
            nests[each_nest][nests[each_nest] < lower_boundary] = lower_boundary[nests[each_nest] < lower_boundary]
            nests[each_nest][nests[each_nest] > upper_boundary] = upper_boundary[nests[each_nest] > upper_boundary]

    return nests


#计算莱维飞行
def levy_flight(n, m, beta):
    sigma_u = (sc_special.gamma(1+beta)*np.sin(np.pi*beta/2)/(sc_special.gamma((1+beta)/2)*beta*(2**((beta-1)/2))))**(1/beta)
    sigma_v = 1

    u =  np.random.normal(0, sigma_u, (n, m))
    v = np.random.normal(0, sigma_v, (n, m))

    steps = u/((np.abs(v))**(1/beta))  #steps为20*2的矩阵

    return steps

#主函数
if __name__=='__main__':
    fig = plt.figure()    #绘制背景图
    ax = Axes3D(fig)
    plt.ion()#将画图模式改为交互模式,程序遇到plt.show不会暂停,而是继续执行
    plot_3d(ax)

    best_nest, best_fitness = cuckoo_search(25, 2, fit_func, [-3, -3], [3, 3], step_size = 0.4)

    print('最大值为:%.5f, 在(%.5f, %.5f)处取到!'%(best_fitness, best_nest[0], best_nest[1]))
    plt.ioff()    #将画图交互模式关闭
    plot_3d(ax)

运行后图像及结果如图所示
在这里插入图片描述

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

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

  • Oracle中expdp与impdp--导入和导出操作步骤

    Oracle expdp 与impdp 一 根据用户导出导入数据 用户和表空间都相同 这些命令必须在Oracle 工具执行 create directory dpdata1 as E oracle home product backup 这
  • 编写Linux设备驱动程序的注意事项

    编写设备驱动程序的注意事项 应用程序开发与驱动程序开发的差异 在Linux上的程序开发一般分为两种 xff0c 一种是内核及驱动程序开发 xff0c 另一种是应用程序开发 这两种开发种类对应Linux的两种状态 xff0c 分别是内核态和用
  • 单片机STM32F103RB,BLDC直流电机控制器设计,原理图、源码和电路方案

    基于STM32 BLDC直流无刷电机控制器设计 xff0c 并附上原理图和源码等 源代码是基于免费开源CoOS UCOS类似 操作系统上写的 xff0c 在学习无刷电机的控制同时还能学习到操作系统的知识 同时提供用Matlab的GUI编写的
  • 构建嵌入式Linux操作系统 Linux操作系统的介绍

    目前流行的嵌入式操作系统有Linux WinCE VxWorks等 Linux作为一种免费的类UNIX操作系统 xff0c 由于其功能强大 xff0c 在嵌入式产品的应用中非常广泛 Linux操作系统的介绍 Linux操作系统 Linux操
  • Linux内核子系统 内核配置选项

    Linux内核子系统 编写设备驱动程序 xff0c 涉及Linux内核的许多子系统 xff0c 了解这些子系统对于了解Linux操作系统和编写设备驱动程序都非常有用 这些主要的子系统包括进程管理 内存管理 文件管理 设备管理和网络管理 现对
  • Linux命令格式 帮助信息 man命令笔记

    命令的格式 打开终端的方式 ubuntu中的命令基本都是在终端执行的 1 桌面右击打开终端 2 ctrl 43 alt 43 t 3 搜索框 终端提示符 stu 64 shy virtual machine stu xff1a 用户名 sh
  • Linux系统 自动补全管道命令学习

    自动补全 输入命令的一部分 xff0c 然后按tab键 xff0c 就自动补全命令 xff0c 如果有多个相同开头的命令多按一次tab键 xff0c 它会将所有你输入开头的命令提示出来 例 xff1a ifconfig 输入 if 按两下t
  • C++简介 C语言编程原理

    C 43 43 简介 C 43 43 融合了3种不同的编程方式 xff1a C语言代表的过程性语言 C 43 43 在C语言基础上添加的类代表的面向对象语言 C 43 43 模板支持的泛型编程 本章将简要介绍这些传统 不过首先 xff0c
  • FTP命令不同系统之间传输文件

    有时可能需要在不同的系统 xff08 甚至不同类型的操作系统 xff09 之间传输文件 xff0c 如将微软的Windows系统中的文件传给Linux或UNIX系统 xff0c 或反过来将Linux或UNIX系统中的文件传给微软的Windo
  • NFC技术的定义通信方式

    NFC技术的定义 什么是NFC NFC xff08 Near Field Communication xff0c 近场通信 xff09 xff0c 是一种工作频率为13 56MHz xff0c 通信距离只有0 xff5e 20cm xff0
  • RFID系统工作原理

    RFID系统由两部分组成 xff0c 其工作原理 xff1a 应答器 xff1a 也称为电子标签 xff0c 由天线 耦合元件及芯片组成 一般来说 xff0c 都是用标签作为应答器 每个标签具有唯一的电子编码 xff0c 附着在物体上标识目
  • 一台linux服务器配置两个tomcat安装包

    准备前 xff1a 一台linux服务器 2个tomcat7应用包 xff08 tomcat 7 0 56 tomcat idc 开始配置 xff1a tomcat idc应用jdk配置绝对路径 tomcat 7 0 56应用jdk配相对路
  • NFC通信基本原理 主动和被动通信

    NFC通信基本原理 近场通信原理 对于天线产生的电磁场 xff0c 根据其特性的不同 xff0c 划分为三个不同的区域 xff1a 感应近场 辐射近场和辐射远场 它们主要通过与天线的距离来区分 感应近场区指最靠近天线的区域 在此区域内 xf
  • NFC协议概述

    NFC协议概述 NFC相关的标准化组织 ISO 国际标准化组织 xff08 International Organization for Standardization xff09 简称ISO xff0c 是世界上最大的非政府性标准化机构
  • 计算机网络

    计算机网络 计算机网络是利用通信线路和通信设备 xff0c 把地理上分散并且具有独立功能的多个计算机系统互相连接 xff0c 按照网络协议进行数据通信 xff0c 通过功能完善的网络软件实现资源共享的计算机系统集合 计算机网络的功能 计算机
  • html标签手册

    完整的HTML页面 x1f4d1 基础标签 x1f4d1 x1f4d1 x1f4d1 HTML lt DOCTYPE gt 声明 DOCTYPE声明必须是 HTML 文档的第一行 xff0c 位于 html标签之前 DOCTYPE 声明不是
  • BCD码的作用和实现

    内容部分摘抄于朱有朋老师 BCD码本质是对数字的一种编码 xff0c 用来解决这种问题 xff1a 由56得到0x56 或者反过来 也就是说我们希望十进制的56被编码成56 xff08 这里56不是十进制的56 xff0c 而是两个数字5和
  • window和虚拟机(Linux)通过串口通讯

    准备工具 虚拟串口驱动 虚拟机 xff08 我的是乌班图版本 xff09 串口调试助手 xff08 以上网上自己找来下载 xff09 利用虚拟机串口驱动添加2个虚拟串口 xff08 com1和com2 xff09 xff0c 然后打开串口调
  • 关于‘QByteArray::operator QNoImplicitBoolCast() const’ is private

    home hins Qt5 9 8 5 9 8 gcc 64 include QtCore qbytearray h 436 error QByteArray operator QNoImplicitBoolCast const is pr
  • Linux创建虚拟CAN

    创建 xff1a 加载vcan内核模块 sudo modprobe vcan创建虚拟CAN接口 sudo ip link add dev can0 type vcan xff08 can0就是你要创建的设备 xff09 将虚拟CAN接口处于

随机推荐

  • 解决ubuntu20.04 连接xshell显示ssh拒绝服务

    近两天在弄linux系统 xff0c 突然xshell就连接不上了 xff0c 连接的时候一直显示ssh拒绝访问 折腾几个小时总算解决了 xff0c 现对其进行记录 报错情况 xff1a 手动分界效果 首先看下本机IP和虚拟机设置的IP是否
  • C++文件的建立

    C 43 43 文件的建立 include include int main using namespace std ofstream ofs jar txt ios out ofs lt lt 小明 lt lt endl ofs lt l
  • DB2数据库的安装-for linux

    DB2的安装 1 安装DB2服务端 将db2v8 iso文件 FP6 tar 安装响应文件db2ese rsp 复制到 home install 目录下 root cd home install mkdir iso fp root moun
  • ROS学习笔记-Gazebo安装与闪退、卡顿问题解决

    1 安装 在安装完整版的ROS后 xff0c 就包括了Gazebo的安装了 xff0c 因此在终端输入下载指令时 xff0c 出现已存在的反馈信息 安装完整版ROS的指令是 xff1a sudo apt get install ros me
  • win10+vs2015+Intel RealSense D435i深度相机配置

    第一步 xff1a Intel RealSense D435i的SDK下载 链接 xff1a https pan baidu com s 1sIDlkbk8U9PFmJLhGJndxg 提取码 xff1a lppa 第二步 xff1a 测试
  • Vue中使用element-ui的el-dialog对话框,实现拖拽效果

    效果图 xff1a element ui的el dialog对话框 xff0c 没有拖拽移动的效果 xff0c 需要自定义指令来实现对话框拖拽 1 准备 xff1a 在准备一个vue组件 xff08 点击按钮弹出对话框 xff09 功能 x
  • 前端知识点(六):网页中有大量图片时加载很慢,如何优化?

    1 图片懒加载 在图片未可视区域加一个滚动条事件 xff0c 判断图片位置与浏览器顶端和页面的距离 xff0c 当图片到浏览器顶端的距离 xff0c 小于图片到页面的距离时 xff0c 优先加载 2 图片预加载 将当前展示图片的前一张和后一
  • 请求类型get,delete,post,put 的用法(传参)

    1 get delete传参 注意 xff1a xff08 1 xff09 传参格式 xff1a 96 URL key 61 value amp key2 61 value2 96 xff08 2 xff09 注意使用反引号 xff0c 而
  • 关于前端--RSA加密(对登录密码加密)

    安装 npm install jsencrypt 1 在utils文件中封装一个jsencrypt js文件 密匙对生成链接 xff1a http web chacuo net netrsakeypair import JSEncrypt
  • Vue+Uniapp实现直播功能(推流拉流)

    提示 xff1a 前言 目前有一个项目 需要做一个APP和一个PC端网页 xff0c 主要功能是类似直播 xff0c 经查阅资料 xff0c 可采用uniapp 43 vue 43 推流拉流的技术 xff0c 前端使用uniapp打开摄像头
  • web菜单--自定义样式

    1 文件src styles variables scss 定义变量 sidebar menuText var menuText bfcbd9 menuActiveText var menuActiveText 409EFF subMenu
  • vue3拖拽布局+动态组件+自适应布局

    1 拖拽布局插件 Vue Grid Layout 适用Vue js的栅格布局系统 可拖动和可调整大小栅格布局的Vue组件 https jbaysolutions github io vue grid layout zh 在package j
  • webrtc视频播放器(ZLMRTCClient.js)

    引言 在播放实时视频时 xff0c 视频播放器一般会有延迟 xff0c 此时 xff0c 就可以使用webrtc来拉流 xff0c 延迟在1s或者基本没有延迟 与zlm配套的rtc js客户端 国标 1 开源项目地址 ZLMRTCClien
  • python3字符串格式化

    python 3 字符串格式化 字符串格式化 Python的字符串格式化有两种方式 百分号方式 format方式 百分号的方式相对来说比较老 xff0c 而format方式则是比较先进的方式 xff0c 企图替换古老的方式 xff0c 目前
  • PDU 发送短信1

    使用PDU模式 xff0c 包含UDH头信息分割短信 xff0c 用户数据头UDH 61 00表示长短信拆分 贴一个转来的PDU学习笔记 xff0c 网上收藏的 关于PDU其实并不难 xff0c 至于PDU是什么 xff0c 不管它 xff
  • 在elementUI中格式化信息几种方式

    1 组件自带的格式化方法 2 全局注册过滤器 3 用el switch 这三列的数据需要格式化 lt el table border data 61 34 list 34 gt lt el table column label 61 34
  • 第八届蓝桥杯客观题答案

    解析 2 OC门又叫集电极开路门 5 地线也算信号线 6 RS232 不能调试下载吧 xff1f JATG 4线 xff08 不用VCC xff09 SWJ 5线 SPI 不是下载线 xff0c 通信用的 xff0c 而且也有五根 7 答案
  • Python学习笔记:Pyqt5鼠标键盘事件处理

    import sys from PyQt5 QtCore import from PyQt5 QtGui import from PyQt5 QtWidgets import class windows QMainWindow def in
  • c++成员函数后面加一个冒号:

    冒号后跟着的是赋值操作 xff0c 这种写法是c 43 43 的特性 比如 xff0c LRUcache int capacity cap capacity 相当于 LRUcache int capacity cap 61 capacity
  • python---布谷鸟搜索算法

    布谷鸟搜索算法 xff08 Cuckoo Search xff0c CS xff09 布谷鸟算法的启发当然来自于布谷鸟 xff0c 因为布谷鸟这种鸟很有意思 xff0c 生出来的孩子自己不养 xff0c 直接被扔到其他鸟的鸟巢中去了 xff