萤火虫优化算法(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_fireflies
        self.dim = dim
        self.alpha = alpha
        self.beta = beta
        self.gamma = gamma
        self.objective_function = objective_function
        self.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

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

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

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

相关文章

[AIGC] 跳跃表是如何实现的?原理?

文章目录 什么是跳跃表查找流程:为什么使用跳跃表?跳跃表是怎么实现的? PS:跳跃表是比较常问的一种结构。 什么是跳跃表 Skip Lists: A Probabilistic Alternative to Balanced Trees 跳跃表是一种可以用来代替平衡树的数据结构。跳跃表使用概率平衡…

微服务核心01-Maven【项目管理工具】高级

一、分模块开发与设计(重点⭐) ssm_pojo 拆分 新建模块拷贝原始项目中对应的相关内容到 ssm_pojo 模块中 实体类 (User)配置 文件(无) ssm_dao 拆分 ssm_service 拆分 ssm_control 拆分 二、聚合&#xff…

齿轮滚刀刃口钝化技术简介

介绍 在滚刀的使用中发现,进口滚刀和国产滚刀在加工质量和寿命方面存在显著差异。经过多次比较得知,滚刀的使用寿命可以达到国产滚刀的两倍以上,而进口滚刀返回原厂磨削后的使用寿命约为新刀具的90% ,但同样经过国内厂家磨削后&a…

第 1 天_二分查找【算法基础】

第 1 天_二分查找 前言34. 在排序数组中查找元素的第一个和最后一个位置题解官方33. 搜索旋转排序数组题解官方74. 搜索二维矩阵 前言 这是陈旧已久的草稿2021-11-09 19:33:44 当时在学习数据结构,然后再LeetCode上找了一个算法基础。 但是后来又没做了。 现在20…

1. 抓娃娃-二分

因为这个限制,所以不用担心线段比区间长 线段一定比区间短的话,想要判断是否线段的二分之一及以上在区间内,则可以转化为线段中点是否在区间内的问题 如果没有那个限制,那么就无法这么考虑了,因为即使中点在区间内&…

PUBG非升级实用枪皮-部分盘点

藏匿处的黑货箱武器需要耗费高额成本才能升级 对于像我这样的日常休闲玩家来说是一笔不小的(巨大的!)负担 其实有许多普通非升级枪皮也是不错的选择 今天就来盘点一下我自己日常在用的普通皮 来看看你是不是也在用一样的 (仅是盘点…

251 基于matlab的动态粒子群算法

基于matlab的动态粒子群算法。普通粒子群算法无法感知外界环境的变化,在外界环境发生改变时无法实时进行响应,因而缺乏动态环境寻优能力。在普通粒子群算法基本上通过增加敏感粒子得到一种动态粒子群算法,该算法通过实时计算敏感粒子的适应度…

系统权限控制插件封装-实现系统权限控制插件化

背景:按照传统的开发方式方式,每次新开发一个系统,就需要花费大量时间精力去搭建权限控制模块,如果我们把权限控制这一整个模块都抽离成一个独立的权限控制插件,支持单命令安装,全面暴露参数与方法&#xf…

【算法】竞赛常用知识之字符串1

前言: 本系列是学习了董晓老师所讲的知识点做的笔记 董晓算法的个人空间-董晓算法个人主页-哔哩哔哩视频 (bilibili.com) 动态规划系列(还没学完) 【算法】动态规划之线性DP问题-CSDN博客 【算法】动态规划之背包DP问题(2024…

Linux中云盘/磁盘,爆满处理方式

1:du和df命令查看磁盘大小不一致 以下是阿里云服务器云盘使用率 运行 du -sh / 大小为20g 我的服务器大小为40g 按道理说这个云盘使用率应该是百分之五十 而运行 df -h / 这个命令是跟这个云盘使用率差不多的。 1.1分析原因 我安装了mysql,nginx…

47岁古天乐唯一承认女友约「御用阿妈」过母亲节

日前关宝慧在IG晒出一张聚会照,并写道:「预祝各位#母亲节快乐🌹#dinner #happy #friends #好味」相中所见,前TVB金牌监制潘嘉德、卢宛茵、黄𨥈莹、黎萨达姆都有出席饭局。 当中黄𨥈莹身穿卡其色西装褛&…

从“制造”到“智造”:“灯塔”经验助力中国制造业转型升级-转载

作者:Karel Eloot,侯文皓,Francisco Betti,Enno de Boer和Yves Giraud 作为中国实体经济的主体,制造业是推动中国经济发展乃至全球制造业持续增长的重要引擎。站在历史与未来交汇的新起点上,中国制造业将背…

ERP与MES与WMS集成

WMS储位管理 WMS与MES集成 (一) 打通追溯链 在拣货时,将配料标签与供应商的物料标签进行关联。通过配料标签达到精确追溯及防错目的。针对模糊查询,将工单与物料的供应商信息、仓库流转信息进行关联。 (二) WMS入库 成品(半成品)下线后,M…

MySQL查询篇-聚合函数-窗口函数

文章目录 distinct 关键字聚合函数常见的聚合函数group by和having 分组过滤 窗口函数with as窗口聚合函数排名窗口函数值窗口函数 distinct 关键字 distinct 去重数据,ps:null值也会查出来 select distinct column from table;聚合函数 常见的聚合函数 select …

【前端系列】什么是yarn

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

浅谈@Controller注解和其他四大注解的区别

各位大佬光临寒舍,希望各位能赏脸给个三连,谢谢各位大佬了!!! 目录 1.Spring五大注解的使用约定 2.Controller注解的特别之处 3.总结 1.Spring五大注解的使用约定 Spring的五大注解(Controller&#x…

【无标题】能效?性能?一个关于openssl speed速度测试的诡异问题。

问题描述 最近的某个软件用到了openssl,所以就想着测试一下速度。我的电脑是惠普的,CPU是AMD Ryzen 7 PRO 6850HS,系统是Win11。我使用openssl自带的speed测试加密/解密的速度,命令大致如下: openssl speed -evp aes…

python数据分析——matplotlib可视化基础

参考资料:活用pandas库 # 导入库 import pandas as pd import matplotlib.pyplot as plt # 导入数据 anscombepd.read_csv(r"...\seaborn常用数据案例\anscombe.csv") anscombe.head() 大多数基本图表的名字以plt.plot开头。 # 创建数据子集 # 只包含数…

电力场景设备漏油检测数据集VOC+YOLO格式338张1类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):338 标注数量(xml文件个数):338 标注数量(txt文件个数):338 标注类别…

linux学习:视频输入+V4L2

目录 V4L2 视频采集流程 代码例子 核心命令字和结构体 VIDIOC_ENUM_FMT VIDIOC_G_FMT / VIDIOC_S_FMT / VIDIOC_TRY_FM VIDIOC_REQBUFS VIDIOC_QUERYBUF VIDIOC_QBUF /VIDIOC_DQBUF VIDIOC_STREAMON / VIDIOC_STREAMOFF V4L2 是 Linux 处理视频的最新标准代码模块&…