基于布谷鸟与蚁群算法融合的智能优化算法-附Matlab源码

2023-11-11 19:30

本文主要是介绍基于布谷鸟与蚁群算法融合的智能优化算法-附Matlab源码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

基于布谷鸟与蚁群算法融合的智能优化算法

目录

  • 基于布谷鸟与蚁群算法融合的智能优化算法
  • 前言
  • 一、基本布谷鸟算法
  • 二、基本蚁群算法
  • 三、融合算法
    • 1、改进 CS 算法
    • 2、基于蚁群更新规则的局部搜索方法
  • 四、实验结果和总结


前言

针对标准布谷鸟搜索算法采用Levy飞行机制生成新的鸟巢,使得每次更新的鸟巢位置的随机性较大的问题,提出一种蚁群算法优化的布谷鸟搜索算法.首先,提出的算法将待更新的鸟巢位置作为蚁群优化算法的一组初始解在极小的范围内进行搜索寻优.之后,将此次蚁群优化算法搜索所得的解作为新的候选解.当蚁群优化算法搜索寻优的候选解优于Levy飞行产生的候选解时,替换掉Levy飞行的候选解.最后,再进行布谷鸟搜索算法择优算子,根据遗弃概率替换新的鸟巢位置,实现更新后的鸟巢位置更加趋向于最优解.通过六个典型的测试函数将提出的算法与标准布谷鸟算法进行了寻优性能比较.实验结果表明,提出的算法能够提升布谷鸟搜索算法候选解的质量,提高算法的收敛速度和收敛精度.


一、基本布谷鸟算法

1、原理

在自然界中,布谷鸟的繁殖习性是比较独特的,它是巢寄生鸟类,巢寄生是指利用其他鸟类的巢穴来孵化自己的蛋。若要提高蛋的存活率,则将宿主的蛋破坏掉或者伪装。若蛋被宿主发现,则宿主寻找新的鸟巢或者破坏蛋。这个是自然选择的过程,选择鸟巢的好坏直接影响下一代的生存率。通过布谷鸟搜寻鸟巢的过程来模拟出布谷鸟算法,该算法基于三种理想规则:

规则 1 每只布谷鸟一次只能产一枚卵,并随机选择地放入一个鸟巢中。
规则 2 在随机选择的一组鸟巢中,最好的寄生巢将会被保留到下一代。
规则3 鸟巢数量是固定的,被发现的概率 Pa ,若宿主发现蛋,它会将蛋摧毁或者重新寻找新巢。

2、执行过程如下图所示,

二、基本蚁群算法

在这里插入图片描述

三、融合算法

1、改进 CS 算法

标准的 CS 算法的优点有很多,如结构与其它智能算法来说相对于简单、运算过程中的参数较少、易于实现等优点,但同样也存在着一些不足,比如算法的搜索能力略显不足、搜索的速度也不是很快、在运算过程中容易陷入局部极值等等。本文拟打算改进标准布谷鸟算法,使其收敛过程消耗时间更少,收敛精度更高。
目前改进算法主要集中在三个方面,第一个方面,对种群初始化进行改进,第二个方面,对全局搜索公式的改进,第三点,利用蚁群算法的更新规则对局部搜索公式进行改进。
1.1 种群的初始化
标准的 CS 算法种群的初始化是在解空间里随机生成的,这样生成的解可能只分布在解空间的一小部分,在算法寻优过程中要费较长的时间去找寻解空间里的最优解。并且不能排除分布不均匀的可能性,分布不均匀不利于算法的全局收敛,为了进一步改进,这里根据混沌变化的情况,混沌变换有随机行规律性以及很遍历,利用混沌变换初始化种群,使初始化的种群具有多样性,可以有利于算法的全局收敛,变换公式如公式(1)所示,
(1) x j + 1 = η x i ( 1 − x i ) , x i ∈ ( 0 , 1 ) {x_{j + 1}} = \eta {x_i}(1 - {x_i}),{x_i} \in (0,1) xj+1=ηxi(1xi),xi(0,1)
式中, 为控制参数,当 取值范围几乎均匀分布在整个区域。
1.2 全局搜索公式的改进
标准的 CS 算法在执行全局搜索阶段依赖的是 Levy 飞行,但是 Levy 飞行是一个无法控制的过程,搜索过程中的步长不好确定,可能一下大,也可能一下小,这样算法就无法协调好算法的探索能力和开发能力,当搜索的步长较大的时候,算法的探索能力强,更倾向于全局搜索,搜索速度较快,且便于搜索到全局最优解,其不足之处是搜索精度偏低;当算法的搜索步长较小的时候,算法的开发能力较强,在解空间进行局部细致搜索,虽然搜索的速度变慢了时间变长了,但是算法的搜索精度整体较优,需在多个较小区间内搜索最优解。
正如标准 CS 算法的搜索全部是依赖随机游走,不能调节好算法的探索能力和开发能力,其收敛速度以及精度无法得到保证,基于以上的分析,在布谷鸟算法全局搜索时本文提出一种自适应步长的全局搜索更新公式,可以根据当前的解空间的状态,来动态调整步长大小,如果当前的解比整个种群解的均值要大,说明这个时候,当前解需要较大步长,如果当前的解比整个种群的均值要小,说明当前的解需要较小的步长,因为当前的解以及逼急最优值,这个时候更小的步长可以提供局部的搜索能力,更容易找到更加好的解。
自适应调整算法,根据当前解的情况,对算法的开拓能力以及搜索能力进行了很好的权衡,能够更加快速的收敛,获得更高的精度。
全局搜索的算法更新的如公式(2)所示。
(2) α = { α min ⁡ − ( α min ⁡ − α min ⁡ ) ∗ ( f − f min ⁡ ) / ( f a v g − f min ⁡ ) f < f a v g α max ⁡ f > f a v g \alpha = \left\{ \begin{array}{l} {\alpha _{\min }} - ({\alpha _{\min }} - {\alpha _{\min }})*(f - {f_{\min }})/({f_{avg}} - {f_{\min }}){\kern 1pt} {\kern 1pt} {\kern 1pt} {\kern 1pt} {\kern 1pt} {\kern 1pt} {\kern 1pt} {\kern 1pt} {\kern 1pt} {\kern 1pt} f < {f_{avg}}\\ {\alpha _{\max }}{\kern 1pt} {\kern 1pt} {\kern 1pt} {\kern 1pt} {\kern 1pt} {\kern 1pt} {\kern 1pt} {\kern 1pt} {\kern 1pt} {\kern 1pt} f > {f_{avg}} \end{array} \right. α={αmin(αminαmin)(ffmin)/(favgfmin)f<favgαmaxf>favg
表示布谷鸟算法鸟巢当前的目标函数值。当各鸟巢的目标值趋于一致或趋于局部最优时,将使惯性权重增大,而各鸟巢的目标值比较分散时,使惯性权重 减小,同时对于目标函数值优于平均目标值的鸟巢,其对应的惯性权重因子 较小,从而保留了该鸟巢,反之对于目标函数值差于平均目标值的鸟巢,其对应的惯性权重因子 较大,使得该微粒向较好的搜索区域靠拢。

2、基于蚁群更新规则的局部搜索方法

蚁群算法在局部搜索以及淘汰的时候,会计算每个蚂蚁经过的路径长度,记录目前的最短路径,同时更新路径上的信息素。为了避免残留信息素过多而淹没启发信息,在每只蚂蚁走完一步或者完成对所有n个城市的遍历(也即一个循环结束)后,要对残留信息进行更新处理。由此,在鸟巢局部搜索方面做以下改进,
算法在进行完全局搜索后,每个鸟巢任意产生一个随机数 R ,用均匀分布的随机数
与 Pa比较,如果随机数 R 小于Pa ,则鸟巢被抛弃并重新生成一个新的鸟巢。在标准 CS 算法内,当布谷鸟鸟蛋i 被宿主鸟发觉的时候是随机选取另一鸟巢 j 位置,应用二者交叉变异的方法调整鸟巢位置,即算法的局部搜索公式。
本文根据蚁群更新规则的启发,会计算每个鸟巢的变化,然后在变化量的基础上,再加上最后一个鸟巢的适应度增量,以及当前最好解的倍数值,使得新生成的鸟巢方位总是朝着质量较优的方位移,具体的公式如公式(3)所示。
动,具体公式如下:
(3) x i t + 1 = x i t + ( γ + Δ x i t ) ( x j t − x i t ) Δ x i t = [ ∑ k = 1 m x i k , ( 1 − σ ) x b e s t ] \begin{array}{l} x_i^{t + 1} = x_i^t + (\gamma + \Delta x_i^t)(x_j^t - x_i^t)\\ \Delta x_i^t = [\sum\limits_{k = 1}^m {x_i^k,(1 - \sigma ){x_{best}}} ] \end{array} xit+1=xit+(γ+Δxit)(xjtxit)Δxit=[k=1mxik,(1σ)xbest]
表示残留信息的变化量,在更新的时候,希望新生的巢穴朝着信息残留更多的地方前进。


四、实验结果和总结

测试函数是f1~f6,分别是

f1:
function s = sphere(x)
n = length(x);
s = 0;
for j = 1:ns = s+x(j)^2; 
endf2:% % rastrigin
function y= sphere(x)
n = length(x);
s = 0;
for j = 1:ns = s+(x(j)^2-10*cos(2*pi*x(j))); 
end
y = 10*n+s;f3:%non_continuous_rastrigin
function val= sphere(x)
n=size(x,2);
val=0;
for i=1:nif abs(x(i))<1/2y=x(i);elsey=round(2*x(i))/2;endval=val+y^2-10*cos(2*pi*y)+10;
endf4:% Sphere function 
function s = sphere(x)
n = length(x);
s = 0;
for j = 1:ns = s+x(j)^2; 
endf5:% Griewank function
function y= sphere(x)
n = length(x);
fr = 4000;
s = 0;
p = 1;
for j = 1:n; s = s+x(j)^2; end
for j = 1:n; p = p*cos(x(j)/sqrt(j)); 
end
y = s/fr-p+1;f6:% schwefel_2_22
function Schw = sphere(Swarm)
% [SwarmSize, Dim] = size(Swarm);
Schw = sum((abs(Swarm))) + prod((abs(Swarm)));

测试结果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
总结:从结果可以看出,改进之后的智能优化算法,比改进之前,能够更快的收敛。
源码链接:https://mianbaoduo.com/o/bread/mbd-YZqbmJhv
参考文献:
【1】https://xueshu.baidu.com/usercenter/paper/show?paperid=1j420t90vm4v0a90444e0x2087489648&site=xueshu_se
【2】Cuckoo search via Lévy flights. Yang XS ↩

这篇关于基于布谷鸟与蚁群算法融合的智能优化算法-附Matlab源码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/392353

相关文章

SpringBoot3实现Gzip压缩优化的技术指南

《SpringBoot3实现Gzip压缩优化的技术指南》随着Web应用的用户量和数据量增加,网络带宽和页面加载速度逐渐成为瓶颈,为了减少数据传输量,提高用户体验,我们可以使用Gzip压缩HTTP响应,... 目录1、简述2、配置2.1 添加依赖2.2 配置 Gzip 压缩3、服务端应用4、前端应用4.1 N

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

MyBatis 动态 SQL 优化之标签的实战与技巧(常见用法)

《MyBatis动态SQL优化之标签的实战与技巧(常见用法)》本文通过详细的示例和实际应用场景,介绍了如何有效利用这些标签来优化MyBatis配置,提升开发效率,确保SQL的高效执行和安全性,感... 目录动态SQL详解一、动态SQL的核心概念1.1 什么是动态SQL?1.2 动态SQL的优点1.3 动态S

Python如何使用__slots__实现节省内存和性能优化

《Python如何使用__slots__实现节省内存和性能优化》你有想过,一个小小的__slots__能让你的Python类内存消耗直接减半吗,没错,今天咱们要聊的就是这个让人眼前一亮的技巧,感兴趣的... 目录背景:内存吃得满满的类__slots__:你的内存管理小助手举个大概的例子:看看效果如何?1.

一文详解SpringBoot响应压缩功能的配置与优化

《一文详解SpringBoot响应压缩功能的配置与优化》SpringBoot的响应压缩功能基于智能协商机制,需同时满足很多条件,本文主要为大家详细介绍了SpringBoot响应压缩功能的配置与优化,需... 目录一、核心工作机制1.1 自动协商触发条件1.2 压缩处理流程二、配置方案详解2.1 基础YAML

Python实现无痛修改第三方库源码的方法详解

《Python实现无痛修改第三方库源码的方法详解》很多时候,我们下载的第三方库是不会有需求不满足的情况,但也有极少的情况,第三方库没有兼顾到需求,本文将介绍几个修改源码的操作,大家可以根据需求进行选择... 目录需求不符合模拟示例 1. 修改源文件2. 继承修改3. 猴子补丁4. 追踪局部变量需求不符合很

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时

MySQL中慢SQL优化的不同方式介绍

《MySQL中慢SQL优化的不同方式介绍》慢SQL的优化,主要从两个方面考虑,SQL语句本身的优化,以及数据库设计的优化,下面小编就来给大家介绍一下有哪些方式可以优化慢SQL吧... 目录避免不必要的列分页优化索引优化JOIN 的优化排序优化UNION 优化慢 SQL 的优化,主要从两个方面考虑,SQL 语

MySQL中慢SQL优化方法的完整指南

《MySQL中慢SQL优化方法的完整指南》当数据库响应时间超过500ms时,系统将面临三大灾难链式反应,所以本文将为大家介绍一下MySQL中慢SQL优化的常用方法,有需要的小伙伴可以了解下... 目录一、慢SQL的致命影响二、精准定位问题SQL1. 启用慢查询日志2. 诊断黄金三件套三、六大核心优化方案方案