最近项目需要,所以一直在研究布谷鸟算法,在网上看了一些前辈的文章,原理讲的都比较透彻,我就不再赘述。
贴上一个自己注释的程序吧(这个程序也是借鉴别的大佬的,小小的做了一些修改)
我也是最近才接触布谷鸟算法,肯定有欠妥之处,希望各位大佬多多批评指正,相互学习
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【开始迭代】
%for kk = 1 : 500%可以通过for循环代替下面的while
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】enddisp(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 bounds J=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);

[转载]布谷鸟算法的程序(个人注释)相关推荐

  1. 标准差分进化算法matlab程序实现(转载)

    标准差分进化算法matlab程序实现 自适应差分演化算法方面的Matlab和C++代码及论文 差分进化算法 DE-Differential Evolution matlab练习程序(差异演化DE) [ ...

  2. 文字细化算法matlab,[转载](转)二值图像的细化算法和源程序代码(Matlab)

    二值图像的细化算法和源程序代码(Matlab) 有关图像细化算法,从方法上有很多,具体请参看各图像处理的经典教材,但有一本书,我记得是大概1980年代科学出版社出版的,是著名的Pavlidis编著,并 ...

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

    目录 1.模拟退火算法(Simulated Annealing,SA) 1.1 本质: 1.2 算法思想 1.3 SA流程图 1.4 模拟退火过程 1.5 SA解决TSP问题 1.6 SA改进方向 1 ...

  4. 改进的二值图像像素标记算法及程序实现(含代码)

    笔者实现了一个论文里面的算法程序,论文(可以网上搜索到,实在搜不到可以联系笔者或留下邮箱发给你)讲解比较到位,按照作者的思路写完了代码,测试效果很好,在此分享一下算法思路及实现代码. 此算法优于一般的 ...

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

    布谷鸟是比较新的启发式最优化算法,但其与传统的遗传算法,退火算法等相比,被证明收敛速度更快,计算效率更高! 文章目录 本文诞生的缘由 布谷鸟算法思想简介 更新位置的方式 莱维飞行 局部随机行走 抛出个 ...

  6. TopOpt | 针对99行改进的88行拓扑优化程序完全注释

    博客搬家到自己搭建的 主页 啦q(≧▽≦q),大家快来逛逛鸭! The Corresponding Files (Click to Save): Code              top88.m R ...

  7. TopOpt | 99行拓扑优化程序完全注释

    博客搬家到自己搭建的 主页 啦q(≧▽≦q),大家快来逛逛鸭! The Corresponding Files (Click to Save): Code:            top.m Refe ...

  8. 二.编写第一个c#程序(注释,命名空间,类,Main方法,标识符,关键字,输入,输出语句,)...

    复习编写一个控制台应用程序,目标是在控制台输出"Hello World" 1.第一步,打开Visual Studio 2012以上版本(我用的是VS 2015),打开完成后出现以下 ...

  9. 风电功率预测优化算法MATLAB程序基于改进神经网络

    风电功率预测优化算法MATLAB程序基于改进神经网络 (1) 该程序为基于改进神经网络的风电功率预测优化算法程序,风电预测程序,期刊论文源程序,配有该论文. (2) 该程序所用的ICA-BP 神经网络 ...

  10. 莱维飞行matlab作图,通俗易懂的布谷鸟算法与莱维飞行,(附求解函数最小值matlab源码)-Go语言中文社区...

    1 从布谷鸟的育雏到布谷鸟算法 布谷鸟不会做窝,也不会育雏,在春末夏初,向北飞,趁别的鸟(宿主鸟)外出觅食时,将卵蛋产在宿主鸟窝里,让宿主鸟抚养自己孩子 .当然,布谷鸟在产卵前,为了不被宿主鸟发现鸟窝 ...

最新文章

  1. 8.1 A Bayesian Methodology for Systemic Risk Assessment in Financial Networks(3)
  2. Hibernate用Mysql数据库时链接关闭异常的解决
  3. Java 集合框架看这一篇就够了
  4. OA中SSH+JBPM项目整合
  5. en结尾的单词_以en结尾的英语单词
  6. 【WebRTC---入门篇】(九)WebRTC网络基础:P2P/STUN/TURN/ICE
  7. org.jeecgframework.core.common.exception.MyExceptionHandler]java.lang.NullPointerException
  8. 训练集、验证集和测试集的意义
  9. 视觉SLAM笔记(1) 初识SLAM
  10. CSDN中使用编辑器空格
  11. C++ MFC实现基于RFID读写器的上位机软件
  12. 【转】在birt中显示条形码
  13. linux缓冲设备,Linux设备驱动程序缓冲策略
  14. Android 使用低功耗蓝牙简单介绍
  15. 电脑上最好的5个azw3阅读器
  16. 无法使用资源管理器打开FTP,别被百度的结果坑了
  17. EPLAN创建3D宏部件
  18. java内存泄漏定位和解决,学习路线+知识点梳理
  19. nginx设置白名单
  20. Leetcode刷题笔记——剑指 Offer 46. 把数字翻译成字符串(中等)

热门文章

  1. 基于数字孪生高校可视化的综合运营管理平台
  2. MySQL 源码下载教程
  3. 照片一寸改成二寸,并压缩体积KB的工具
  4. 怎么批量打印html,Word如何批量打印
  5. 基于Montgomery算法的高速、可配置 RSA密码IP核硬件设计系列(三)——抵抗侧信道攻击设计方案
  6. mysql连接工具_连接MySQL常用工具
  7. 帅瞎了!手机也能写Python代码!手把手教你在手机或平板上配置Python环境!
  8. 吴恩达深度学习课程——神经网络与深度学习
  9. Linux终端命令格式
  10. 24种设计模式-生成器模式