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

news2024/12/22 23:56:06

测试函数为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.

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

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

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

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

相关文章

腾讯云:AI云探索之路

随着科技的飞速发展&#xff0c;人工智能(AI)云计算领域日益显现出其巨大的潜力和价值。在这个充满挑战和机遇的领域&#xff0c;腾讯云凭借其卓越的技术和创新能力&#xff0c;取得了令人瞩目的成果。本文将深入探讨腾讯云在AI云计算领域的优势&#xff0c;以及其为人工智能发…

Post Json数据与Form表单数据转换器

具体请访问&#xff1a;在线Json转Form表单参数工具

python绘制gif动图--避免收费拒绝水印

在cp源码解读-CSDN博客文章浏览阅读341次,点赞4次,收藏6次。coreutils:cp源代码分析https://blog.csdn.net/zhaiminlove/article/details/135026160中为了直观的表达文件是如何一步步的copy的,就想到了做一个gif,但是从来没弄过,一下有点麻爪了。 首先想到的是百度、Goog…

孩子都能学会的FPGA:第三十三课——用FPGA实现一个通用的SPI主机接收模块

&#xff08;原创声明&#xff1a;该文是作者的原创&#xff0c;面向对象是FPGA入门者&#xff0c;后续会有进阶的高级教程。宗旨是让每个想做FPGA的人轻松入门&#xff0c;作者不光让大家知其然&#xff0c;还要让大家知其所以然&#xff01;每个工程作者都搭建了全自动化的仿…

C语言指针4

1. #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h>int main() {int a 10;int* p &a;//一级指针int** pp &p;//二级指针return 0; }上述代码中p的类型是int* pp的类型是int** 2.int* arr[5]; 数组arr的每个元素是整形指针 3.定义一个变量时,去掉变…

报数游戏C语言

分析:掌握数字移动的规律&#xff0c;以及判断&#xff0c;我们可以用一个二维数组来记录每一个人说的数字&#xff0c;就像第一张图片一样&#xff0c;西安向右边移动&#xff0c;再向左下移动&#xff0c;再向左边移动&#xff0c;在向右边移动&#xff0c;在可以用一个数组来…

3 - Electron BrowserWindow对象 关于窗口

优雅的打开应用~ 当加载缓慢&#xff0c;打开应用的一瞬间会出现白屏&#xff0c;以下方法可以解决 const mainWindow new BrowserWindow({ show: false }) mainWindow.once(ready-to-show, () > {mainWindow.show() }) 设置背景颜色 const win new BrowserWindow({ b…

比特币即自由

号外&#xff1a;教链内参12.15《疯狂的铭文》 文 | Ross Ulbricht. 原文标题&#xff1a;Bitcoin Equals Freedom. 2019.9.25 在中本聪发明比特币后的头一年左右&#xff0c;发生了一些特别的事情&#xff0c;不仅没有人预料到&#xff0c;甚至很多人认为不可能。试着想象一下…

【Python从入门到进阶】44、Scrapy的基本介绍和安装

接上篇《43.验证码识别工具结合requests的使用》 上一篇我们学习了如何使用验证码识别工具进行登录验证的自动识别。本篇我们开启一个新的章节&#xff0c;来学习一下快速、高层次的屏幕抓取和web抓取框架Scrapy。 一、Scrapy框架的背景和特点 Scrapy框架是一个为了爬取网站数…

Python:Jupyter

Jupyter是一个开源的交互式计算环境&#xff0c;由Fernando Perez和Brian Granger于2014年创立。它提供了一种方便的方式来展示、共享和探索数据&#xff0c;并且可以与多种编程语言和数据格式进行交互。Jupyter的历史可以追溯到2001年&#xff0c;当时Fernando Perez正在使用P…

开源免费图床Lychee本地部署搭建个人云图床并公网访问【内网穿透】

文章目录 1.前言2. Lychee网站搭建2.1. Lychee下载和安装2.2 Lychee网页测试2.3 cpolar的安装和注册 3.本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4.公网访问测试5.结语 1.前言 图床作为图片集中存放的服务网站&#xff0c;可以看做是云存储的一部分&#xff0c;既可…

LeetCode(64)分隔链表【链表】【中等】

目录 1.题目2.答案3.提交结果截图 链接&#xff1a; 分隔链表 1.题目 给你一个链表的头节点 head 和一个特定值 x &#xff0c;请你对链表进行分隔&#xff0c;使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。 你应当 保留 两个分区中每个节点的初始相对位置。 示…

加油站“变身”快充站,探讨充电新模式——安科瑞 顾烊宇

摘要&#xff1a;新能源汽车规模化发展的同时&#xff0c;充电不便利的痛点愈发明显。在未来的新能源汽车行业发展当中&#xff0c;充电的矛盾要远远大于造车的矛盾&#xff0c;解决好充电的问题成为电动汽车行业发展的一个突出问题。解决充电补能问题&#xff0c;重要的方式之…

Python实现员工管理系统(Django页面版 ) 六

本篇博客主要实现用户账号管理&#xff0c;这与之前的账号管理不同&#xff0c;之前的账号管理你可以理解为公司在外面买的一些手机号然后需要发放给员工做内部使用&#xff0c;而本篇博客的用户账号管理主要是为了后续的登录网页实现&#xff0c;那么我们开始今天的项目实现吧…

栈和队列的实现(Java篇)

文章目录 一、栈的概念二、栈的实现2.1压栈(push)2.2出栈(pop)2.3获取栈顶元素(peek)2.4判断栈是否为空(isEmpty)栈的实现测试 三、队列的概念四、队列的实现4.1入队(offer)4.2出队(poll)4.3判断队列是否为空4.4获取对头元素队列的实现测试 五、循环队列5.1入队5.2出队5.3获取队…

手把手教你Linux查找Java的安装目录并设置环境变量以及Linux下执行javac未找到命令的保姆级教学

查找Java的安装目录 输入 java -version&#xff0c;查看是否成功安装Java 输入 which java&#xff0c;查看Java的执行路径 输入 ls -lrt /usr/bin/java 输入 ls -lrt /etc/alternatives/java&#xff0c;/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.242.b08-0.el7_7.x86_64 就是J…

系列七、函数

一、函数 1.1、概述 函数 是指一段可以直接被另一段程序调用的程序或代码。 也就意味着&#xff0c;这一段程序或代码MySQL中已经为我们提供好了&#xff0c;我们要做的就是在合适的业务场景调用对应的函数完成相应的业务需求即可。 1.2、分类 按照业务分类&#xff0c;MySQL中…

centOS安装bochsXshell连接centos启动可视化界面

centOS安装bochs 参考&#xff1a;https://blog.csdn.net/muzi_since/article/details/102559187 首先安装依赖环境&#xff1a; yum install gtk2 gtk2-devel yum install libXt libXt-devel yum install libXpm libXpm-devel yum install SDL SDL-devel yum install libXr…

【LeetCode刷题-哈希表】--187.重复的DNA序列

187.重复的DNA序列 本题就是找到长度为10的字符出现次数大于2的 子串序列 方法&#xff1a;使用哈希表 class Solution {public List<String> findRepeatedDnaSequences(String s) {List<String> ans new ArrayList<String>();HashMap<String,Integer&g…

【LeetCode刷题-字符串】-- 186.反转字符串中的单词II

186.反转字符串中的单词II 方法&#xff1a;先反转整个字符串再反转单词中的字母 class Solution {public void reverseWords(char[] s) {reverseCharacters(s,0,s.length-1);reverseEachWord(s);}//反转单词中的字母public void reverseEachWord(char[] s){int length s.len…