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

article/2025/10/5 7:56:02

文章目录

  • 一、理论基础
    • 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:Nnest(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:Ns = 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 < fminfmin = 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.


http://chatgpt.dhexx.cn/article/12EBA4RD.shtml

相关文章

布谷鸟算法(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…

CS231n_learn

CS231n CS 程序&#xff1a;https://cs.stanford.edu/people/karpathy/convnetjs/demo/cifar10.html CS 课件http://cs231n.stanford.edu/slides/2017/&#xff1a; CS 课程首页&#xff1a;http://cs231n.stanford.edu/ CS 附带教程网页版&#xff1a;https://cs.stanford…

csp-202203

202203 题目一&#xff1a;未初始化警告【100分】题目二&#xff1a;出行计划【100分】题目三&#xff1a;计算资源调度器 【100分】 题目一&#xff1a;未初始化警告【100分】 简单数组操作题 #include<iostream> using namespace std; int n,k; bool ready[10000000]…

【CS231n系列】

Stanford-cs231n课程学习笔记&#xff08;一&#xff09; Stanford课程原版是英文&#xff0c;奈何本人英语菜的一批。原版网站放在下面&#xff0c;xdm可以多多学习。BUT&#xff01; B站up<同济子豪兄>yyds好吧&#xff01;&#xff01;&#xff01; Stanford231n 文章…

斯坦福CS230官方指南:CNN、RNN及使用技巧速查(打印收藏)

向AI转型的程序员都关注了这个号&#x1f447;&#x1f447;&#x1f447; 机器学习AI算法工程 公众号&#xff1a; datayx 作为全球计算机四大名校之一&#xff0c;斯坦福大学的CS230《深度学习》课程一直受到全球计算机学子和从业人员的热烈欢迎。 CS230授课人为全球著名计算…