超详细 | 黏菌算法原理、实现及其改进与利用(Matlab/Python)

2023-12-17 14:04

本文主要是介绍超详细 | 黏菌算法原理、实现及其改进与利用(Matlab/Python),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

测试函数为F15

在MATLAB中执行程序结果如下:
在这里插入图片描述

在Python中执行程序结果如下:
在这里插入图片描述

众所周知,麻雀搜索算法SSA是2020年由东华大学沈波教授团队提出[1]的一种性能十分优异的优化算法,而最近作者发现,在2020年还提出了一个优化算法,目前在谷歌学术和wos上引用量都高于SSA——黏菌算法(slime mould algorithm, SMA)

黏菌算法是由Li 等于 2020 年提出[2],发表在SCI的1区Top期刊《Future Generation Computer Systems》上,因此今天的文章作者就为大家介绍SMA,介绍其原理、优势及其可改进之处。

黏菌算法
在这里插入图片描述

麻雀搜索算法

在这里插入图片描述

00 目录

1 黏菌算法(SMA)原理

2 代码目录

3 算法性能

4 算法的改进与利用

5 源码获取

01 黏菌算法(SMA)原理

受文献[3]中的黏菌模型启发, Li等人[2]提出了名为黏菌算法(SMA)的基于群体智能实现的新型优化算法,该算法通过模拟黏菌的觅食过程来实现优化目的,具有参数少,寻优能力强的特点,目前也广泛应用于各类工程问题。

当黏菌感知到食物源时会表现出振荡收缩,而多食物源的出现还会使黏菌形成不同粗细的静脉网络,食物源的质量直接影响了静脉网络的状态。为探索更多的食物源,黏菌种群有一定概率进行未知领域的探索。黏菌觅食共表现出接近食物、包围食物和获取食物3个阶段。

1.1 接近食物

在第一阶段,黏菌依靠空气中的气味寻找食物来源,其位置更新公式为:

在这里插入图片描述

其中,r为在[0,1]的随机数,Xb表示目前适应度最优的个体位置,Xa与 Xb 为两个随机个体位置。vb和vc为振荡参数,vb 为 [-a,a] 之间的随机数,a=arctanh(1-t/Tmax),vb模拟黏菌种群中个体信息的交互过程,vc是从1到0线性递减的参数,c=1-t/Tmax,其模拟了黏菌对自身的保留。W 表示黏菌个体的权重因子,也是黏菌的质量,t 代表当前迭代次数,参数p为条件参数,用于控制黏菌位置更新方式,p=tanh|S(i)-DF|, Si为个体适应度值;DF为所有迭代中最优适应度值。

黏菌重量 W 的更新式为:

在这里插入图片描述

式中: Fcondition 为适应度排序的前 1/2 黏菌个体;Sindex为对种群适应度值大小进行排序;r2为分布于[0,1]的随机数,用于模拟静脉收缩模式的不确定性;bF、wF 为当前迭代最优、最差适应度值;log用于缓和数值的变化率使收缩频率数值变化较小。

黏菌种群根据食物的质量来调整自身搜索模式。当食物浓度较高时,该区域附近的重量W越大;当食物浓度较低时,区域的权重会降低,从而转向其他区域的探索。

1.2 包围食物

包围食物模拟了黏菌静脉结构在搜索过程中的收缩模式,在该步骤中,将黏菌的位置更新为

在这里插入图片描述

其中rand和r取区间[0,1]中的随机值,UB和LB分别是搜索范围的上边界和下边界。z是一个参数,为黏菌分离个体搜索其他食物源的概率,即产生变异的概率,一般设置其为 0.03。

1.3 获取食物

食物源的吸引会引起黏菌自身的振荡,进而改变静脉网络中细胞质的流动,使得黏菌不断靠近食物源,vb和vc即是模拟这种振荡的参数,vb的值在[−a,a]之间随机振荡,vc的值在[− 1,1]之间振荡,并随着迭代次数的增加逐渐趋于零。

黏菌位置更新的过程以及算法流程图可作出如下图示:
在这里插入图片描述

图 1 图来源于 Multi-parameter identification of concrete dam using polynomial chaos expansion and slime mould algorithm

图表明,黏菌个体可以在没有任何角度或方向约束的情况下觅食。这使黏菌能够在所有可能的方向上接近最优解。

黏菌算法的核心更新机制就是下图中的式子,第一个式子保证了算法一定的随机性,而后两个式子随着震荡幅度的变化能够让算法分别进行全局和局部的搜索。
在这里插入图片描述

02 代码目录

在这里插入图片描述

代码包含MATLAB和Python,考虑到很多同学获取代码后,MATLAB代码部分有乱码(MATLAB版本问题),可以将MATLAB版本改为2020及以上,或使用乱码解决文件夹中的txt文件即可。

代码都经过作者重新注释,代码更清爽,可读性强。

部分代码:

MATLAB:
在这里插入图片描述
在这里插入图片描述

Python:
在这里插入图片描述

在这里插入图片描述

03 算法性能

采用标准测试函数初步检验其寻优性能

测试函数为F15

在MATLAB中执行程序结果如下:
在这里插入图片描述

在Python中执行程序结果如下:

在这里插入图片描述

04 算法的改进与利用

根据没有免费的午餐(NFL)定理[4],没有一个算法可以处理所有的优化问题,即每个算法都有其优势和局限性,这也激励着学者提出各种改进的算法来解决不同类型的优化问题,同时也为算法间的混合利用提供了参考。这一节作者就简要谈一下SMA的可改进之处及其可利用的优点。

4.1 改进

首先,振荡参数vb和vc是SMA中相当重要的两个参数,其控制着算法的勘探和开发,而vb中的a在迭代中减小的极快,这可能会导致算法勘探与开发的不平衡,而vc中的c则是线性递减的变化策略,但SMA的实际优化过程十分复杂,其线性递减策略不能有效协调算法全局和局部搜索的平衡关系,会对算法寻优性能产生一定影响,因此两个振荡参数是可以进行改进的地方。

其次,尽管黏菌已经找到了更好的食物源,但对于优质黏菌来说,当rand<z时的黏菌流放可能会导致优质的黏菌个体损失,往更大的方面来说,黏菌算法并没有贪心策略,这虽然有利于解空间的探索,但可能导致算法收敛慢。

​最后,随着离食物源距离的靠近,振荡策略在后期影响力很小,削弱了算法跳出局部最优的能力。

4.2 利用

SMA 会根据适应度值调整不同的搜索模式,适应度较差的黏菌进行全局搜索,vb 和 vc的振荡也使黏菌的搜索方向更为发散,同时当rand小于 z 时,黏菌会进行随机初始化。因此,SMA 的多重探索机制使该算法具有强大的全局寻优能力。可以引入其他算法以提高其全局寻优能力。

05 源码获取

在GZH(KAU的云实验台)后台回复 SMA 即可

参考文献

[1] XUE J K, ShEN B. A novel swarm intelligence optimization approach: sparrow search algorithm [J]. Systems Science & Control Engineering, 2020, 8(1): 22-34.

[2] LI Shimin, CHEN Huiling, WANG Mingjing, et al. Slime mould algorithm: a new method for stochastic optimization[J]. Future generation computer systems, 2020, 111:

300–323.

[3] D. Monismith, B. Mayfield, Slime mold as a model for numerical optimization, in: 2008 IEEE Swarm Intelligence Symposium, 2008,pp. 1–8.

[4] Wolpert DH, Macready WG. No free lunch theorems for optimization. IEEE transactions on evolutionary computation 67–82, 1997.

另:如果有伙伴有待解决的优化问题(各种领域都可),可以发我,我会选择性的更新利用优化算法解决这些问题的文章。

如果这篇文章对你有帮助或启发,可以点击右下角的赞/在看(ง •̀_•́)ง(不点也行),你们的鼓励就是我坚持的动力!若有定制需求,可私信作者。

这篇关于超详细 | 黏菌算法原理、实现及其改进与利用(Matlab/Python)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi