基于布谷鸟搜索算法的函数寻优算法

2023-05-16

文章目录

  • 一、理论基础
    • 1、算法原理
    • 2、算法流程图
  • 二、Matlab代码
  • 三、参考文献

一、理论基础

1、算法原理

布谷鸟采用一种特殊的寄生宿主巢穴的方式孕育繁殖,它将孵育的蛋置入寄生宿主的巢穴,让寄生宿主孵化布谷鸟蛋。由于布谷鸟幼雏能发出比寄生宿主幼雏更闪亮的叫声,因此获得更多的食物,具有更高的存活率。在某些情形下,寄生宿主发现巢穴内不是宿主幼雏,则会遗弃该巢穴,并重新选择新的巢穴孵育繁殖。Yang X. S.和Deb等人基于上述孵育寄生机理,提出布谷鸟搜索算法。它遵循以下3个理想规则。
规则1. 每只布谷鸟1次有且仅有孵化1个蛋,并随机选择1个寄生宿主巢穴存放。
规则2. 在随机选择的1个寄生宿主巢穴中,最优的寄生宿主巢穴将被保留至下一代。
规则3. 可利用的寄生宿主巢穴数量是固定的,1个寄生宿主巢穴的宿主发现寄生布谷鸟蛋的概率为 P a P_a Pa
基于上述3个理想规则,可以得到1个宿主巢穴代表1个候选解。因此,布谷鸟算法的基本算法流程包含3部分:首先,在当前候选解的基础上,以Levy飞行随机游动生成新的候选解,评价并保留较好的候选解;其次,按照发现概率 P a P_a Pa舍弃部分候选解;最后,按照偏好随机游动方式产生新的候选解并替代舍弃的解,保留较好解后进入下一次进化,直至满足算法的收敛条件。
设布谷鸟算法进化至第 r r r代时第 m m m个候选解为 X r , m \boldsymbol{X}_{r,m} Xr,m X r , m = ( x r , m ( 1 ) , x r , m ( 2 ) , ⋯   , x r , m ( j ) , ⋯   , x r , m ( D ) ) , j ∈ [ 1 , D ] \boldsymbol{X}_{r,m}=(x_{r,m}^{(1)},x_{r,m}^{(2)},\cdots,x_{r,m}^{(j)},\cdots,x_{r,m}^{(D)}),j\in[1,D] Xr,m=(xr,m(1),xr,m(2),,xr,m(j),,xr,m(D)),j[1,D]。采用Levy飞行随机游动产生新的个体(候选解) X r + 1 , m \boldsymbol{X}_{r+1,m} Xr+1,m更新的表达式为 X r + 1 , m = X r , m + ( X r , m − X r , g b ) ⋅ ( γ 0 ⊕ L ( β ) ) (1) \boldsymbol{X}_{r+1,m}=\boldsymbol{X}_{r,m}+(\boldsymbol{X}_{r,m}-\boldsymbol{X}_{r,gb})\cdot(\gamma_0\oplus L(\beta))\tag{1} Xr+1,m=Xr,m+(Xr,mXr,gb)(γ0L(β))(1)其中, X r , g b \boldsymbol{X}_{r,gb} Xr,gb为当前搜索到的全局最优解, L ( β ) L(\beta) L(β)表示Levy飞行随机游动的路径, γ 0 \gamma_0 γ0表示初始搜索步长, ⊕ \oplus 表示点对点乘法, t t t为飞行时间: L ( β ) ∼ ϑ = t − 1 − β , 0 < β ≤ 2 (2) L(\beta)\sim\vartheta=t^{-1-\beta},0<\beta≤2\tag{2} L(β)ϑ=t1β,0<β2(2)通过数学代换,式(2)等价于: L ( β ) ∼ ϑ ∣ ν ∣ 1 / β ( Γ ( 1 + β ) s i n ( π ⋅ β / 2 ) Γ ( 1 + β 2 ) ⋅ β ⋅ 2 ( β − 1 ) / 2 ) 1 / β (3) L(\beta)\sim\frac{\vartheta}{|\nu|^{1/\beta}}\left(\frac{\Gamma(1+\beta)sin(\pi\cdot\beta/2)}{\Gamma\left(\frac{1+\beta}{2}\right)\cdot\beta\cdot2^{(\beta-1)/2}}\right)^{1/\beta}\tag{3} L(β)ν1/βϑΓ(21+β)β2(β1)/2Γ(1+β)sin(πβ/2)1/β(3)其中, Γ ( ⋅ ) \Gamma(\cdot) Γ()为伽马函数,取 β = 1.5 \beta=1.5 β=1.5 ϑ , ν \vartheta,\nu ϑ,ν为标准高斯分布随机数。
在偏好随机游动方式中,按照发现概率 P a P_a Pa舍弃部分候选解后,生成相同数量的新解: X r + 1 , m = X r , m + ϕ ⋅ ( X r , k − X r , s ) (4) \boldsymbol{X}_{r+1,m}=\boldsymbol X_{r,m}+\phi\cdot(\boldsymbol X_{r,k}-\boldsymbol X_{r,s})\tag{4} Xr+1,m=Xr,m+ϕ(Xr,kXr,s)(4)其中, ϕ \phi ϕ为算法的控制缩放系数,满足 ϕ ∈ U ( 0 , 1 ) \phi\in U(0,1) ϕU(0,1) X r , k \boldsymbol X_{r,k} Xr,k X r , s \boldsymbol X_{r,s} Xr,s分别为第 r r r代时第 k k k个和第 s s s个随机候选解。

2、算法流程图

根据以上分析,布谷鸟搜索算法流程图如图1所示。
在这里插入图片描述

图1 布谷鸟搜索算法流程图

二、Matlab代码

以Sphere函数为目标函数,种群规模 N = 30 N=30 N=30,发现概率 P a = 0.25 P_a=0.25 Pa=0.25,维数 d i m = 30 dim=30 dim=30,上下限为 [ − 100 , 100 ] [-100,100] [100,100],最大迭代次数 M a x _ i t e r = 1000 Max\_iter=1000 Max_iter=1000。完整程序如下:

%% 清除环境变量
clear;
clc;

%% CS参数
% 种群规模(鸟巢数量)
N = 30;
% 发现概率
pa = 0.25;

Max_iter = 1000;     % 最大迭代次数
% 边界
dim = 30;                     % 维数
Lb = -100*ones(1, dim);    % 下限
Ub = 100*ones(1, dim);     % 上限

% 随机初始化种群位置
for i = 1:N
    nest(i, :) = Lb+(Ub-Lb).*rand(1, dim);
end
% 初始最优解
fitness = 10^10*ones(N, 1);
[fmin, bestnest, nest, fitness] = get_best_nest(nest, nest, fitness);

% N_iter = 0;
%% 迭代寻优
for iter = 1:Max_iter
    %% 通过莱维飞行得到新个体
    beta = 3/2;
    sigma = (gamma(1+beta)*sin(pi*beta/2)/(gamma((1+beta)/2)*beta*2^((beta-1)/2)))^(1/beta);
    for i = 1:N
        s = nest(i, :);
        % 用蒙特卡洛方法模拟莱维飞行
        u = randn(size(s))*sigma;
        v = randn(size(s));
        step = u./abs(v).^(1/beta);
        stepsize = 0.01*step.*(s-bestnest);
        s=s+stepsize.*randn(size(s));
        % 边界处理
        new_nest(i, :) = simplebounds(s, Lb, Ub);
    end
    % 新个体和旧个体适应度值贪婪比较,选取最优个体
    [fnew, best, nest, fitness] = get_best_nest(nest, new_nest, fitness);
    %      % 更新计数器
    %      N_iter = N_iter+N;
    % 发现和随机化
    new_nest = empty_nests(nest, Lb, Ub, pa) ;
    
    % 新个体和旧个体适应度值贪婪比较,选取最优个体
    [fnew, best, nest, fitness] = get_best_nest(nest, new_nest, fitness);
    %      % 再次更新计数器
    %      N_iter = N_iter+N;
    % 更新全局最优解
    if fnew < fmin
        fmin = fnew;
        bestnest = best;
    end
    %% 记录每代最优解
    Curve(iter) = fmin;
    %% 显示每代优化结果
    display(['CS:At iteration ', num2str(iter), ' the best fitness is ', num2str(fmin)]);
end

%% Display all the nests
% disp(strcat('Total number of iterations=', num2str(N_iter)));
%% 最终结果显示
disp(['最终位置:' , num2str(bestnest)]);
disp(['最终函数值:', num2str(Curve(end))]);
%% 绘图
figure;
plot(Curve, 'r', 'lineWidth', 2);          %  画出迭代图
xlabel('迭代次数', 'fontsize', 12);
ylabel('目标函数值', 'fontsize', 12);

%% ---------------下面列出了所有子函数------------------
%% 发现最优位置
function [fmin, best, nest, fitness] = get_best_nest(nest, newnest, fitness)
for j = 1:size(nest,1)
    fnew = fobj(newnest(j,:));
    if fnew <= fitness(j)
        fitness(j) = fnew;
        nest(j, :) = newnest(j, :);
    end
end
% Find the current best
[fmin, K] = min(fitness) ;
best = nest(K, :);
end
%% 通过构造新的个体来替代某些个体
function new_nest = empty_nests(nest, Lb, Ub, pa)
% 一小部分更糟的巢穴被发现的概率为pa
n = size(nest, 1);
% 发现与否——一个状态向量
K = rand(size(nest)) > pa;

% 有偏/选择随机游动的新解
stepsize = rand*(nest(randperm(n), :)-nest(randperm(n), :));
new_nest = nest+stepsize.*K;
for j = 1:size(new_nest, 1)
    s = new_nest(j, :);
    new_nest(j, :) = simplebounds(s, Lb, Ub);
end
end

%% 边界处理
function s = simplebounds(s,Lb,Ub)
% Apply the lower bound
ns_tmp = s;
I = ns_tmp<Lb;
ns_tmp(I) = Lb(I);

% Apply the upper bounds
J = ns_tmp>Ub;
ns_tmp(J) = Ub(J);
% Update this new move
s = ns_tmp;
end

%% 目标函数
function z = fobj(u)
z=sum(u.^2);
end

最终位置和最优目标函数值为:

最终位置:0.021557    0.013997  -0.0038913   -0.013907  -0.0087341  -0.0013441  -0.0057873 -0.00091699 -0.00034563  -0.0085162   0.0015167   -0.018136  -0.0040665   -0.023025  -0.0067345  -0.0085958   0.0082373    -0.02232   0.0056112  -0.0089819  -0.0025091    0.013316  0.00094574 -0.00045218    0.012714   -0.011097    0.012178    0.012474    0.010687  -0.0091615
最终函数值:0.0037011

进化曲线如图2所示。
在这里插入图片描述

图2 CS算法进化曲线

三、参考文献

[1] Yang X S, Deb S. Engineering Optimisation by Cuckoo Search[J]. International Journal of Mathematical Modelling & Numerical Optimisation, 2010, 1(4): 330-343.
[2] 刘晓东, 孙丽君, 陈天飞. 布谷鸟算法的收敛性分析及性能比较[J]. 计算机科学与探索, 2020, 14(10): 1644-1655.
[3] 傅文渊. 具有万有引力加速机理的布谷鸟搜索算法[J]. 软件学报, 2021, 32(5): 1480-1494.

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

基于布谷鸟搜索算法的函数寻优算法 的相关文章

  • git bash可以正常commit,但是 VSCode 里不能正常commit使用的解决方法

    问题描述 同一路径下的源码 xff0c 使用git bash可以正常commit xff0c 但是使用vscode提交commit就会一直卡住 xff0c 转圈圈 参考方案链接 xff1a VS CODE GIT 500 问题处理 pudn
  • 组合导航(四):惯性导航系统

    1 惯性导航系统的物理平台2 惯性测量单元IMU3 惯性传感器的测量值3 1静止状态下的加速度测量3 2静止与运动状态下的角速度测量 4 惯性传感器误差4 1 系统误差 xff08 可通过实验进行校正 xff09 4 2 随机误差4 3 惯
  • 组合导航(七):卡尔曼滤波

    Kalman滤波1 离散卡尔曼滤波2 卡尔曼滤波的流程2 1 预测与时间更新2 2 测量更新与校正 3 卡尔曼滤波 算法步骤4 非线性卡尔曼滤波4 1 线性化kalman滤波4 2 扩展kalman滤波 5 卡尔曼滤波发散控制5 1 KF过
  • 组合导航(八):INS/GPS组合导航

    INS GPS组合导航1 误差反馈1 1 开环INS GPS架构1 2 闭环INS GPS架构 2 组合导航的类型2 1 松耦合 的INS GPS组合导航2 2 紧耦合 的INS GPS组合导航2 3 深度耦合的 INS GPS组合导航 3
  • 组合导航(九):三维简化的INS/GPS组合导航系统

    简化INS与GPS组合系统在三维路面上的导航1 MEMS级IMU的三维定位的性能分析2 解决MEMS级IMU在路面导航中存在的问题3 三维简化的惯性传感器系统3 1 3D RISS概述3 2 xff08 轮式车辆 xff09 采用3D RI
  • PX4安装与编译

    第一步 xff1a 下载源码 下载方式一 xff1a git clone https github com PX4 Firmware git recursive 默认下载版本为master 下载时间比较长 xff0c 包含各种包以及依赖工具
  • PX4:【系统架构】

    PX4系统架构 由两个层组成 xff1a 一是飞行控制栈 xff08 flight stack xff09 二是中间件 xff08 middleware xff09 flight stack xff1a 集成了各种自主无人机的制导 导航以及
  • PX4:【uORB通讯机制】

    uORB xff1a Micro Object Request Broker PX4进程间的通讯机制 xff1a 多对多的信息发布与订阅方式 发布消息 xff1a 1 公告 advertise xff1a 相当于初始化 xff0c 在发布消
  • PX4:【传感器校准】

    sensor的校准校准步骤 xff1a 文件目录 xff1a 代码入口 xff1a 求解模型计算公式 sensor的校准 校准步骤 xff1a 首先通过地面站QGC进行校准 xff0c QGC将校准参数设置到sh文件中 此后再基于QGC的校
  • PX4:【sensor_combined】

    功能介绍消息内容sensor combined 产生机制 amp 代码流程 功能介绍 sensor combined 是一个冗余传感器集合的消息 xff0c 通过订阅多个传感器的数据 xff0c 将冗余的数据经过VoteSensorsUpd
  • PX4:【地面站传感器数据校准】

    上电 gt rsC 运行 sensor start commander start 入口函数 xff1a 位于commander文件夹中 Commader cpp Commander run xff08 xff09 commander lo
  • Windows和Linux双系统安装教程

    最近刚刚完成了Windows和Linux双系统 xff08 这里以Ubuntu安装为例 xff09 的安装 xff0c 应某奔同学要求 xff0c 这里简单记录下安装过程 系统启动盘准备Windows系统安装分出给Linux系统的磁盘空间安
  • MSCKF系列论文阅读与代码流程

    MSCKF原理与代码总结 算法原理前端理论 xff08 图像的特征提取与跟踪 xff09 后端理论 xff08 误差状态卡尔曼滤波模型 xff09 1 IMU状态预测1 1 IMU状态传播 xff08 p v q 4阶Runge Kutta
  • open_vins(二):rosbag精度测试

    一 xff0e ros读取与轨迹保存二 xff0e euroc数据集测试三 结论 一 xff0e ros读取与轨迹保存 运行open vins launch 读取ros数据包 xff1a roslaunch pgeneva ros eth
  • open_vins(三):imu静止初始化

    一 xff0e 静止初始化原理二 xff0e 理论公式三 xff0e 相关代码四 xff0e 小结 xff1a 初始化是指在系统启动阶段 xff0c 需要估计重力方向 gravity direction 加速度计以及陀螺仪biases ac
  • ros数据集录制:rosbag record

    1 查看话题 查看topic列表 xff1a rostopic list 打印topic内容 xff1a rostopic echo topic xff12 话题录制rosbag record 用于在ros系统中录取系统中其他ros节点发出
  • git pull的时候:您对下列文件的本地修改将被合并操作覆盖,请在合并前提交或贮藏您的修改。 正在终止

    使用git pull的时候报错 xff1a 更新 span class token number 008728 span e span class token punctuation span span class token number
  • 使用webpack-dev-server自动打包并实现debug调试

    webpack dev server 是一个开发服务器 xff0c 它的功能就是可以实现热加载 xff0c 并且自动刷新浏览器 准备工作 xff1a 创建一个程序目录test xff0c 将html页面拷贝进来 xff0c 在目录下新建sr
  • ROS实现串口GPS数据的解析与通信

    1 配置串口 配置串口时 xff0c 利用ROS自带的serial功能包进行串口数据的读取 xff0c 具体来说就是创建一个串口对象 xff0c 用成员函数read进行读取 xff0c 需要注意的是其中Timeout的设置以及read在调用
  • sumo之使用netedit绘制路网并进行简单模拟

    1 基本路网的构建 xff08 十字路口 xff09 在下载完成sumo后 xff0c bin目录下有一个可以运行的nete exe xff0c 点击可以进入界面进行路网的编辑 xff0c 编辑生成 net xml文件 点击进去后 xff0

随机推荐

  • sumo之模拟行人

    在前面的文章中介绍了模拟车辆以及交通工具 公共汽车 xff0c 在道路上除了车辆外还有行人参与 在本文中介绍添加行人 详细的方法和参数可以前往官网查看 本部分的模拟路网全部沿用上次公共汽车模拟的环境 xff0c 只需要对部分代码进行修改 首
  • 【开发工具】VScode连接远程服务器+设置免密登录

    文章目录 前言连接远程服务器免密登录注意事项参考资料 前言 本文介绍如何使用VScode搭建自己的远程开发平台 xff0c 以便于我们可以随时拿着自己心爱的PC xff0c 去开发让自己脱发的项目 连接远程服务器 首先 xff0c 我们去官
  • 2.3、Segment Routing基础之IGP Segment 类型详解

    本文将重点介绍IGP Segment 分发场景下常见的几种Segment类型 xff0c 同时为各位介绍了这些Segment类型在在Segment Routing转发过程中的转发动作以及转发特性 本文将对各位理解Segment Routin
  • IDEA日常填坑:Cannot resolve plugin org.apache.maven.plugins:maven-war-plugin

    问题描述 xff1a 我太难了o o xff0c 这个问题竟然困扰了我一个下午加上一个晚上 xff0c 为了解决它 xff0c 估计浏览器都要被我弄崩了吧 xff0c 此前我将所能找到的方法全都试了个遍 xff0c 甚至是将 IDEA 卸载
  • 判断点在多边形内(射线法)

    射线法 用来判断点在多边形的内外 适用于任意多边形 时间复杂度 xff1a O n 从该点引出一条水平射线 xff0c 观察射线与多变形的交点个数 当射线与多边形的交点个数是奇数时 xff0c P在多边形内 偶数时 xff0c P在多边形外
  • 线性判别分析(Linear Discriminant Analysis, LDA)(含类内散度矩阵 类间散度矩阵 全局散度矩阵推导

    LDA算法概述 xff1a 线性判别式分析 Linear Discriminant Analysis LDA xff0c 也叫做Fisher线性判别 Fisher Linear Discriminant FLD xff0c 是模式识别的经典
  • Fuzzy C-Means Clustering(模糊C均值)

    别看了 有错的 我懒得改了 强推https www bilibili com video BV18J411a7yY t 61 591 看完你还不会那我也没办法了 算法原理 模糊c 均值聚类算法 fuzzy c means algorithm
  • Last-Modified / If-Modified-Since / ETag / If-None-Match 的区别

    看一圈全都是 Last Modified和HTTP IF MODIFIED SINCE只判断资源的最后修改时间 xff0c 而ETags和If None Match可以是资源任何的属性 我 好像说了什么又好像什么也没说 修改 资源的任何属性
  • 计算机网络安全(通信机密性、完整性、数字签名、公钥认证、SSL)

    1 提供通信机密性 1 1 RSA RSA有两个互相关联的部分 xff1a 公钥和私钥的选择加密和解密算法 为了生成RSA的公钥和私钥 xff0c Bob执行如下步骤 xff1a 选择两个大素数 p p p 和 q
  • 网卡出现“Windows 仍在设置此设备的类配置。 (代码 56)“

    原因 xff1a vmware惹的祸 1 下载cclean修复注册表 xff08 尝试无效 cclean下载网址 2 键盘按win 43 r xff0c 弹出运行窗口 xff0c 输入 redegit xff0c 进入注册表 xff0c 删
  • datax实现mysql数据同步到oracle

    一 mysql数据同步到oracle 注意 xff1a mysql不区分大小写 xff0c 但是oracle严格区分大小写 xff0c 并且oracle的库名 表名和字段名要用大写 xff0c 如果用的小写需要添加双引号说明 job set
  • 在gazebo仿真环境下对相机和激光雷达的标定

    相机和激光雷达的标定主要是为了得到两者之间的参数 xff0c 包括相机的内参和雷达到相机的外参 这样便可以完成点云到图像的投影 xff0c 从而完成信息融合 实际上gazebo中这些参数都是真值 xff0c 是不需要标定的 xff1a 相机
  • 深度学习模型过拟合问题解决办法

    深度学习模型过拟合问题解决办法 模型过拟合 xff08 如果训练集上精度比测试集上精度高很多 xff0c 说明发生了过拟合 xff09 如上图所示拟合曲线 1 图一的拟合较为简单 xff0c 不能很好的反应出变化关系 xff0c 欠拟合 2
  • strchr()函数

    如果需要对字符串中的单个字符进行查找 xff0c 那么应该使用 strchr 或 strrchr 函数 其中 xff0c strchr 函数原型的一般格式如下 xff1a char strchr const char s int c 它表示
  • MapReduce之Map阶段

    MapReduce阶段分为map xff0c shuffle xff0c reduce map进行数据的映射 xff0c 就是数据结构的转换 xff0c shuffle是一种内存缓冲 xff0c 同时对map后的数据分区 排序 reduce
  • 嵌入式开发常用的三种通信协议串口通信、SPI和IIC

    常用的三种通信协议串口通信 SPI和IIC 文章目录 常用的三种通信协议串口通信 SPI和IIC一 通信分类1 1 同步通信和异步通信1 2 单工通信 半双工通信和全双工通信1 3 串行通信与并行通信 二 串口通信2 1 UART2 2 R
  • HTML 解决css缓存

    span class token operator lt span link rel span class token operator 61 span span class token string 34 stylesheet 34 sp
  • Ubuntu18.04安装Nvidia显卡驱动教程

    0 前期准备 禁用BIOS的secure boot xff0c 即disable它 xff0c 如果不关闭 xff0c 使用第三方源安装显卡驱动会安装后不能使用 1 禁用nouveau 1 创建文件 xff0c 如果没有下载vim编辑器 x
  • VINS之estimator节点小结

    VINS的核心节点 xff0c 包括VIO的初始化过程 紧耦合的非线性化过程 边缘化处理过程 主要流程步骤 1 主函数线程 订阅了四个topic xff0c 分别调用回调函数 xff1b 创建了13个话题发布器 xff1b 开辟了一个VIO
  • 基于布谷鸟搜索算法的函数寻优算法

    文章目录 一 理论基础1 算法原理2 算法流程图 二 Matlab代码三 参考文献 一 理论基础 1 算法原理 布谷鸟采用一种特殊的寄生宿主巢穴的方式孕育繁殖 它将孵育的蛋置入寄生宿主的巢穴 xff0c 让寄生宿主孵化布谷鸟蛋 由于布谷鸟幼