融合柯西变异和自适应莱维飞行的布谷鸟优化算法,改进布谷鸟,MATLAB代码

news2025/2/22 0:33:43

经常有小伙伴后台留言问:

作者改进的算法可不可以用来写论文呀?

回答是:当然可以!且不用加引用!

如果我的文章能帮助到大家写论文,那是作者的荣幸呀!

布谷鸟优化算法是一个非常经典的优化算法,直到今天还有不少人研究对其改进。今天为大家带来一期由小淘自行改进的布谷鸟优化算法---融合柯西变异和自适应莱维飞行的布谷鸟优化算法(Cauchy-Adaptive-Levy-Cuckoo search,CALCS),与往期改进算法相同,该算法不会增加原始算法的复杂度。运行时间不会像某些加入了反向学习、贪婪策略等改进算法一样陡然上升。

同时该算法也会包含在改进智能算法全家桶中:请复制此链接浏览器打开!→

https://mbd.pub/o/bread/mbd-ZJ2XmJ5w

原理详解

基本布谷鸟算法原理介绍:

基本布谷鸟算法(Cuckoo Search algorithm,CS)是通过模拟布谷鸟寻窝产卵的行为来求解最优解,其求解过程为:

1)设置种群数目、弃巢率、问题边界及最大迭代次数。

2)在问题领域内随机产生一定数目的种群并计算每一个个体的目标函数值,求出当前最优值和最优解。

3)判断迭代次数是否达到最大迭代次数,如果是则退出循环,输出最优值和最优解;否则进入步骤4)。

4)根据下式更新鸟巢。

cac3d4df0dc0556d57f2e7f19d27489a.png

式中: nest(t+1)i ,nestti分别表示鸟巢i 在第t+1和t 代的位置; α=0.01R,R∈N(0,1) ; best表示当前鸟巢中最佳位置; step表示Levy飞行产生的步长。

bf7b323937e31764418a894676608b50.png

式中: β 取值为1.5; ν,μ∈N(0,1) ; φ 按下式计算:

16b6f3fc0ec678c0a9c8dbf7e781c591.png

5) 计算新鸟巢的目标函数值,若较之前的优越则替换函数值和相应的鸟巢,并记录最优解。

6) 随机生成[0,1]之间的数并与弃巢率比较,若小于则保留该鸟巢,否则按下式产生新鸟巢。

cbacc4d485c6f90040f445207c617e06.png

式中: a、c 为第t 次迭代中不重复的随机整数; r∈[0,1]的随机数。

7) 重新计算新鸟巢的目标函数值,若较之前的优越则替换函数值和相应的鸟巢,并记录最优解。

8) 判断函数值与最优值,如果小于则替换最优值与最优解; 算法转入步骤3) 进行下一次迭代。

改进布谷鸟算法原理介绍:

改进点1:在基本布谷鸟算法基础上采用Tent混沌映射,初始化种群的多样性。

改进点2:采用自适应步长的Levy飞行来改进更新鸟巢的公式。

针对标准布谷鸟搜索算法收敛速度慢、寻优精度低的缺点,通过自适应莱维飞行机制进行全局搜索:莱维飞行步长随迭代的进行不断减小。改进的算法在寻优初期拥有较大的步长因子,从而扩大算法前期的搜索空间,提高全局搜索能力;在寻优过程中,步长减小,提高算法局部搜索性能。由标准算法的0.01改为下式:α=0.5*exp(-t/tmax)。当然关于此类的公式,网上还有很多,大家如果不想用这个公式还可以自行改进。

改进点3:在随机游走之前,先采用柯西变异来更新鸟巢位置。柯西分布与标准的正态分布相似,为连续的概率分布,在原点处值较小,两端较为扁长,逼近零速率较慢, 因而相比于之前的随机游走策略能产生更大的扰动。因此,利用柯西变异对鸟巢位置进行扰动,从而扩大布谷鸟算法的搜索规模,进而提升算法跳出局部最优能力。

结果展示

在CEC2005函数集上进行测试,结果如下:其中CALCS为本文所提改进布谷鸟算法,CS是原始的布谷鸟优化算法,GWO是灰狼优化算法,PSO是粒子群优化算法。

算法迭代1000次,每种算法的粒子数设置为30。

c7c081addd3da968d6a5d5f3d7ffc976.png

bd27e2548c967452ef19551f30506b9a.png

e64d51663aec42c0d200459c5dac63f8.png

d79f2ca5f60d01fcdb5e6b51f4b46ff0.png

fc98862a689bab5029dce03b5740d447.png

8e184861c5ab58422e4c9c1b957d9375.png

e4cece6302a76a9e1c553bc93d44ee1b.png

ec2bbf28f6c43b3281cbdc052140201d.png

302d593344a8247a666174eddfae031c.png

7fa6e95ad4dbd8f421bc514bc01f0016.png

结果分析:在单峰值函数与多峰值函数的测试中可以看到,融合柯西变异和自适应莱维飞行的布谷鸟优化算法寻优效果确实不错!

代码展示

%%
clear
clc
close all
number='F1'; %选定优化函数,自行替换:F1~F23
[lower_bound,upper_bound,variables_no,fobj]=CEC2005(number);  % [lb,ub,D,y]:下界、上界、维度、目标函数表达式
pop_size=30;                      % population members 
max_iter=1000;                  % maximum number of iteration
%% GWO
[fMin , bestX,GWO_convergence_curve ] =GWO(pop_size,max_iter,lower_bound,upper_bound,variables_no,fobj);
display(['The best optimal value of the objective funciton found by GWO  for ' [num2str(number)],'  is : ', num2str(fMin)]);
fprintf ('Best solution obtained by GWO: %s\n', num2str(bestX,'%e  '));


%% PSO    
[Best_pos,Best_score, PSO_convergence_curve ] = PSO(pop_size,max_iter,lower_bound,upper_bound,variables_no,fobj); % Call PSO
fprintf ('Best solution obtained by PSO: %s\n', num2str(Best_score,'%e  '));
display(['The best optimal value of the objective funciton found by PSO  for ' [num2str(number)],'  is : ', num2str(Best_pos)]);


%% CS
[CS_Score,CSbestx,CS_convergence_curve]=CS(pop_size,max_iter,lower_bound,upper_bound,variables_no,fobj);
display(['The best optimal value of the objective funciton found by CS  for ' [num2str(number)],'  is : ', num2str(CSbestx)]);
fprintf ('Best solution obtained by CS: %s\n', num2str(CS_Score,'%e  '));


%% CALCS
[CALCS_Score,CALCSbestx,CALCS_convergence_curve]=CALCS(pop_size,max_iter,lower_bound,upper_bound,variables_no,fobj);
display(['The best optimal value of the objective funciton found by CALCS  for ' [num2str(number)],'  is : ', num2str(CALCSbestx)]);
fprintf ('Best solution obtained by CALCS: %s\n', num2str(CALCS_Score,'%e  '));
%% Figure
figure1 = figure('Color',[1 1 1]);
G1=subplot(1,2,1,'Parent',figure1);
func_plot(number)
title(number)
xlabel('x')
ylabel('y')
zlabel('z')
subplot(1,2,2)
G2=subplot(1,2,2,'Parent',figure1);
CNT=20;
k=round(linspace(1,max_iter,CNT)); %随机选CNT个点
% 注意:如果收敛曲线画出来的点很少,随机点很稀疏,说明点取少了,这时应增加取点的数量,100、200、300等,逐渐增加
% 相反,如果收敛曲线上的随机点非常密集,说明点取多了,此时要减少取点数量
iter=1:1:max_iter;
if ~strcmp(number,'F16')&&~strcmp(number,'F9')&&~strcmp(number,'F11')  %这里是因为这几个函数收敛太快,不适用于semilogy,直接plot
    
    semilogy(iter(k),CS_convergence_curve(k),'m-^','linewidth',1);
    hold on
    semilogy(iter(k),GWO_convergence_curve(k),'b-*','linewidth',1);
    hold on
    semilogy(iter(k),PSO_convergence_curve(k),'y-o','linewidth',1);
    hold on
    semilogy(iter(k),CALCS_convergence_curve(k),'g-p','linewidth',1);
   
else
    plot(iter(k),CS_convergence_curve(k),'m-^','linewidth',1);
    hold on
    plot(iter(k),GWO_convergence_curve(k),'b-*','linewidth',1);
    hold on
    plot(iter(k),PSO_convergence_curve(k),'r-o','linewidth',1);
    hold on
    
    plot(iter(k),CALCS_convergence_curve(k),'g-p','linewidth',1);
   
end
grid on;
title('收敛曲线')
xlabel('迭代次数');
ylabel('适应度值');
box on
legend('CS','GWO','PSO','CALCS')
set (gcf,'position', [300,300,800,330]

基本布谷鸟算法:

function [bestnest,fmin,lhy]=CS(n,N_IterTotal,lb,ub,nd,fobj)
pa=0.25;              % Discovery rate of alien eggs/solutions
%% Simple bounds of the search domain
Lb=lb.*ones(1,nd);     % Lower bounds
Ub=ub.*ones(1,nd);      % Upper bounds
% Random initial solutions
nest=initialization(n,nd,Ub,Lb);
% Get the current best of the initial population
fitness=10^10*ones(n,1);
[fmin,bestnest,nest,fitness]=get_best_nest(nest,nest,fitness,fobj);
%% Starting iterations
for iter=1:N_IterTotal
    % 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,fobj);
    % 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,fobj);
    % Find the best objective so far  
    if fnew<fmin
        fmin=fnew;
        bestnest=best;
    end 
    lhy(iter) = fmin;
end %% End of iterations


%% --------------- All subfunctions are list below ------------------
%% Get cuckoos by ramdom walk
function nest=get_cuckoos(nest,best,Lb,Ub)
% Levy flights
n=size(nest,1);
% For details about Levy flights, please read Chapter 3 of the book:
% X. S. Yang, Nature-Inspired Optimization Algorithms, Elesevier, (2014).
beta=3/2;
sigma=(gamma(1+beta)*sin(pi*beta/2)/(gamma((1+beta)/2)*beta*2^((beta-1)/2)))^(1/beta);
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
    u=randn(size(s))*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 be the
    % typical step size for walks/flights where L is the problem scale; 
    % 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 flights
    s=s+stepsize.*randn(size(s));
    % Apply simple bounds/limits
    nest(j,:)=simplebounds(s,Lb,Ub);
end
%% Find the current best solution/nest among the population
function [fmin,best,nest,fitness]=get_best_nest(nest,newnest,fitness,fobj)
% Evaluating all new solutions
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,:);
%% Replace some not-so-good 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
n=size(nest,1);
% Discovered or not -- a status vector
K=rand(size(nest))>pa;
% Notes: 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. 
% so 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),:));
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 bounds/constraints
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;
%% You can replace the following objective function
%% by your own functions (also update the Lb and Ub)

完整代码获取方式,后台回复关键词。关键词:

CALCS

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1014810.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

视频怎么制作成gif动画?这个方法试试看

日常生活中我们会接触到这种各样的视频&#xff0c;随着拍摄工具的升级视频的画质越来越清楚体积也就越来越大。想要将这些视频转换成gif动图的时候要怎么操作呢&#xff1f;给大家推荐一款gif动画制作&#xff08;https://www.gif.cn/&#xff09;工具&#xff0c;上传视频仅需…

指针-字符串替换

任务描述 从标准输入读入数据&#xff0c;每行中最多包含一个字符串 “_xy_”&#xff0c;且除了字符串“_xy_”外&#xff0c;输入数据中不包括下划线字符&#xff0c;请将输入行中的 “_xy_” 替换为 “_ab_”, 在标准输出上输出替换后的结果&#xff1b;若没有进行过满足条…

Dockerfile RUN

语法 RUN cmd 例如&#xff1a; RUN apt-get update RUN [“executable”, “param1”, “param2”] 例如&#xff1a;RUN [“apt-get”,“update”] 请注意&#xff0c;每个 RUN 指令都会创建一个新的镜像层&#xff0c;因此在 Dockerfile 中使用 RUN 指令时&#xff0c;要注意…

优优嗨聚集团:外卖市场发展红火,外卖代运营服务如何发展

随着外卖市场的飞速发展&#xff0c;外卖代运营服务已成为新的蓝海。本文将对外卖市场的发展趋势以及外卖代运营服务的发展现状和趋势进行分析&#xff0c;以期为相关从业者提供参考。 一、外卖市场发展红火 近年来&#xff0c;外卖市场的发展速度十分惊人。根据艾媒咨询的数据…

基于SSM的车库智能管理平台设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

Zabbix技术分享——如何配置SNMPTrap监控

NMP是一种网络管理协议&#xff0c;SNMPTrap则是基于此协议的一种数据传输方式。在Zabbix监控实践中&#xff0c;SNMP的应用非常广泛&#xff0c;下面我们来看一下如何进行SNMPTrap配置监控。 当我们获取到设备发送过来的trap的时候&#xff0c;需要是从trap信息中获取到Trap …

Echarts 桑基图的详细配置过程

文章目录 桑基图 简介配置步骤简易示例 桑基图 简介 Echarts桑基图&#xff08;Sankey Diagram&#xff09;是一种数据可视化图表类型&#xff0c;用于展示流量、能量、资金等在各个节点之间的流动和转化关系。桑基图通过节点和曲线来表示不同元素之间的关系&#xff0c;从而形…

嵌入式单片机上练手的小型图形库

大家好&#xff0c;今天分享一款小型的图形库。 Tiny Graphics Library&#xff1a; http://www.technoblogy.com/show?23OS 这个小型图形库提供点、线和字符绘图命令&#xff0c;用于 ATtiny85 上的 I2C 128x64 OLED 显示器. 它通过避免显示缓冲器来支持RAM有限的处理器&…

【从入门到起飞】JavaAPI—System,Runtime,Object,Objects类

&#x1f38a;专栏【JavaSE】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【如愿】 &#x1f384;欢迎并且感谢大家指出小吉的问题&#x1f970; 文章目录 &#x1f354;System类⭐exit()⭐currentTimeMillis()&#x1f384;用…

Linux驱动IO篇——mmap操作

文章目录 前言应用层驱动层 前言 平时我们写Linux驱动和用户空间交互时&#xff0c;都是通过copy_from_user把用户空间传过来的数据进行拷贝&#xff0c;为什么要这么做呢&#xff1f; 因为用户空间是不能直接内核空间数据的&#xff0c;他们映射的是不同的地址空间&#xff0…

java:数组缩减

// 有一个数组{1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5}可以将该数组进行缩减&#xff0c;提示用户是否继续缩减&#xff0c;每次缩减最后那个元素当只剩下最后一个元素提示不能继续缩减 import java.util.Scanner; public class suojian {public static void…

VBA语言専攻介绍

VBA语言専攻 我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。我这里专注VBA&#xff0c;垂直度非常高&#xff0c;并和多个国际VBA网站&#xff08;英语系和德语系&#xff09;有互动及技术互通。您来到这里&#xff0c;就是进入到了一个绚烂的VBA世界&#xff…

Discuz论坛网站首页窄屏自定义宽度修改教程

discuz论坛管理中心默认有窄屏和宽屏的选择&#xff0c;窄屏默认是960px宽度&#xff0c;很多论坛为了页面美观&#xff0c;基本都是1200px的宽度&#xff0c;如何修改DZ论坛首页窄屏宽度大小的呢&#xff1f;今天飞飞和你们分享。 1、在网站根目录中依次打开文件 /template/de…

03_ElasticSearch下载安装

概述 ElasticSearch是java开发的&#xff0c;jdk环境是必不可少的&#xff0c;至少有jre环境 1 下载ElasticSearch 最新版本需要访问 ElasticSearch 官网下载&#xff1a;https://www.elastic.co/cn/downloads/elasticsearch&#xff0c; 其他版本见Elastic 中文社区&#…

mybatis动态sqlchooseforeachsql 及include sql中的特殊字符后台分页实现 数据版本号处理并发问题

1. 动态sql简述 mybatis的动态sql语句是基于OGNL表达式的。可以方便的在sql语句中实现某些逻辑. 总体说来mybatis动态SQL语句主要有以下几类: if 语句 (简单的条件判断)choose (when,otherwize) ,相当于java 语言中的 switch ,与 jstl 中的choose 很类似trim (对包含的内容加…

指针-子串逆置

任务描述 从标准输入上读入以空格分隔的字符串 s 和 t&#xff0c;将 s 中与 t 匹配的所有子串逆置后再输出 s&#xff0c;当 s 中无与 t 匹配的子串时直接输出字符串 s。已经匹配的字符不会再重复匹配。 相关知识 参考之前的关卡。 编程要求 根据提示&#xff0c;在右侧编…

docker 网络(单机环境)

文章目录 深入理解 Namespace什么是NamespaceNamespace当中的 Network Namespace Libcontainerdocker 网络基础创建两个命名空间创建网络接口 veth pair命名空间添加 veth 接口为 veth 接口分配 IP启动 veth 接口相互 ping bridge 网络搭建网络环境查看docker0 网桥创建网桥 br…

95.qt qml-诺谦通用可扩展多功能QML界面

支持如下所示: 1.可扩展多功能交互&#xff0c;用户可以根据自己喜欢使用常用功能&#xff0c;针对多功能项目非常有用&#xff01;2.登录用户信息显示&#xff0c;历史消息显示&#xff0c;皮肤黑白风格切换 如下图所示: 自带一个功能界面&#xff0c;可以通过功能界面添加不…

视频转gif制作如何操作?分享一个三步视频转GIF方法

视频如何制作成gif格式图片&#xff1f;工作生活中常常会用到gif格式。那么&#xff0c;自己如何利用视频来制作gif动图呢&#xff1f;下面&#xff0c;给大家分享一款gif动态图片制作&#xff08;https://www.gif.cn/&#xff09;神器&#xff0c;无需下载软件&#xff0c;上传…

ARM 相关概念2

一、汇编中三种符号&#xff08;汇编指令、伪指令、伪操作&#xff09; 二、汇编基本格式 三、数据操作指令 3.1 数据搬移指令mov/mvn ① 示例 ② 立即数 0xff000000 >判断的数 1111 1111 0000 0000 0000 0000 0000 0000 >判断的数 0000 0000 0000 0000 0000 0000 1111…