萤火虫优化算法(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.mzph.cn/news/835884.shtml

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

相关文章

Blender细节补充

1.饼状菜单,用于快速切换/选择 例如: ~:切换视图 Z:切换着色方式 ,:切换坐标系 .:切换基准点 Shift S:吸附 有两种使用方式: -点选 -滑选,按快捷键…

表的创建与操作表

1. 创建表 创建表有两种方式 : 一种是白手起家自己添,一种是富二代直接继承. 2. 创建方式1 (1). 必须具备条件 CREATE TABLE权限存储空间 (2). 语法格式 CREATE TABLE IF NOT EXISTS 表名(字段1, 数据类型 [约束条件] [默认值],字段2, 数据类型 [约束条件] [默…

node pnpm修改默认包的存储路径

pnpm与npm的区别 PNPM和NPM是两个不同的包管理工具。 NPM(Node Package Manager)是Node.js的官方包管理工具,用于安装、发布和管理Node.js模块。NPM将包安装在项目的node_modules目录中,每个包都有自己的依赖树。 PNPM&#xf…

Flowable常用API

Flowable常用API RepositoryService RepositoryService很可能是使用Flowable引擎要用的第一个服务。这个服务提供了管理与控制部署(deployments)与流程定义(process definitions)的操作.一个部署中可以包含多个BPMN 2.0 XML文件及其他资源. RuntimeService TaskService 查…

【Bug】Clash出现端口0的情况

win版本的Docker桌面版用了Hyper-V的功能,虚拟机需要映射一部分端口,并且在系统更新后对动态映射的端口范围进行了更改,导致占用了本来的7890Clash使用的端口。 cmd去查看还能使用的端口 netsh interface ipv4 show excludedportrange prot…

从0开发、发布油猴脚本(保姆级)

概览 项目中使用conify集成图标,有些内网用户只能使用离线图标,但是如何判断使用的conify集成图标是在线还是离线呢?这个时候就需要一个油猴脚本,作用于iconify官网,对离线图标进行标识。 此篇文章主要从如下几点去梳…

HIVE调优-分区分桶,合并小文件

HIVE调优-分区分桶,合并小文件 目录 HIVE调优-分区分桶,合并小文件 1.分区分桶,合并小文件 1)为什么小文件需要合并? 2)如何合并小文件: 1.分区分桶,合并小文件 1)为什…

MySQL数据库的初始化(创建库、创建表、向数据库添加测试数据)

MySQL数据库的初始化(创建库、创建表、向数据库添加测试数据) MySQL数据库简介MySQL创建一个新的数据库MySQL创建一张新的数据表简单(设置)表复杂(设置)表 填充测试数据SQL语句mysql>模式下输入的每句sq…

现代信号处理9_正则化(CSDN_20240512)

正则化的引入 解线性方程组: 这项工作有很多种做法,下面介绍两种,如下图所示,有一些数据点需要拟合,拟合的方法有很多。 1) 构造线性函数①,这种函数比较简单,此时 2) 构…

跟TED演讲学英文:Why US politics is broken — and how to fix it by Andrew Yang

Why US politics is broken — and how to fix it Link: https://www.ted.com/talks/andrew_yang_why_us_politics_is_broken_and_how_to_fix_it? Speaker: Andrew Yang Date: April 2024 文章目录 Why US politics is broken — and how to fix itIntroductionVocabularyTr…

物联网与JavaScript:JavaScript在物联网领域中的应用,使用Node.js和JavaScript来控制硬件设备

当我们谈到物联网(IoT)时,我们通常会想到硬件和嵌入式编程语言,比如C或C。然而,JavaScript通过Node.js,也能够在物联网领域发挥作用。 Node.js是一个能够在服务器端运行JavaScript的平台,这使得…

wordpress主题 7B2 PRO主题5.4.2免授权直接安装

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 三、学习资料下载 一、详细介绍 WordPress 资讯、资源、社交、商城、圈子、导航等多功能商用主题:B2 PRO 其设计风格专业且时尚,功能十分强大,包括多栏布局、自定义页面、强大的主…

初始化VUE项目Sorry, name can no longer contain capital letters

安装过VUE脚手架,创建项目 vue init webpack vueDemoOne 报错 Sorry, name can no longer contain capital letters 翻译了一下,意思就是项目名不能包含大写字母,修改原来的驼峰命名,修改后成功创建。 vue init webpack vue_de…

【JavaEE网络】HTTPS详解:从对称与非对称加密到证书认证

目录 HTTPSHTTPS 是什么“加密” 是什么HTTTPS 的工作过程引入对称加密引入非对称加密引入证书完整流程总结 HTTPS HTTPS 是什么 HTTPS 也是一个应用层协议. 是在 HTTP 协议的基础上引入了一个加密层. HTTP 协议内容都是按照文本的方式明文传输的. 这就导致在传输过程中出现…

LeetCode - 0088 合并两个有序数组

题目地址:https://leetcode.cn/problems/merge-sorted-array/description/ 引言:话接上回,由于上次面试官着急下班,面试不得不提前终止,这不,他又找我去面试了 面试官:你好,小伙子&a…

Redis——Java三种客户端(Jedis、Lettuce和Redisson)

Redis在Java领域有着广泛的应用,为了更方便地与Redis进行交互,开发者们创建了多种Java客户端。其中,Jedis、Lettuce和Redisson是三种最为流行的Redis Java客户端。以下是关于这三种客户端的简要介绍: Jedis: Jedis是…

C++入门——命名空间、缺省参数、函数重载、引用、内敛函数、auto关键字

目录 前言 一、什么是C 1.1 C关键字(C98) 二、命名空间 2.1 命名空间定义 1.正常命名空间的定义 2.命名空间的定义可以嵌套 3.同名的命名空间会合并 2.2 命名空间的使用 三、C输入&输出 四、缺省参数 4.1 缺省参数概念 4.2 缺省参数分类 五、函数重载 5.1 …

C++数据抽象:构建安全且灵活的软件组件

目录标题 1. 数据抽象简介2. 抽象类与纯虚函数3. 实现数据抽象的步骤4. 示例:抽象基类与具体派生类5. 结论 在C编程语言中,数据抽象是一种核心的编程概念,它允许我们创建简单且易于管理的代码结构。通过数据抽象,我们可以隐藏复杂…

Vue11 Vue3完结撒花

shallowRef和shallowReactive shallowRef 作用&#xff1a;创建一个响应式数据&#xff0c;但只对顶层属性进行响应式处理 用法 let myVar shallowRef(initialValue)特点&#xff1a;只跟踪引用值变化&#xff0c;不关心值内部的属性变化 案例 <template><div c…

Springboot集成Netflix-ribbon、Enreka实现负载均衡-12

Netflix Ribbon简介 Netflix Ribbon是Netflix发布的云中间层服务开源项目&#xff0c;主要功能是提供客户端的软件负载均衡算法&#xff0c;将Netflix的中间层服务连接在一起。 具体来说&#xff0c;Ribbon是一个客户端负载均衡器&#xff0c;可以在配置文件中列出所有的服务…