智能优化算法:莲花算法(Lotus flower algorithm,LFA)介绍,提供MATLAB代码
一、 莲花算法
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=1∑N(Xi−Xj)
其中, 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=1∑NVj
其中, 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=1∑N(Xj−Xi)
其中, X j X_j Xj 表示邻近个体的位置。 -
食物吸引(Food Attraction):个体向食物源移动,计算公式为:
F i = X food − X i F_i = X_{\text{food}} - X_i Fi=Xfood−Xi
其中, X food X_{\text{food}} Xfood 表示食物源的位置。 -
敌人回避(Enemy Distraction):个体远离敌人,计算公式为:
E i = X enemy − X i E_i = X_{\text{enemy}} - X_i Ei=Xenemy−Xi
其中, 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(Xit−g∗)
其中, 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=∣∣fmin−fmax∣∣∣∣fi−fmax∣∣×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 的主要步骤如下:
- 初始化:生成初始解,随机分布蜻蜓(解)在搜索空间中。
- 评估:计算每个解的适应度值,确定当前最优解。
- 更新:根据蜻蜓算法的机制更新解的位置,包括分离、对齐、内聚、食物吸引和敌人回避。
- 局部搜索:在当前最优解附近进行局部搜索,模拟水滴在荷叶上的移动。
- 终止条件:检查是否达到最大迭代次数或满足其他终止条件。如果未满足,则返回步骤 2。
1.3 算法流程

莲花算法的流程主要包括以下步骤:
- 初始化:随机生成一群蜻蜓(每个蜻蜓代表一个候选解),并设定算法的参数,如种群大小、最大迭代次数等。
- 评估:计算每个蜻蜓的位置对应的适应度值,确定当前最优解。
- 更新:根据蜻蜓算法的机制更新蜻蜓的位置,包括分离、对齐、内聚、食物吸引和敌人回避。
- 局部搜索:在当前最优解附近进行局部搜索,模拟水滴在荷叶上的移动。
- 终止条件:检查是否达到最大迭代次数或满足其他终止条件。如果未满足,则返回步骤 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=1∑N(Xi−Xj)其中, 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=1∑NVj其中, 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=1∑N(Xj−Xi)其中, X j X_j Xj 表示邻近个体的位置。
-
食物吸引(Food Attraction):个体向食物源移动,计算公式为: F i = X food − X i F_i = X_{\text{food}} - X_i Fi=Xfood−Xi其中, X food X_{\text{food}} Xfood 表示食物源的位置。
-
敌人回避(Enemy Distraction):个体远离敌人,计算公式为: E i = X enemy − X i E_i = X_{\text{enemy}} - X_i Ei=Xenemy−Xi其中, 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)==1ub=ones(1,dim)*ub;lb=ones(1,dim)*lb;
endr=(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_iterationr=(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<0my_c=0;ends=2*rand*my_c; a=2*rand*my_c; c=2*rand*my_c; f=2*rand; e=my_c; for i=1:SearchAgents_noFitness(1,i)=fobj(X(:,i)');if Fitness(1,i)<Food_fitnessFood_fitness=Fitness(1,i);Food_pos=X(:,i);endif Fitness(1,i)>Enemy_fitnessif all(X(:,i)<ub') && all( X(:,i)>lb')Enemy_fitness=Fitness(1,i);Enemy_pos=X(:,i);endendendfor i=1:SearchAgents_noindex=0;neighbours_no=0;clear Neighbours_DeltaXclear Neighbours_X%find the neighbouring solutionsfor j=1:SearchAgents_noDist2Enemy=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);endendS=zeros(dim,1);if neighbours_no>1for k=1:neighbours_noS=S+(Neighbours_X(:,k)-X(:,i));endS=-S;elseS=zeros(dim,1);endif neighbours_no>1A=(sum(Neighbours_DeltaX')')/neighbours_no;elseA=DeltaX(:,i);endif neighbours_no>1C_temp=(sum(Neighbours_X')')/neighbours_no;elseC_temp=X(:,i);endC=C_temp-X(:,i);Dist2Food=distance(X(:,i),Food_pos(:,1));if all(Dist2Food<=r)F=Food_pos-X(:,i);elseF=0;endDist2Enemy=distance(X(:,i),Enemy_pos(:,1));if all(Dist2Enemy<=r)Enemy=Enemy_pos+X(:,i);elseEnemy=zeros(dim,1);endfor tt=1:dimif X(tt,i)>ub(tt)X(tt,i)=lb(tt);DeltaX(tt,i)=rand;endif X(tt,i)<lb(tt)X(tt,i)=ub(tt);DeltaX(tt,i)=rand;endendif any(Dist2Food>r)if neighbours_no>1for j=1:dimDeltaX(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);endif DeltaX(j,i)<-Delta_max(j)DeltaX(j,i)=-Delta_max(j);endX(j,i)=X(j,i)+DeltaX(j,i);endelse% Eq. (3.8)X(:,i)=X(:,i)+Levy(dim)'.*X(:,i);DeltaX(:,i)=0;endelsefor 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);endif DeltaX(j,i)<-Delta_max(j)DeltaX(j,i)=-Delta_max(j);endX(j,i)=X(j,i)+DeltaX(j,i);end endFlag4ub=X(:,i)>ub';Flag4lb=X(:,i)<lb';X(:,i)=(X(:,i).*(~(Flag4ub+Flag4lb)))+ub'.*Flag4ub+lb'.*Flag4lb;endBest_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
相关文章:
智能优化算法:莲花算法(Lotus flower algorithm,LFA)介绍,提供MATLAB代码
一、 莲花算法 1.1 算法原理 莲花算法(Lotus flower algorithm,LFA)是一种受自然启发的优化算法,其灵感来源于莲花的自清洁特性和授粉过程。莲花的自清洁特性,即所谓的“莲花效应”,是由其叶片表面的微纳…...
通过AI辅助生成PPT (by quqi99)
作者:张华 发表于:2025-02-23 版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明(http://blog.csdn.net/quqi99) 问题 媳妇需要将一个pdf文件中的某些部分做成PPT课件,我在想是…...
P9631 [ICPC 2020 Nanjing R] Just Another Game of Stones Solution
Description 给定序列 a ( a 1 , a 2 , ⋯ , a n ) a(a_1,a_2,\cdots,a_n) a(a1,a2,⋯,an),有 m m m 个操作分两种: chmax ( l , r , k ) \operatorname{chmax}(l,r,k) chmax(l,r,k):对每个 i ∈ [ l , r ] i \in [l,r] i∈[l,…...
nodejs:vue 3 + vite 作为前端,将 html 填入<iframe>,在线查询英汉词典
向 doubao.com/chat/ 提问: node.js js-mdict 作为后端,vue 3 vite 作为前端,编写在线查询英汉词典 后端部分(express js-mdict ) 详见上一篇:nodejs:express js-mdict 作为后端ÿ…...
QEMU源码全解析 —— 内存虚拟化(18)
接前一篇文章:QEMU源码全解析 —— 内存虚拟化(17) 本文内容参考: 《趣谈Linux操作系统》 —— 刘超,极客时间 《QEMU/KVM源码解析与应用》 —— 李强,机械工业出版社 QEMU内存管理模型...
Spring Boot 日志管理(官网文档解读)
摘要 本篇文章详细介绍了SpringBoot 日志管理相关的内容,文章主要参考官网文章的描述内容,并在其基础上进行一定的总结和拓展,以方便学习Spring Boot 的小伙伴能快速掌握Spring Boot 日志管理相关的内容。 日志实现方式 Sping Boot 的日志管…...
MATLAB进阶之路:数据导入与处理
在MATLAB的学习旅程中,我们已经初步了解了它的基础操作。如今,我们将沿着这条充满惊喜的道路,迈向下一个重要的站点——数据导入与处理。这部分内容就像是为MATLAB注入了强大的能量,使其能够从现实的数据世界中汲取信息,然后像一位智慧的魔法师一样,巧妙地处理这些数据,…...
fcntl()函数的概念和使用案例 c语言
在 Linux 系统编程中,fcntl() 函数(File Control)是用于操作文件描述符的核心函数,可控制文件或套接字的底层属性。它支持多种操作,包括设置非阻塞模式、获取/设置文件状态标志、管理文件锁等。以下是详细概念和使用案…...
Linux红帽:RHCSA认证知识讲解(一)RedHat背景与环境配置
Linux红帽:RHCSA认证知识讲解(一)RedHat背景与环境配置 前言一、RedHat公司背景二、RedHat环境安装步骤三、windows使用远程工具连接环境并上传文件到redhat方法: 前言 在接下来的博客中,我们从基础开始将介绍红帽Linu…...
Windows11安装GPU版本Pytorch2.6教程
1: 准备工作 针对已经安装好的Windows11系统,先检查Nvidia驱动和使用的CUDA版本情况。先打开Windows PowerShell,通过nvidia-smi命令查看GPU的情况,结果如下图1所示,从结果中可知使用的CUDA版本为12.8。 图1:检测安装…...
网络传输的七层协议
网络传输的七层协议是 OSI模型(开放系统互联模型) 中的七个层次,每一层都负责不同的网络功能。具体如下: 物理层(Physical Layer) 负责在物理媒介上传输比特流,即将数据以电信号、光信号等形式在…...
【蓝桥杯集训·每日一题2025】 AcWing 6134. 哞叫时间II python
6134. 哞叫时间II Week 1 2月20日 农夫约翰正在试图向埃尔茜描述他最喜欢的 USACO 竞赛,但她很难理解为什么他这么喜欢它。 他说「竞赛中我最喜欢的部分是贝茜说『现在是哞哞时间』并在整个竞赛中一直哞哞叫」。 埃尔茜仍然不理解,所以农夫约翰将竞赛…...
Spring Boot数据访问(JDBC)全解析:从基础配置到高级调优
文章目录 引言一、Spring Boot JDBC核心架构1.1 核心组件关系图1.2 自动配置逻辑 二、基础配置实践2.1 数据源配置2.2 多数据源配置 三、JdbcTemplate深度使用3.1 基础CRUD操作3.2 批处理优化 四、事务管理4.1 声明式事务4.2 事务传播机制 五、异常处理5.1 Spring异常体系5.2 自…...
三数之和:经典问题的多种优化策略
三数之和:经典问题的多种优化策略 大家好,我是Echo_Wish。今天我们来聊一个经典的算法问题——三数之和(3Sum)。它是许多面试和算法竞赛中常见的问题之一,也常常考察我们对算法优化的理解和技巧。我们不仅要解决问题&…...
信息学奥赛一本通 1520:【 例 1】分离的路径 | 洛谷 P2860 [USACO06JAN]Redundant Paths G
【题目链接】 ybt 1520:【 例 1】分离的路径 洛谷 P2860 [USACO06JAN]Redundant Paths G 【题目考点】 1. 图论:割边(桥) 边双连通分量 【解题思路】 每个草场是一个顶点,草场之间的双向路是无向边,该…...
架构师面试(六):熔断和降级
问题 在千万日活的电商系统中,商品列表页服务通过 RPC 调用广告服务;经过统计发现,在最近10秒的时间里,商品列表页服务在对广告服务的调用中有 98% 的调用是超时的; 针对这个场景,下面哪几项的说法是正确的…...
使用 DeepSeek 生成流程图、甘特图与思维导图:结合 Typora 和 XMind 的高效工作流
在现代工作与学习中,可视化工具如流程图、甘特图和思维导图能够极大地提升信息整理与表达的效率。本文将详细介绍如何使用 DeepSeek 生成 Mermaid 文本,结合 Typora 快速生成流程图和甘特图,并通过 Markdown 格式生成思维导图,最终…...
粘贴到Word里的图片显示不全
粘贴到Word里的图片显示不全,可从Word设置、图片本身、软件与系统等方面着手解决,具体方法如下: Word软件设置 经实践发现,图片在word行距的行距出现问题,可以按照如下调整行距进行处理 修改段落行距: 选…...
【C语言】结构体内存对齐问题
1.结构体内存对齐 我们已经基本掌握了结构体的使用了。那我们现在必须得知道结构体在内存中是如何存储的?内存是如何分配的?所以我们得知道如何计算结构体的大小?这就引出了我们今天所要探讨的内容:结构体内存对齐。 1.1 对齐规…...
【蓝桥杯单片机】第十三届省赛第二场
一、真题 二、模块构建 1.编写初始化函数(init.c) void Cls_Peripheral(void); 关闭led led对应的锁存器由Y4C控制关闭蜂鸣器和继电器 2.编写LED函数(led.c) void Led_Disp(unsigned char ucLed); 将ucLed取反的值赋给P0 开启锁存器 关闭锁存…...
使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...
高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...
涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...
SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...
安卓基础(aar)
重新设置java21的环境,临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的: MyApp/ ├── app/ …...
算法岗面试经验分享-大模型篇
文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer (1)资源 论文&a…...
Linux离线(zip方式)安装docker
目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1:修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本:CentOS 7 64位 内核版本:3.10.0 相关命令: uname -rcat /etc/os-rele…...
