智能优化算法:莲花算法(Lotus flower algorithm,LFA)介绍,提供MATLAB代码

news2025/2/24 16:46:38

一、 莲花算法

1.1 算法原理

莲花算法(Lotus flower algorithm,LFA)是一种受自然启发的优化算法,其灵感来源于莲花的自清洁特性和授粉过程。莲花的自清洁特性,即所谓的“莲花效应”,是由其叶片表面的微纳米结构和蜡质层共同作用实现的。这种特性使得水滴能够在叶片表面形成球状,并带走灰尘和污垢,从而使叶片始终保持清洁。在算法中,这种自清洁效应被用来模拟优化过程中的局部搜索和全局搜索的平衡。

授粉过程是莲花繁衍的重要方式,包括生物授粉和非生物授粉。生物授粉是指昆虫等生物在花丛中穿梭,将花粉从一朵花传播到另一朵花;非生物授粉则是通过风、水等自然因素传播花粉。在算法中,生物授粉被用来模拟全局搜索,而非生物授粉则被用来模拟局部搜索。

在这里插入图片描述

1.2 算法介绍

1.2.1 LEA 探索阶段

LEA 的探索阶段(Exploration Phase)主要基于蜻蜓算法(Dragonfly Algorithm)的全局授粉过程,模拟蜻蜓在花粉传播中的行为。蜻蜓算法通过模拟蜻蜓的群体行为,包括分离(Separation)、对齐(Alignment)、内聚(Cohesion)以及对食物的吸引和对敌人的回避,来实现对解空间的全局搜索。

  • 分离(Separation):避免个体与邻近个体发生碰撞,计算公式为:
    S i = − ∑ j = 1 N ( X i − X j ) S_i = -\sum_{j=1}^{N} (X_i - X_j) Si=j=1N(XiXj)
    其中, X i X_i Xi 表示当前个体的位置, X j X_j Xj 表示邻近个体的位置, N N N 为邻近个体的数量。

  • 对齐(Alignment):个体的速度与邻近个体的速度保持一致,计算公式为:
    A i = 1 N ∑ j = 1 N V j A_i = \frac{1}{N} \sum_{j=1}^{N} V_j Ai=N1j=1NVj
    其中, V j V_j Vj 表示邻近个体的速度。

  • 内聚(Cohesion):个体向邻近个体的中心位置移动,计算公式为:
    C i = 1 N ∑ j = 1 N ( X j − X i ) C_i = \frac{1}{N} \sum_{j=1}^{N} (X_j - X_i) Ci=N1j=1N(XjXi)
    其中, X j X_j Xj 表示邻近个体的位置。

  • 食物吸引(Food Attraction):个体向食物源移动,计算公式为:
    F i = X food − X i F_i = X_{\text{food}} - X_i Fi=XfoodXi
    其中, X food X_{\text{food}} Xfood 表示食物源的位置。

  • 敌人回避(Enemy Distraction):个体远离敌人,计算公式为:
    E i = X enemy − X i E_i = X_{\text{enemy}} - X_i Ei=XenemyXi
    其中, X enemy X_{\text{enemy}} Xenemy 表示敌人的位置。

通过上述五个因素的综合作用,蜻蜓算法能够有效地探索解空间。在 LEA 中,这些机制被用来模拟蜻蜓在全局搜索中的行为,以实现对问题的全局优化。

1.2.2 LEA 开发阶段

LEA 的开发阶段(Exploitation Phase)主要基于局部授粉过程,模拟植物的自花授粉行为。在这个阶段,算法通过局部搜索来细化和优化已找到的解。

  • 局部搜索:在局部授粉过程中,每个解(花)会围绕当前最优解进行局部搜索。搜索的步长会随着迭代次数的增加而逐渐减小,以实现对最优解的精细化搜索。计算公式为:
    X i t + 1 = X i t + R ( X i t − g ∗ ) X_{i}^{t+1} = X_i^t + R (X_i^t - g^*) Xit+1=Xit+R(Xitg)
    其中, X i t X_i^t Xit 表示当前解, g ∗ g^* g 表示当前最优解, R R R 为步长衰减系数,计算公式为:
    R = 2 e − ( 4 t L ) 2 R = 2e^{-\left(\frac{4t}{L}\right)^2} R=2e(L4t)2
    其中, t t t 为当前迭代次数, L L L 为最大迭代次数。

通过局部搜索,LEA 能够在已找到的解附近进行更深入的搜索,从而提高算法的开发能力。

1.2.3 LEA 开发阶段强化

为了进一步增强开发阶段的搜索能力,LEA 引入了水滴在荷叶上移动的局部搜索机制。这个机制模拟了水滴在荷叶表面的流动,通过水滴的移动来寻找最优解。

  • 水滴移动:每个解(水滴)在搜索空间中移动,寻找最优解。水滴的移动速度和位置更新公式为:
    V i t + 1 = q V i t V_i^{t+1} = q V_i^t Vit+1=qVit
    X i t + 1 = X i t + V i t + 1 X_i^{t+1} = X_i^t + V_i^{t+1} Xit+1=Xit+Vit+1
    其中, V i t V_i^t Vit 表示当前速度, q q q 为速度衰减系数。

  • 水滴溢出:当水滴在一个坑(局部最优解)中积累过多时,会溢出并流向其他坑。溢出的水滴会根据坑的容量(适应度值)选择下一个目标坑。计算公式为:
    c i = ∣ ∣ f i − f max ∣ ∣ ∣ ∣ f min − f max ∣ ∣ × const c_i = \frac{||f_i - f_{\text{max}}||}{||f_{\text{min}} - f_{\text{max}}||} \times \text{const} ci=∣∣fminfmax∣∣∣∣fifmax∣∣×const
    其中, f i f_i fi 表示当前坑的适应度值, f max f_{\text{max}} fmax f min f_{\text{min}} fmin 分别表示最大和最小适应度值, const \text{const} const 为常数。

通过水滴的移动和溢出机制,LEA 能够在局部搜索中更有效地找到最优解。

1.2.4 LEA 步骤

LEA 的主要步骤如下:

  1. 初始化:生成初始解,随机分布蜻蜓(解)在搜索空间中。
  2. 评估:计算每个解的适应度值,确定当前最优解。
  3. 更新:根据蜻蜓算法的机制更新解的位置,包括分离、对齐、内聚、食物吸引和敌人回避。
  4. 局部搜索:在当前最优解附近进行局部搜索,模拟水滴在荷叶上的移动。
  5. 终止条件:检查是否达到最大迭代次数或满足其他终止条件。如果未满足,则返回步骤 2。

1.3 算法流程

在这里插入图片描述

莲花算法的流程主要包括以下步骤:

  1. 初始化:随机生成一群蜻蜓(每个蜻蜓代表一个候选解),并设定算法的参数,如种群大小、最大迭代次数等。
  2. 评估:计算每个蜻蜓的位置对应的适应度值,确定当前最优解。
  3. 更新:根据蜻蜓算法的机制更新蜻蜓的位置,包括分离、对齐、内聚、食物吸引和敌人回避。
  4. 局部搜索:在当前最优解附近进行局部搜索,模拟水滴在荷叶上的移动。
  5. 终止条件:检查是否达到最大迭代次数或满足其他终止条件。如果未满足,则返回步骤 2。

1.4 算法描述

  • 分离(Separation):避免个体与邻近个体发生碰撞,计算公式为: S i = − ∑ j = 1 N ( X i − X j ) S_i = -\sum_{j=1}^{N} (X_i - X_j) Si=j=1N(XiXj)其中, X i X_i Xi 表示当前个体的位置, X j X_j Xj 表示邻近个体的位置, N N N 为邻近个体的数量。

  • 对齐(Alignment):个体的速度与邻近个体的速度保持一致,计算公式为: A i = 1 N ∑ j = 1 N V j A_i = \frac{1}{N} \sum_{j=1}^{N} V_j Ai=N1j=1NVj其中, V j V_j Vj 表示邻近个体的速度。

  • 内聚(Cohesion):个体向邻近个体的中心位置移动,计算公式为: C i = 1 N ∑ j = 1 N ( X j − X i ) C_i = \frac{1}{N} \sum_{j=1}^{N} (X_j - X_i) Ci=N1j=1N(XjXi)其中, X j X_j Xj 表示邻近个体的位置。

  • 食物吸引(Food Attraction):个体向食物源移动,计算公式为: F i = X food − X i F_i = X_{\text{food}} - X_i Fi=XfoodXi其中, X food X_{\text{food}} Xfood 表示食物源的位置。

  • 敌人回避(Enemy Distraction):个体远离敌人,计算公式为: E i = X enemy − X i E_i = X_{\text{enemy}} - X_i Ei=XenemyXi其中, X enemy X_{\text{enemy}} Xenemy 表示敌人的位置。

莲花算法通过模拟莲花的自清洁特性和授粉过程,实现了全局搜索和局部搜索的平衡。它的主要特点是结合了蜻蜓算法的群体行为和水滴在荷叶上的移动机制,能够在复杂的问题空间中有效地寻找最优解。

参考文献:
[1]Dalirinia, Elham, Mehrdad Jalali, Mahdi Yaghoobi and Hamid Tabatabaee. “Lotus effect optimization algorithm (LEA): a lotus nature-inspired algorithm for engineering design optimization.” J. Supercomput. 80 (2023): 761-799.

二、核心MATLAB代码

function [Best_score,Best_pos,cg_curve]=LEA(SearchAgents_no,Max_iteration,lb,ub,dim,fobj)
% display('optimizing your problem');
cg_curve=zeros(1,Max_iteration);
 
 
if size(ub,2)==1
    ub=ones(1,dim)*ub;
    lb=ones(1,dim)*lb;
end
 
 
r=(ub-lb)/10;
Delta_max=(ub-lb)/10;
 
 
Food_fitness=inf;
Food_pos=zeros(dim,1);
 
 
Enemy_fitness=-inf;
Enemy_pos=zeros(dim,1);
 
 
X=initialization(SearchAgents_no,dim,ub,lb);
Fitness=zeros(1,SearchAgents_no);
 
 
DeltaX=initialization(SearchAgents_no,dim,ub,lb);
 
 
for iter=1:Max_iteration
    
    r=(ub-lb)/4+((ub-lb)*(iter/Max_iteration)*2);
    
    w=0.9-iter*((0.9-0.4)/Max_iteration);
       
    my_c=0.1-iter*((0.1-0)/(Max_iteration/2));
    if my_c<0
        my_c=0;
    end
    
    s=2*rand*my_c; 
    a=2*rand*my_c; 
    c=2*rand*my_c; 
    f=2*rand;      
    e=my_c;        
    
    for i=1:SearchAgents_no
        Fitness(1,i)=fobj(X(:,i)');
        if Fitness(1,i)<Food_fitness
            Food_fitness=Fitness(1,i);
            Food_pos=X(:,i);
        end
        
        if Fitness(1,i)>Enemy_fitness
            if all(X(:,i)<ub') && all( X(:,i)>lb')
                Enemy_fitness=Fitness(1,i);
                Enemy_pos=X(:,i);
            end
        end
    end
    
    for i=1:SearchAgents_no
        index=0;
        neighbours_no=0;
        
        clear Neighbours_DeltaX
        clear Neighbours_X
        %find the neighbouring solutions
        for j=1:SearchAgents_no
            Dist2Enemy=distance(X(:,i),X(:,j));
            if (all(Dist2Enemy<=r) && all(Dist2Enemy~=0))
                index=index+1;
                neighbours_no=neighbours_no+1;
                Neighbours_DeltaX(:,index)=DeltaX(:,j);
                Neighbours_X(:,index)=X(:,j);
            end
        end
        
    
        S=zeros(dim,1);
        if neighbours_no>1
            for k=1:neighbours_no
                S=S+(Neighbours_X(:,k)-X(:,i));
            end
            S=-S;
        else
            S=zeros(dim,1);
        end
        
         if neighbours_no>1
            A=(sum(Neighbours_DeltaX')')/neighbours_no;
        else
            A=DeltaX(:,i);
        end
    
        if neighbours_no>1
            C_temp=(sum(Neighbours_X')')/neighbours_no;
        else
            C_temp=X(:,i);
        end
        
        C=C_temp-X(:,i);
        Dist2Food=distance(X(:,i),Food_pos(:,1));
        if all(Dist2Food<=r)
            F=Food_pos-X(:,i);
        else
            F=0;
        end
   
        Dist2Enemy=distance(X(:,i),Enemy_pos(:,1));
        if all(Dist2Enemy<=r)
            Enemy=Enemy_pos+X(:,i);
        else
            Enemy=zeros(dim,1);
        end
        
        for tt=1:dim
            if X(tt,i)>ub(tt)
                X(tt,i)=lb(tt);
                DeltaX(tt,i)=rand;
            end
            if X(tt,i)<lb(tt)
                X(tt,i)=ub(tt);
                DeltaX(tt,i)=rand;
            end
        end
        
        if any(Dist2Food>r)
            if neighbours_no>1
                for j=1:dim
                    DeltaX(j,i)=w*DeltaX(j,i)+rand*A(j,1)+rand*C(j,1)+rand*S(j,1);
                    if DeltaX(j,i)>Delta_max(j)
                        DeltaX(j,i)=Delta_max(j);
                    end
                    if DeltaX(j,i)<-Delta_max(j)
                        DeltaX(j,i)=-Delta_max(j);
                    end
                    X(j,i)=X(j,i)+DeltaX(j,i);
                end
            else
                % Eq. (3.8)
                X(:,i)=X(:,i)+Levy(dim)'.*X(:,i);
                DeltaX(:,i)=0;
            end
        else
            for j=1:dim
                % Eq. (3.6)
                DeltaX(j,i)=(a*A(j,1)+c*C(j,1)+s*S(j,1)+f*F(j,1)+e*Enemy(j,1)) + w*DeltaX(j,i);
                if DeltaX(j,i)>Delta_max(j)
                    DeltaX(j,i)=Delta_max(j);
                end
                if DeltaX(j,i)<-Delta_max(j)
                    DeltaX(j,i)=-Delta_max(j);
                end
                X(j,i)=X(j,i)+DeltaX(j,i);
            end 
        end
        
        Flag4ub=X(:,i)>ub';
        Flag4lb=X(:,i)<lb';
        X(:,i)=(X(:,i).*(~(Flag4ub+Flag4lb)))+ub'.*Flag4ub+lb'.*Flag4lb;
        
    end
    Best_score=Food_fitness;
    Best_pos=Food_pos';
    
    cg_curve(iter)=Best_score;
end
end
function o=Levy(d)
beta=3/2;
%Eq. (3.10)
sigma=(gamma(1+beta)*sin(pi*beta/2)/(gamma((1+beta)/2)*beta*2^((beta-1)/2)))^(1/beta);
u=randn(1,d)*sigma;
v=randn(1,d);
step=u./abs(v).^(1/beta);
% Eq. (3.9)
o=0.01*step;
end

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

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

相关文章

企业数据集成:实现高效调拨出库自动化

调拨出库对接调出单-v&#xff1a;旺店通企业奇门数据集成到用友BIP 在企业信息化管理中&#xff0c;数据的高效流转和准确对接是实现业务流程自动化的关键。本文将分享一个实际案例&#xff0c;展示如何通过轻易云数据集成平台&#xff0c;将旺店通企业奇门的数据无缝集成到用…

数据库管理-第295期 IT架构与爆炸半径(20250221)

数据库管理295期 2025-02-21 数据库管理-第295期 架构与爆炸半径&#xff08;20250221&#xff09;1 术语新解2 硬件&#xff1a;存储VS本地盘3 数据库3.1 多模VS专用3.2 集中式VS分布式 4 公有云VS非公有云总结 数据库管理-第295期 架构与爆炸半径&#xff08;20250221&#x…

基于WOA鲸鱼优化的BiLSTM双向长短期记忆网络序列预测算法matlab仿真,对比BiLSTM和LSTM

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 2.算法运行软件版本 matlab2022a/matlab2024b 3.部分核心程序 &#xff08;完整版代码包含详细中文注释和操作步骤视频…

DeepSeek私有化专家 | 云轴科技ZStack入选IDC中国生成式AI市场概览

DeepSeek 火爆全球AI生态圈&#xff0c;并引发企业用户大量私有化部署需求。 国际数据公司IDC近日发文《DeepSeek爆火的背后&#xff0c;大模型/生成式AI市场生态潜在影响引人关注》&#xff0c;认为中国市场DeepSeekAI模型的推出在大模型/生成式AI市场上引起了轰动&#xff0c…

npm在install时提示要安装python问题处理

使用npm\yarn\pnpm下载以来的时候&#xff0c;一直提示python异常&#xff0c;有的项目安装了python之后&#xff0c;下载依赖还是异常 而且旧版本项目使用python2,新的使用Python3…很烦 解决方案1&#xff1a;cnpm 安装教程&#xff1a; npm安装cnpm&#xff0c;解决node12\…

如何将MySQL数据库迁移至阿里云

将 MySQL 数据库迁移至阿里云可以通过几种不同的方法&#xff0c;具体选择哪种方式取决于你的数据库大小、数据复杂性以及对迁移速度的需求。阿里云提供了多种迁移工具和服务&#xff0c;本文将为你介绍几种常见的方法。 方法一&#xff1a;使用 阿里云数据库迁移服务 (DTS) 阿…

CSS基础(盒子模型的组成、内容溢出、隐藏元素的方式、样式的继承、元素的默认样式、布局技巧、元素之间的空白问题、行内块元素的幽灵空白问题)

文章目录 1. 盒子模型的组成1.1 内容区1.2 默认宽度1.3 内边距1.3.1 内边距属性1.3.2 复合属性1.3.3 单位1.3.4 注意事项 1.4 边框1.4.1 边框属性1.4.2 复合属性1.4.3 单方向边框1.4.4 边框样式1.4.5 注意事项 1.5 外边距1.5.1 外边距属性1.5.2 复合属性1.5.3 注意事项 1.6 外边…

【第二节】C++设计模式(创建型模式)-抽象工厂模式

目录 引言 一、抽象工厂模式概述 二、抽象工厂模式的应用 三、抽象工厂模式的适用场景 四、抽象工厂模式的优缺点 五、总结 引言 抽象工厂设计模式是一种创建型设计模式&#xff0c;旨在解决一系列相互依赖对象的创建问题。它与工厂方法模式密切相关&#xff0c;但在应用…

【开关电源】汽车前端电源保护电路设计

前言&#xff1a; 汽车电池端子在启动或者保养过程中被反接&#xff0c;如果对这些故障不能及时处理&#xff0c;就可能导致ECU或供电设备被损坏&#xff1b;此外在供电过程中电压也存在不稳定的情况。在EMC测试中ISO16750和ISO7637也会有负电压的情况。 肖特基二极管和 P 沟道…

网络运维学习笔记 017 HCIA-Datacom综合实验01

文章目录 综合实验1实验需求总部特性 分支8分支9 配置一、 基本配置&#xff08;IP二层VLAN链路聚合&#xff09;ACC_SWSW-S1SW-S2SW-Ser1SW-CoreSW8SW9DHCPISPGW 二、 单臂路由GW 三、 vlanifSW8SW9 四、 OSPFSW8SW9GW 五、 DHCPDHCPGW 六、 NAT缺省路由GW 七、 HTTPGW 综合实…

C++单例模板类,继承及使用

前言&#xff1a; 单例模式可以参考如下文章&#xff1a; 我的设计模式&#xff0c;单例模式的设计和实现 c 单例模式的模板类 - 川野散人 - 博客园 1.为什么需要单例模板类&#xff1f; 场景问题&#xff1a; 如果需要100个单例类就需要设计100个单例模式&#xff0c;代…

nodejs:vue 3 + vite 作为前端,将 html 填入<iframe>,在线查询英汉词典

向 doubao.com/chat/ 提问&#xff1a; node.js js-mdict 作为后端&#xff0c;vue 3 vite 作为前端&#xff0c;编写在线查询英汉词典 后端部分&#xff08;express js-mdict &#xff09; 详见上一篇&#xff1a;nodejs&#xff1a;express js-mdict 作为后端&#xff…

现场可以通过手机或者pad实时拍照上传到大屏幕的照片墙现场大屏电子照片墙功能

现场可以通过手机或者pad实时拍照上传到大屏幕的照片墙现场大屏电子照片墙功能&#xff0c;每个人都可以通过手机实时拍照上传到大屏幕上,同时还可以发布留言内容&#xff0c;屏幕上会同步滚动播放展示所有人的照片和留言。相比校传统的照片直播功能更加灵活方便&#xff0c;而…

《FFTformer:基于频域的高效Transformer用于高质量图像去模糊》

paper&#xff1a;2211.12250 GitHub&#xff1a;kkkls/FFTformer: [CVPR 2023] Effcient Frequence Domain-based Transformer for High-Quality Image Deblurring CVPR 2023 目录 摘要 1、介绍 2、相关工作 2.1 基于深度CNN的图像去模糊方法 2.2 Transformer及其在图…

ChātGPT赋能的“SolidWorks工具箱”:重塑3D设计效率新标杆

ChātGPT精心打造的“SolidWorks工具箱”正逐步成为3D设计领域中的一颗璀璨新星&#xff0c;其集高效、便捷与创新于一身&#xff0c;为用户带来了前所未有的设计体验。以下是对这一革命性工具箱的深度剖析与美化呈现&#xff1a; 一、核心功能&#xff1a;重塑设计流程&#x…

基于CNN的FashionMNIST数据集识别3——模型验证

源码 import torch import torch.utils.data as Data from torchvision import transforms from torchvision.datasets import FashionMNIST from model import LeNetdef test_data_process():test_data FashionMNIST(root./data,trainFalse,transformtransforms.Compose([tr…

洛谷P1135多题解

解法1&#xff1a;BFS&#xff0c;有n个节点每个节点最多被访问一次&#xff0c;所以BFS时间复杂度为O(n)。注意ab的特判。 #include<iostream> #include<cstring> #include<queue> using namespace std; const int N 205; int n, a, b; int k[N], s[N]; b…

用AI写游戏3——deepseek实现kotlin android studio greedy snake game 贪吃蛇游戏

项目下载 https://download.csdn.net/download/AnalogElectronic/90421306 项目结构 就是通过android studio 建空项目&#xff0c;改下MainActivity.kt的内容就完事了 ctrlshiftalts 看项目结构如下 核心代码 MainActivity.kt package com.example.snakegame1// MainA…

论文解读 | AAAI'25 Cobra:多模态扩展的大型语言模型,以实现高效推理

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入&#xff01; 点击 阅读原文 观看作者讲解回放&#xff01; 个人信息 作者&#xff1a;赵晗&#xff0c;浙江大学-西湖大学联合培养博士生 内容简介 近年来&#xff0c;在各个领域应用多模态大语言模型&#xff08;MLLMs&…

DPVS-3: 双臂负载均衡测试

测试拓扑 双臂模式&#xff0c; 使用两个网卡&#xff0c;一个对外&#xff0c;一个对内。 Client host是物理机&#xff0c; RS host都是虚拟机。 LB host是物理机&#xff0c;两个CX5网卡分别在两个子网。 配置文件 用dpvs.conf.sample作为双臂配置文件&#xff0c;其中…