黏菌优化算法MATLAB实战[免费]

一、算法原理

黏菌算法(Slime mould algorithm,SMA)是模拟黏菌捕食行为的一种仿生算法。黏菌根据气味识别到食物后,通过细胞质的流动形成多个叶脉,同时向多个食物进行移动,当叶脉接近食物源时,黏菌的生物振荡器产生一种传播 波,增加细胞质流动速度,细胞质流动越快,叶脉就越厚。这种正反馈机制,使得黏菌能以一种较优的方式建立连接食物的路径。SMA具有收敛速度快,寻优能力强的优点。

借鉴黏菌的生物行为,可以抽象出三个规则:

寻找食物:黏菌通过空气中的气味接近食物,黏菌接近食物时呈圆形与扇形结构运动。

包围食物:黏菌静脉接触的食物浓度越高,生物振荡器产生的传播波越强,细胞质流动越快。

抓取食物:黏菌在食物浓度低时更慢地接近食物,找到优质食物时更快地接近食物。

二、代码实战

%%
clear
clc
close all
addpath(genpath(pwd))
number='F10'; %选定优化函数,自行替换:F1~F23
[lb,ub,dim,y]=CEC2005(number);  % [lb,ub,D,y]:下界、上界、维度、目标函数表达式
MaxIteration=1000;  %最大迭代次数
Solution_no=50;  %种群规模
%调用SMA算法
[Destination_fitness,bestPositions,Convergence_curve]=SMA(Solution_no,MaxIteration,lb,ub,dim,y);
​
disp(['最佳适应度值',num2str(Destination_fitness)])
disp(['最佳粒子位置',num2str(bestPositions)])
%% 绘图
subplot(1,2,1)
func_plot(number)
title(number)
xlabel('x')
ylabel('y')
zlabel('z')
subplot(1,2,2)
CNT=50;
k=round(linspace(1,MaxIteration,CNT)); %随机选50个点
% 注意:如果收敛曲线画出来的点很少,随机点很稀疏,说明点取少了,这时应增加取点的数量,100、200、300等,逐渐增加
% 相反,如果收敛曲线上的随机点非常密集,说明点取多了,此时要减少取点数量
iter=1:1:MaxIteration;
semilogy(iter(k),Convergence_curve(k),'m-x','linewidth',1);
grid on;
title(['函数收敛曲线',number])
xlabel('Iterations');
ylabel('Objective function value');
box on
legend('SMA')
set (gcf,'position', [200,300,700,300])
​
function [Destination_fitness,bestPositions,Convergence_curve]=SMA(N,Max_iter,lb,ub,dim,fobj)
​
%% 初始化位置
bestPositions=zeros(1,dim);
Destination_fitness=inf;%将此更改为 -inf 以解决最大化问题
AllFitness = inf*ones(N,1);%记录所有粘菌的适应度
weight = ones(N,dim);%每个粘菌的适应度权重
%% 初始化随机解集
X=initialization(N,dim,ub,lb);
Convergence_curve=zeros(1,Max_iter);
it=1;  %迭代次数
lb=ones(1,dim).*lb; % 变量下限
ub=ones(1,dim).*ub; % 变量上限
z=0.03; % 参数
​
%% 主循环
while  it <= Max_iter
    
    %=====适应度排序======
    for i=1:N
        % 检查解决方案是否超出搜索空间并将其带回
        Flag4ub=X(i,:)>ub;
        Flag4lb=X(i,:):)=(X(i,:).*(~(Flag4ub+Flag4lb)))+ub.*Flag4ub+lb.*Flag4lb;
        AllFitness(i) = fobj(X(i,:));
    end
    
    [SmellOrder,SmellIndex] = sort(AllFitness); 
    worstFitness = SmellOrder(N);
    bestFitness = SmellOrder(1);
​
    S=bestFitness-worstFitness+eps;  %加上 eps 以避免分母为零
​
    %====计算每个粘菌的适应度权重=====
    for i=1:N
        for j=1:dim
            if i<=(N/2) 
                weight(SmellIndex(i),j) = 1+rand()*log10((bestFitness-SmellOrder(i))/(S)+1);
            else
                weight(SmellIndex(i),j) = 1-rand()*log10((bestFitness-SmellOrder(i))/(S)+1);
            end
        end
    end
    
    %====更新最佳适应度值和最佳位置=====
    if bestFitness < Destination_fitness
        bestPositions=X(SmellIndex(1),:);
        Destination_fitness = bestFitness;
    end
    
    a = atanh(-(it/Max_iter)+1);  
    b = 1-it/Max_iter;
    
    %====更新搜索代理的位置=====
    for i=1:N
        if rand:) = (ub-lb)*rand+lb;
        else
            p =tanh(abs(AllFitness(i)-Destination_fitness)); 
            vb = unifrnd(-a,a,1,dim); 
            vc = unifrnd(-b,b,1,dim);
            for j=1:dim
                r = rand();
                A = randi([1,N]);  % 从总体中随机选择两个位置
                B = randi([1,N]);
                if r
else X(i,j) = vc(j)*X(i,j); end end end end Convergence_curve(it)=Destination_fitness; display(['At iteration ', num2str(it), ' the best solution fitness is ', num2str(Destination_fitness)]); it=it+1; end ​ end

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PADS 改变图纸和图页边界大小

PADS 改变图纸和图页边界大小 有时候画一画原理图发现画布不够用了&#xff0c;可改变图纸大小&#xff0c;对应的改变图页边界 若图页边界怎么选择都改变不了&#xff0c;可将途中图页边界删除&#xff0c;重新加载 选择对应的图页边距就好啦 分类: PADS

竞赛保研 基于计算机视觉的身份证识别系统

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于机器视觉的身份证识别系统 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f9ff; 更多资料, 项目分享&#xff1a; https://gitee.com/dancheng-sen…

软件测试|pycharm关联GitHub的详细步骤

简介 GitHub 是全球最大的开源代码托管平台之一&#xff0c;而 PyCharm 是一款强大的 Python 集成开发环境。将两者结合使用&#xff0c;可以提高团队协作和代码管理的效率。本文将详细介绍如何在 PyCharm 中管理 GitHub 账号&#xff0c;包括如何设置 GitHub 账号、创建新仓库…

伴鱼实时数仓建设案例

伴鱼实时数仓建设案例 文章目录 伴鱼实时数仓建设案例伴鱼实时作业应用场景伴鱼实时数仓的建设体系DWD 层复杂场景数据处理方案1. 数据的去重2. join场景两条实时数据流相关联对于关联历史数据 3. 从数据形态观查join DWS 数据层数据处理方案未来与展望 随着伴鱼业务的快速发展…

JUC之CompletableFuture

Future接口理论 Future接口定义了异步任务执行的一些方法&#xff0c;包括异步任务执行结果&#xff0c;异步任务执行是否中断&#xff0c;异步任务是否完毕等。 Future接口常用实现类FutureTask异步任务 FutureTask<String> futureTask new FutureTask<String>…

企业网盘:实现数据跨境传输,助力企业出海的必备工具

今年是“一带一路”十周年。在这十年间&#xff0c;中国和“一带一路”共建国家携手并行&#xff0c;贸易持续增长发展。在如今经济全球化的大方向下&#xff0c;跨国经济合作将会是各国共识。 目前&#xff0c;中外合作企业、跨境企业已成为国际贸易发展趋势。不过&#x…

扩展欧几里得算法

文章目录 扩展欧几里得算法的内容及证明扩展欧几里得算法的代码实现扩展欧几里得算法的用途 本文的问题场景中&#xff0c;涉及到的变量均为整数。 扩展欧几里得算法的内容及证明 贝祖等式&#xff1a; a x b y g c d ( a , b ) c axby gcd(a, b) c axbygcd(a,b)c 其中 …

PLC数组队列搜索FC(SCL代码+梯形图程序)

根据输入数据搜索输入数据队列中和输入数据相同的数,函数返回其所在队列的位置。这里我们需要用到博途PLC的数组指针功能,有关数组指针的详细使用方法,可以参考下面文章: 博途PLC数组指针: https://rxxw-control.blog.csdn.net/article/details/134761364 区间搜索FC …

软件测试|Git:fatal: refusing to merge unrelated histories错误分析与解决

问题介绍 在使用Git时&#xff0c;有时我们可能会遇到以下错误消息&#xff1a; fatal: refusing to merge unrelated histories这个错误通常发生在尝试合并两个不相关的Git仓库历史时。在本文中&#xff0c;我们将详细解释为什么会出现这个错误以及如何解决它。 问题分析 …

代码随想录算法训练营第四天 | 24. 两两交换链表中的节点、19.删除链表的倒数第N个节点、面试题 02.07. 链表相交、142.环形链表II

代码随想录算法训练营第四天 | 24. 两两交换链表中的节点、19.删除链表的倒数第N个节点、面试题 02.07. 链表相交、142.环形链表II 文章目录 代码随想录算法训练营第四天 | 24. 两两交换链表中的节点、19.删除链表的倒数第N个节点、面试题 02.07. 链表相交、142.环形链表II1 Le…

CSS样式学习

html超文本传输标签&#xff0c;属性等权重 outline 标签轮廓 <input type"text"> <textarea cols"30" rows"10"></textarea> outline: none; 表示无轮廓 &#xff08;开发时用的比较多&#xff09; CSS 轮廓&#xff…

大创项目推荐 深度学习疫情社交安全距离检测算法 - python opencv cnn

文章目录 0 前言1 课题背景2 实现效果3 相关技术3.1 YOLOV43.2 基于 DeepSort 算法的行人跟踪 4 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于深度学习疫情社交安全距离检测算法 ** 该项目较为新颖&#xff0c;适合作为竞赛…

【踩坑】flask_uploads报错cannot import name ‘secure_filename‘

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhang.cn] 背景说明 截至目前&#xff0c;用新版的flask实现文件上传(用到flask_uploads库)&#xff0c;会出现这个问题。 问题原因 版本问题&#xff0c;新的werkzeug已经把secure_filename的位置改了。 解决方法 手动修改…

第23集《佛法修学概要》

庚二、不偷盗分五&#xff1a;辛一、解释名义&#xff1b;辛二、具缘成犯&#xff1b;辛三、犯戒轻重&#xff1b;辛四、开缘情况&#xff1b;辛五、持犯得失 请大家打开讲义第六十五页。我们看庚二、不偷盗。 这一科&#xff0c;我们讲到人天乘的法门。五戒十善为什么叫人天…

【数模百科】距离美赛还有20天,不要忘了阅读往年获奖论文(附04-23年美赛获奖论文)

之前发了很多数模相关的知识&#xff0c;受到了一些人的关注&#xff0c;也有很多人私下问我&#xff0c;距离美赛还有20几天了&#xff0c;还来不来得及。 对此我想说&#xff0c; 来不来得及重要吗&#xff1f; 你名都报了&#xff0c;钱也交了&#xff0c;还是笔不小的钱…

OpenGL 网格拾取坐标(Qt)

文章目录 一、简介二、代码实现三、实现效果参考资料一、简介 有时候我们希望通过鼠标来拾取某个网格中的坐标,这就涉及到一个很有趣的场景:光线投射,也就是求取一条射线与网格的交点,这里如果我们采用普通遍历网格中的每个面片的方式,当网格的面片数据量很大时计算效率就…

H7303 无电感,线性恒流,低压差,大电流,车灯/台灯 9V 12V 24V 30V

线性恒流芯片是一种用于控制电流的电子元件&#xff0c;通常用于驱动LED等器件。它的工作原理是通过维持输出电流的恒定来保持被驱动器件的亮度或功率稳定。 具体来说&#xff0c;线性恒流芯片会监测输出电流并调整电压以保持恒定的电流流过被驱动器件。以下是其基本工作步骤&…

国内镜像:极速下载编译WebRTC源码(For Android/Linux/IOS)(二十四)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒体系统工程师系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只…

基础数据结构第九期 堆(数组+STL)

前言 堆是一种重要的数据结构&#xff0c;因此应该熟练掌握。 一、堆的基本概念 堆的基本&#xff1a; 堆的结构实际上是一棵完全二叉树&#xff0c;堆可以分为大根堆和小根堆 大根堆&#xff1a; 小根堆&#xff1a; 堆的储存&#xff1a; 若节点小标为i&#xff0c;则左子…

常用计算电磁学算法特性与电磁软件分析

常用计算电磁学算法特性与电磁软件分析 参考网站&#xff1a; 计算电磁学三大数值算法FDTD、FEM、MOM ADS、HFSS、CST 优缺点和应用范围详细教程 ## 基于时域有限差分法的FDTD的计算电磁学算法&#xff08;含Matlab代码&#xff09;-框架介绍 参考书籍&#xff1a;The finite…
最新文章