萤火虫优化算法(Firefly Algorithm)

注意:本文引用自专业人工智能社区Venus AI

更多AI知识请参考原站 ([www.aideeplearning.cn])

算法背景

萤火虫优化算法,是由剑桥大学的Xin-She Yang在2009年提出的一种基于群体智能的优化算法。它的灵感来源于萤火虫在夜晚闪烁发光的行为。在自然界中,萤火虫通过发光来吸引配偶或猎物,而且通常光线越亮,越能吸引其他萤火虫。 想象一下,在一个夏夜的草地上,成群的萤火虫在草尖上闪烁着光芒。每只萤火虫都试图飞向光线更亮的同伴,因为在它们看来,光亮代表着更佳的配偶或更丰富的食物。这个场景就是萤火虫算法的微缩模型:每只萤火虫代表一个潜在的解决方案,而它们相互间的吸引就是寻找最优解的过程。

萤火虫优化算法的核心思想是模拟自然界中萤火虫的行为特点,主要包括以下几个关键点:

  1. 亮度(吸引力):在萤火虫算法中,每只萤火虫的亮度代表着它的优化目标函数值。在优化问题中,这可以是函数的最大值或最小值。亮度越高的萤火虫,代表着更优的解决方案。
  2. 吸引和移动:萤火虫会被周围更亮的萤火虫所吸引,并朝着更亮的萤火虫移动。这意味着每只萤火虫会根据周围的“最佳”解决方案来调整自己的位置。在优化过程中,这就是搜索空间中的移动过程。
  3. 光度衰减:自然界中,光线的强度会随着距离的增加而减弱。在算法中,这被模拟为吸引力随距离而减弱。这意味着,只有在较近的距离内,萤火虫之间才会有较强的相互吸引力。
  4. 随机行为:萤火虫的移动不仅仅由吸引力引导,还包含一定的随机性。这有助于算法探索更广阔的搜索空间,避免陷入局部最优解。

通过这种方式,萤火虫群体逐渐聚集到最亮的点,即问题的最优解。萤火虫算法的优势在于它的简单性和能够有效避免局部最优解的能力,特别适用于复杂的优化问题。

算法应用

萤火虫算法的应用领域主要包括:

  1. 工程优化:在工程设计和优化中,比如机械设计、结构优化、电气系统设计等,萤火虫算法可以用来寻找最优的设计参数,以达到成本最低、性能最佳等目标。
  2. 机器学习:在机器学习领域,萤火虫算法可以用于特征选择和算法调优。它可以帮助识别出最重要的特征,或者找到最佳的算法参数。
  3. 调度问题:在生产调度和任务调度问题中,萤火虫算法可以帮助找到最优的任务安排方案,以减少时间和成本。
  4. 网络设计:在通信网络和计算机网络设计中,萤火虫算法可以用于寻找最佳的网络布局和资源分配方案。
  5. 组合优化问题:比如旅行商问题(TSP),萤火虫算法可以帮助找到最短的路径,以解决复杂的组合优化问题。
  6. 环境模型和优化:在环境科学中,萤火虫算法可以用来模拟和优化环境系统,比如水资源管理、污染控制等。

算法计算流程

萤火虫优化算法的计算流程通常包括以下几个步骤:

  1. 初始化:生成初始的萤火虫群体。每个萤火虫代表一个潜在的解,并且有一个与之相关的亮度,通常是由优化问题的目标函数决定的。
  2. 亮度评估:计算每个萤火虫的亮度。在最简单的形式中,亮度可以直接等于目标函数的值。在其他情况下,可能需要对目标函数值进行转换或调整。
  3. 移动萤火虫:根据其他萤火虫的亮度更新萤火虫的位置。每个萤火虫会向更亮的萤火虫移动,移动的方式可以是简单的向量加法。移动的距离可以取决于两个萤火虫之间的距离和亮度差。
  4. 光吸收:由于光的传播,亮度会随着距离的增加而减少。这通常通过一个衰减系数来模拟,它决定了亮度如何随距离减少。
  5. 更新和迭代:根据新的位置更新萤火虫的亮度。重复步骤3和4,直到满足停止准则,比如达到预定的迭代次数或解的质量。
  6. 选择最优解:在所有迭代完成后,选择亮度最高(或根据问题设定,可能是最低)的萤火虫所代表的解作为最终解。

我们可以使用萤火虫优化算法来优化函数 f(x,y)=x^2+y^2,这是一个典型的优化问题,其目标是找到使 f(x,y) 最小的 x 和 y 的值。在这个例子中,最优解显然是 x=0 和 y=0 。

让我们通过一个简化的例子来手动演示一轮迭代的过程:

初始设置
– 假设营火虫 A 的初始位置为(x_A,y_A)=(1,2) ,其函数值f_A=1^2+2^2=5 。
– 假设萤火虫 B 的初始位置为(x_B,y_B)=(2,3),其函数值 f_B=2^2+3^2=13 。

计算亮度
– 因为我们希望最小化函数,所以亮度可以用 1/f(x,y) 表示(为了避免除以零的情况,我们可以使用1/(1+f(x,y)) 。
– 因此,萤火虫 A 的亮度为 L_A=1/(1+5)=1/6,萤火虫 B 的亮度为 LB= 1/(1+13)=1/14 。

移动萤火虫
由于 B 比 A 更暗,B 将朝着 A 移动。移动的距离取决于亮度差和距离。萤火虫 B 向 A 移动的距离可以通过以下公式计算:


其中:
– β 是吸引力的基础值,通常设置为一个常数,例如 1 。
– γ 是光强衰减系数,它决定了亮度随距离减少的速率。
– 距离是两个茧火虫之间的欧几里得距离。

让我们使用此公式来计算 B 向 A 移动的新位置。首先,我们需要计算 A 和 B 之间的距离:

– 距离d=\sqrt{(x_B-x_A)^2+(y_B-y_A)^2}

应用移动公式计算得分B的新位置:
– 假设 β=1 和 γ=1 (这些值通常是根据问题和实验结果来调整的)。

根据萤火虫优化算法的计算公式,我们得到 B 的新位置为大约 (1.865,2.865) 。

结果比较
– 初始的 f_B=13 ,更新后的f_{B}^{\prime}=11.7。这证明了经过一轮迭代后,萤火虫 B 的位置更接近最优解,因为函数值减小了。

代码实现

下面,我们来实现一个简化版的萤火虫优化算法。假设我们有一个问题需要解决,比如寻找一个函数的最大值。每只萤火虫代表了搜索空间中的一个潜在解决方案,而它们的亮度则代表了解决方案的好坏(在我们的例子中,函数值越高,亮度越亮)。


import numpy as np
class FireflyAlgorithm():def __init__(self, n_fireflies, dim, alpha, beta, gamma, objective_function):self.n_fireflies = n_firefliesself.dim = dimself.alpha = alphaself.beta = betaself.gamma = gammaself.objective_function = objective_functionself.fireflies = np.random.rand(n_fireflies, dim)self.light_intensity = np.zeros(n_fireflies)def update_light_intensity(self):for i in range(self.n_fireflies):self.light_intensity[i] = self.objective_function(self.fireflies[i])def move_firefly(self, i, j):r = np.linalg.norm(self.fireflies[i] - self.fireflies[j])attractiveness = self.beta * np.exp(-self.gamma * r ** 2)self.fireflies[i] += attractiveness * (self.fireflies[j] - self.fireflies[i]) + self.alpha * (np.random.rand(self.dim) - 0.5)def optimize(self, max_generations):for _ in range(max_generations):self.update_light_intensity()for i in range(self.n_fireflies):for j in range(self.n_fireflies):if self.light_intensity[j] > self.light_intensity[i]:self.move_firefly(i, j)
# 示例目标函数
def objective_function(x):return -np.sum(x**2)
# 算法参数
n_fireflies = 40
dim = 2
alpha = 0.5
beta = 1.0
gamma = 1.0
max_generations = 100
# 执行优化
fa = FireflyAlgorithm(n_fireflies, dim, alpha, beta, gamma, objective_function)
fa.optimize(max_generations)
# 找到的最佳解
best_firefly_index = np.argmax(fa.light_intensity)
best_solution = fa.fireflies[best_firefly_index]
best_value = fa.light_intensity[best_firefly_index]
print("最佳解:", best_solution)
print("最佳值:", best_value)

请可视化初始化状态与训练后的状态做对比,结果如下:

图片[1]-萤火虫优化算法(Firefly Algorithm)-VenusAI

这幅图展示了萤火虫算法在初始化状态(左图)和训练后状态(右图)的对比。在初始化状态下,萤火虫(红色点)随机分布在搜索空间中。经过训练(迭代优化)之后,我们可以看到萤火虫(蓝色点)聚集在了函数值最高的区域,即我们的目标函数的最大值附近。这清晰地展示了萤火虫算法是如何从随机分布逐渐向最优解聚集的过程。通过这样的可视化,我们能够直观地理解算法的工作原理和效果。 ​

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

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

相关文章

[算法面试]_01_L1和L2正则化,为什么L1正则化更容易导致稀疏?

本人今年参加了很多面试,也有幸拿到了一些大厂的offer,整理了众多面试资料,后续还会分享众多面试资料。 整理成了面试系列,由于时间有限,每天整理一点,后续会陆续分享出来,感兴趣的朋友可关注收…

OBS插件--复合模糊

复合模糊 复合是一款滤镜插件,支持多种模糊类型和多种蒙版效果。支持模糊源的部分显示区域,可以反选区域进行模糊,这个功能对于场景部分区域需要遮盖非常实用。 下面截图演示下操作步骤: 首先,打开 OBS直播助手 在…

2024年数维杯数学建模

高质量原创论文已完成 需要的私我

MySQL性能优化:MySQL中的隐式转换造成的索引失效

目录 前言数据准备SQL测试分析和总结 前言 数据库优化是一个任重而道远的任务,想要做优化必须深入理解数据库的各种特性。在开发过程中我们经常会遇到一些原因很简单但造成的后果却很严重的疑难杂症,这类问题往往还不容易定位,排查费时费力最…

微服务下的技术栈架构解析

微服务是一种架构风格,它将一个复杂的应用拆分成多个独立自治的服务,每个服务负责应用程序中的一小部分功能。这些服务通过定义良好的API进行通信,通常是HTTP RESTful API或事件流。微服务架构的主要特点包括单一职责、自治性、可独立部署和扩…

力扣例题(用栈实现队列)

目录 链接. - 力扣(LeetCode) 描述 思路 push pop peek empty 代码 链接. - 力扣(LeetCode) 描述 思路 push 例如我们将10个元素放入栈中,假设最左边为栈顶,最右侧为栈底 则为10,9,8,7,6,5,4,3,…

PyCharm2024安装教程

PyCharm是一款功能强大的Python集成开发环境(IDE),它提供了许多工具和功能来帮助开发者编写、调试和测试Python代码。以下是使用PyCharm的基本步骤: 安装PyCharm:首先,你需要从JetBrains官方网站下载并安装…

关于画图-一次性搞定各类高级论文作图及配色

关于画图-一次性搞定各类高级论文作图及配色 图(Figure)可以让各类论文的结果更加直观,有时候一张图片比一大段文字更有说服力。 但许多新手作者可能会有一连串的疑惑:数据这么多,什么时候该做什么类型的图&#xff…

事务的基础

📝个人主页:五敷有你 🔥系列专栏:面经 ⛺️稳中求进,晒太阳 事务的基础 1)事务 事务是:一组操作的集合 ,他是不可分割的工作单位。事务会把所有操作作为一个整体一起向系统提…

Linux:Figshare网站文件下载(非浏览器)

参考aws亚马逊云下载figshare内容 Linux wget -c 下载网页内容crul -C_figshare怎么下载数据-CSDN博客 尝试一下 mamba search awscli mamba install awscli2.15.48 aws --version通过网页获取下载链接 比如: https://s3-eu-west-1.amazonaws.com/pfigshare-u-…

关键点检测——面部情绪数据集

引言 亲爱的读者们,您是否在寻找某个特定的数据集,用于研究或项目实践?欢迎您在评论区留言,或者通过公众号私信告诉我,您想要的数据集的类型主题。小编会竭尽全力为您寻找,并在找到后第一时间与您分享。 …

重写muduo之TcpServer

目录 1、Callbacks.h 2、TcpServer.h 3、TcpServer.cc 1、Callbacks.h 回调操作 #pragma once#include <memory> #include <functional>class Buffer; class TcpConnection;using TcpConnectionPtrstd::shared_ptr<TcpConnection>; using ConnectionCall…

解锁Spring Boot数据映射新利器:深度探索MapperStruct

解锁Spring Boot数据映射新利器&#xff1a;深度探索MapperStruct MapperStruct 是一个强大的 Java 映射工具&#xff0c;它的主要作用是简化对象之间的映射操作。在 Spring Boot 应用程序中&#xff0c;MapperStruct 通常用于将领域模型对象&#xff08;Domain Model&#xff…

WPF之工具栏菜单栏功能区。

1&#xff0c;菜单栏&#xff0c;工具栏&#xff0c;状态栏。 1.1&#xff0c;Menu中可添加菜单分隔条<Separator></Separator>作为分割线&#xff0c;使用Separator可以通过改变其template来自定义&#xff0c;Separator是无焦点的&#xff0c;如果简单的在MenuIt…

App下载绑定新方式:Xinstall带来的革命性改变

在当今数字化时代&#xff0c;移动应用&#xff08;App&#xff09;已成为企业与用户之间互动的重要桥梁。然而&#xff0c;对于许多企业来说&#xff0c;App下载与用户关系绑定一直是一个令人头疼的问题。这时&#xff0c;Xinstall应运而生&#xff0c;为企业提供了一种全新的…

mybatis 跨库查询 mysql

跨库&#xff0c;表关联的查询&#xff0c;实现起来很简单&#xff1a; select a.uid from ucenter.user a , database user_profile b where a.uid b.uid;只要在表的前边加上库名即可。 这个是我项目中xml 中的一个例子&#xff0c;项目采用的是springmvc,持久层框架就是my…

理解导数(x^n求导后nx^n-1)

以下都是为了方便理解 微小量是 t M(x)是一个函数 M 在 x 处的斜率 M 在 x 处的导数 垂直距离 平移距离 M ( x t ) − M ( x ) ( x t ) − x M在x处的斜率 M在x处的导数 \dfrac{垂直距离}{平移距离} \dfrac{M\left( xt\right) -M\left( x\right) }{(x t) -x} M在x处的斜…

探讨 vs2019 c++ 里函数指针与函数类型在使用上的语法区别

&#xff08;1&#xff09;咱们可以用 decltype &#xff08;&#xff09; 来判断函数的类型。但以这个类型定义有用的可指向已存在函数的变量&#xff0c;却行不通。测试如下&#xff1a; 如果把上面的注释去掉会报错&#xff1a; 所以函数类型只有语法意义。但在使用上没有函…

0X JavaSE-- UML、

# Unified Modeling Language UML 统一建模语言 UML 是一种图形化的语言。 UML 不是专门为 Java 准备的。 只要是面向对象的编程语言&#xff0c;开发前的设计&#xff0c;都需要画 UML 图进行系统设计。 最常用的四个 UML 图是 类图&#xff08;Class Diagram&#xff09;&…

基于yolov5+streamlit目标检测演示系统设计

YOLOv5与Streamlit&#xff1a;智能目标检测可视化展示介绍 随着人工智能技术的飞速发展&#xff0c;目标检测技术已成为推动智能化社会进步的关键技术之一。在众多目标检测算法中&#xff0c;YOLOv5以其卓越的性能和实时性&#xff0c;成为了业界的佼佼者。与此同时&#xff…