布谷鸟算法的程序(个人注释)

article/2025/10/5 4:39:04
最近项目需要,所以一直在研究布谷鸟算法,在网上看了一些前辈的文章,原理讲的都比较透彻,我就不再赘述。
贴上一个自己注释的程序吧(这个程序也是借鉴别的大佬的,小小的做了一些修改)
我也是最近才接触布谷鸟算法,肯定有欠妥之处,希望各位大佬多多批评指正,相互学习~~
function [bestnest,fmin]=cuckoo_search(n)
if nargin<1,%【如果变量的个数小于1】
% Number of nests (or different solutions)
n=15;%【则把种群数量设为15,种群数量越多,最后算法的求解越精确,但程序的运行时间也会大大拉长】
end
% Discovery rate of alien eggs/solutions
pa=0.25;%【布谷鸟蛋被发现的概率】
%% Change this if you want to get better results
% Tolerance
Tol=1.0e-5;  %阈值【循环的精度设置】
%% Simple bounds of the search domain
nd=6; %【需要寻优的参数个数,即搜索空间维度为nd】
% Lower bounds【鸟窝范围的下限】
Lb=-100*ones(1,nd);
% Upper bounds【鸟窝范围的上限】
Ub=100*ones(1,nd);
% Random initial solutions【把鸟窝的初始值设为随机值,即初始化所有鸟窝的位置】
nest=zeros(n,nd);     %【nest为n行nd列的零矩阵,先把最初的鸟巢设为零矩阵】
for i=1:n,%【这是个1~n的循环,把每个种群中的每个鸟窝初始化为随机数】
nest(i,:)=Lb+(Ub-Lb).*rand(size(Lb));
end
% Get the current best【寻找当前最优的巢穴】
fitness=10^10*ones(n,1);%【寻优域的范围设置】
[fmin,bestnest,nest,fitness]=get_best_nest(nest,nest,fitness);
N_iter=0;%【计数器初始化】
%% Starting iterations【开始迭代】
while (fmin>Tol),%【只要没达到这个精度,循环就会一直进行】% Generate new solutions (but keep the current best)%【产生一个最优解,并保留原最优解】new_nest=get_cuckoos(nest,bestnest,Lb,Ub);   %【寻找当前最优的巢穴】[fnew,best,nest,fitness]=get_best_nest(nest,new_nest,fitness);%【找到最佳巢穴】% Update the counter【计数器更新】N_iter=N_iter+n; %【因为每次都要遍历所有巢穴,所以在这里每次迭代都要+n次,表示搜寻了这么多次】% Discovery and randomization【布谷鸟蛋被发现,并通过莱维飞行(即随机游走)来替换这些被发现概率较大的劣质巢穴】 new_nest=empty_nests(nest,Lb,Ub,pa) ;%【用莱维飞行更新其余鸟窝位置】% Evaluate this set of solutions%【在更新后的鸟窝数据中再次找到最佳巢穴】[fnew,best,nest,fitness]=get_best_nest(nest,new_nest,fitness);% Update the counter again【计数器再次更新】N_iter=N_iter+n;% Find the best objective so far【找到当前的最优值】if fnew<fmin,%【如果新鸟窝与目标鸟窝之间的的距离更近(即误差精度更小更准确)】fmin=fnew;%【则用新的鸟窝的值替换原fmin中的数据】bestnest=best;%【并且把此鸟窝下的各个参数的最优解赋给bestnest】end
disp(strcat('Total number of iterations=【当前已进行的迭代寻优次数】',num2str(N_iter)));
fmin
bestnest
end %% End of iterations【结束布谷鸟寻优进程】%% Post-optimization processing
%% Display all the nests【循环内外各写一遍就是为了看它不断迭代的过程以及最终结果】
disp(strcat('Total number of iterations=【迭代寻优的总次数】',num2str(N_iter)));
fmin
bestnest
figure;   %【出现最终n个曲线的图(n就是鸟窝个数)】
plot(nest);
xlabel '鸟巢的个数'      %【x轴的名称】
ylabel '待定参数的估计值'     %【y轴的名称】%% --------------- All subfunctions are list below ------------------
%% Get cuckoos by ramdom walk【用随机游走来加强布谷鸟算法】【莱维飞行】
function nest=get_cuckoos(nest,best,Lb,Ub)
% Levy flights【莱维飞行,是个固定程式,固定的给出随机数的公式模型,无须修改,了解即可】
%【当然,如果要进行算法改进可以在这里做文章,比如用柯西来替代莱维飞行,就是基于柯西原理的改进的布谷鸟算法】
%【莱维飞行本质上是一个基于马尔科夫链(下一状态取决于当前状态)的随机行走公式】
%【莱维飞行可以使布谷鸟寻优综合局部寻优和全局寻优】
n=size(nest,1);%【n是一个nest行1列的列向量】
% Levy exponent and coefficient
% For details, see equation (2.21), Page 16 (chapter 2) of the book
% X. S. Yang, Nature-Inspired Metaheuristic Algorithms, 2nd Edition, Luniver Press, (2010).
beta=3/2;
sigma=(gamma(1+beta)*sin(pi*beta/2)/(gamma((1+beta)/2)*beta*2^((beta-1)/2)))^(1/beta);%【sigma这个数约等于0.7】
for j=1:n,s=nest(j,:);% This is a simple way of implementing Levy flights% For standard random walks, use step=1;%% Levy flights by Mantegna's algorithm%【randn函数是产生均值为0,方差σ^2 = 1,标准差σ = 1的正态分布的随机数或矩阵的函数。】u=randn(size(s))*sigma;%【产生一个sigma倍的随机数行向量,做一个正态分布】v=randn(size(s));%【产生一个随机数行向量,也是做一个正态分布】step=u./abs(v).^(1/beta);%【矩阵之间进行元素上的点乘除运算】% In the next equation, the difference factor (s-best) means that% when the solution is the best solution, it remains unchanged.    stepsize=0.01*step.*(s-best);%【依旧是数值运算】% Here the factor 0.01 comes from the fact that L/100 should the typical% step size of walks/flights where L is the typical lenghtscale;% otherwise, Levy flights may become too aggresive/efficient,% which makes new solutions (even) jump out side of the design domain% (and thus wasting evaluations).% Now the actual random walks or flightss=s+stepsize.*randn(size(s));%【s作为随机游走的步长】% Apply simple bounds/limitsnest(j,:)=simplebounds(s,Lb,Ub);%【获得交替比较上下限的值】
end
%% Find the current best nest【找到当前最佳巢穴】
function [fmin,best,nest,fitness]=get_best_nest(nest,newnest,fitness)
% Evaluating all new solutions【计算所有的新解】
for j=1:size(nest,1),%【j从1循环到nest的行数】fnew=fobj(newnest(j,:));%【在目标函数中进行运算 ,并把z的值赋值给fnew】if fnew<=fitness(j),%【这个if语句用来判断是否满足精度,若更好则替换】fitness(j)=fnew;nest(j,:)=newnest(j,:);end
end
% Find the current best
[fmin,K]=min(fitness) ;%【fmin记录列向量fitness的每列的最小值,K记录每列最小值的行号】
best=nest(K,:);%【获得当前最好的巢穴的值】
%% Replace some nests by constructing new solutions/nests【通过构建新巢更换一些容易被发现的劣质巢】
function new_nest=empty_nests(nest,Lb,Ub,pa)
% A fraction of worse nests are discovered with a probability pa【劣质巢穴会以pa的概率被淘汰】
n=size(nest,1);
% Discovered or not -- a status vector【发现与否——状态向量】
K=rand(size(nest))>pa;%【如果产生的随机数大于pa的值,就令K等于该值】
% In the real world, if a cuckoo's egg is very similar to a host's eggs, then
% this cuckoo's egg is less likely to be discovered, thus the fitness should
% be related to the difference in solutions.  Therefore, it is a good idea
% to do a random walk in a biased way with some random step sizes. 
% New solution by biased/selective random walks【加入随机行走的新解集】
stepsize=rand*(nest(randperm(n),:)-nest(randperm(n),:));
%randperm会将数字顺序随机打乱,将1~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
% Application of simple constraints【简单约束的应用,这个函数是包含在莱维飞行中的】
function s=simplebounds(s,Lb,Ub)%【这个函数就是交替比较上下限】% Apply the lower bound【下限】ns_tmp=s;%【赋值】I=ns_tmp<Lb;%【先判断,若ns_tmp的值小于Lb,则把临时变量ns_tmp中存储的s的值赋给I】ns_tmp(I)=Lb(I);% Apply the upper boundsJ=ns_tmp>Ub;ns_tmp(J)=Ub(J);% Update this new move 【把s这个值更新】s=ns_tmp;
%% You can replace the following by your own functions【目标函数,这是最重要的,也是自己要替换的东西】
% A d-dimensional objective function
function z=fobj(u)
%% d-dimensional sphere function sum_j=1^d (u_j-1)^2.
%  with a minimum at (1,1, ...., 1);
z=sum((u-4).^2);
最后附一张别人论文里的截图,这里的公式可以更好的解释莱维飞行那段的代码。


http://chatgpt.dhexx.cn/article/pOodoY4n.shtml

相关文章

多策略调和的布谷鸟搜索算法

文章目录 一、理论基础1、布谷鸟搜索算法2、多策略调和的布谷鸟搜索算法&#xff08;1&#xff09;自适应步长&#xff08;2&#xff09;更新方法&#xff08;3&#xff09;多策略调和&#xff08;4&#xff09;MSRCS算法流程 二、实验仿真与结果分析三、参考文献 一、理论基础…

一个例子“入坑“布谷鸟算法(附完整py代码)

转载自&#xff1a;https://blog.csdn.net/sj2050/article/details/98496868 一个例子"入坑"布谷鸟算法(附完整py代码) SJ2050 2019-08-06 11:29:51 9089 收藏 103 分类专栏&#xff1a; Algorithms Python 文章标签&#xff1a; cuckoo_search optimization python…

路径规划算法:基于布谷鸟优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于布谷鸟优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于布谷鸟优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化算法…

群体智能优化算法之布谷鸟搜索(CS)

获取更多资讯&#xff0c;赶快关注上面的公众号吧&#xff01; 文章目录 第六章 布谷鸟搜索[1]6.1 介绍6.2 人工布谷鸟搜索6.2.1 随机变量6.2.2 随机游走6.2.2.1 幂律 6.2.3 赫维赛德函数&#xff08;阶跃函数&#xff09;6.2.4 Lvy&#xff08;莱维&#xff09;分布6.2.4.1 Lv…

【群体智能】布谷鸟搜索算法

目录 一、预备知识 1. 分布 2. 随机游走 二、设计思想 1. 设计思想概括 2. 布谷鸟行为分析 三、理想化规则 四、实现过程/基本流程 五、Matlab实现 1. 代码 2. 输出 一、预备知识 1. 分布 &#xff08;1&#xff09;Thin-detailed Distribution&#xff1a;以指数…

[算法学习]模拟退火算法(SA)、遗传算法(GA)、布谷鸟算法(CS)、人工蜂群算法(ABC)学习笔记---附MATLAB注释代码

目录 1.模拟退火算法&#xff08;Simulated Annealing&#xff0c;SA&#xff09;1.1 本质&#xff1a;1.2 算法思想1.3 SA流程图1.4 模拟退火过程1.5 SA解决TSP问题1.6 SA改进方向1.7 SA算法的特点1.8 模拟退火算法经典案例MATLAB源码详细解析1.8 MATLAB经典SA算法代码下载 2.…

用于旅行商问题的离散布谷鸟算法

英文&#xff1a;Discrete Cuckoo Search for Traveling Salesm Problem 摘要 杜鹃搜索&#xff08;CS&#xff09;属于一类新颖的自然启发算法&#xff0c;其灵感来源于一些杜鹃物种的专性卵寄生&#xff0c;将它们的卵放在其他寄主鸟类&#xff08;其他物种&#xff09;的巢…

布谷鸟hash算法的并行化实现(一)

由于本人最近在写一个项目&#xff0c;为了实现数据查找以及数据修改部分的快速操作&#xff0c;所以采用hash对数据进行存储&#xff0c;而在此过程中接触到了布谷鸟hash&#xff0c;觉得这个hash算法还是很有意思并且高效&#xff0c;所以想着进行一些记录&#xff0c;本系列…

【算法学习】布谷鸟搜索算法【CuckooSearch(CS)】

原文链接&#xff1a;布谷鸟搜索算法 布谷鸟搜索&#xff08;Cuckoo Search&#xff0c;CS&#xff09;是由 Xin-She Yang 和 Suash Deb 于 2009 年开发的自然启发式算法。CS 基于布谷鸟的寄生性育雏&#xff08;brood parasitism&#xff0c;又巢寄生&#xff09;行为。该算法…

【LSTM回归预测】基于matlab布谷鸟算法优化LSTM回归预测【含Matlab源码 2037期】

⛄一、布谷鸟算法优化LSTM预测 1 布谷鸟搜索算法 布谷鸟算法是一种新型的群智能搜索算法&#xff0c;布谷鸟算法具有参数数目少、鲁棒性强、通用性好和全局寻优能力突出等多方面综合优势。布谷鸟算法以寻得全局最优鸟窝为目标&#xff0c;采用如式(3)所示的方法进行鸟窝位置更…

智能优化算法:布谷鸟搜索算法-附代码

智能优化算法&#xff1a;布谷鸟搜索算法-附代码 文章目录 智能优化算法&#xff1a;布谷鸟搜索算法-附代码1.算法原理2.算法结果3.参考文献4.Matlab代码 摘要&#xff1a;谷鸟搜索算法(cuckoo search ,cs)&#xff0c;是由剑桥大学Yang等提出的一种群智能优化算法&#xff0c;…

python---布谷鸟搜索算法

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

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

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

布谷鸟算法(C++实现)

算法思想 布谷鸟鸟群最终只有最健康的蛋才能孵化出来。 布谷鸟群每只鸟都在拼命寻找好巢穴以达到下最健康的蛋的母的。 算法步骤 步骤一 初始化 初始化布谷鸟种群数量&#xff08;鸟窝个数&#xff09;&#xff0c;计算各个鸟窝&#xff08;解&#xff09;的函数适应值&…

Python优化算法07——布谷鸟搜索算法

和前面的系列不同&#xff0c;布谷鸟这里没有现成的Python的包&#xff0c;使用我们需要自己写各种源码模块进行组合&#xff0c;达到布谷鸟搜索算法&#xff08;CS&#xff09;的功能。 这里的CS算法是面向过程的编程&#xff0c;都是自定义函数&#xff0c;不涉及类与对象。…

一个例子入坑布谷鸟算法(附完整py代码)

布谷鸟是比较新的启发式最优化算法,但其与传统的遗传算法,退火算法等相比,被证明收敛速度更快,计算效率更高! 文章目录 本文诞生的缘由布谷鸟算法思想简介更新位置的方式莱维飞行局部随机行走 抛出个栗子一些参数的建议完整的python实现运行结果参考文献 本文诞生的缘由 由于布…

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

文章目录 一、理论基础1、算法原理2、算法流程图 二、Matlab代码三、参考文献 一、理论基础 1、算法原理 布谷鸟采用一种特殊的寄生宿主巢穴的方式孕育繁殖,它将孵育的蛋置入寄生宿主的巢穴&#xff0c;让寄生宿主孵化布谷鸟蛋。由于布谷鸟幼雏能发出比寄生宿主幼雏更闪亮的叫…

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