【数学建模】(智能优化算法)萤火虫算法(Firefly Algorithm)详解与实现

萤火虫算法(Firefly Algorithm)详解与实现

文章目录

  • 萤火虫算法(Firefly Algorithm)详解与实现
    • 前言
    • 1. 算法原理
    • 2. 算法流程
    • 3. Python实现
    • 4. 算法特点
      • 4.1 优点
      • 4.2 缺点
    • 5. 应用领域
    • 6. 算法变种
    • 7. 总结与展望
    • 参考文献

前言

大家好,今天给大家介绍一种有趣且高效的群体智能优化算法——萤火虫算法(Firefly Algorithm, FA)。作为一种生物启发式算法,它模拟了自然界中萤火虫的社会行为,特别是它们通过荧光相互吸引的特性。这个算法由剑桥大学的杨翔宇(Xin-She Yang)教授于2008年提出,在解决复杂优化问题方面表现出色。

1. 算法原理

萤火虫算法的灵感来源于热带地区萤火虫的闪烁行为。在自然界中,萤火虫通过发光来吸引异性或捕食。这种行为被抽象为以下几个规则:

  1. 所有萤火虫都是无性别的,一个萤火虫会被其他所有萤火虫吸引
  2. 吸引力与亮度成正比与距离成反比。对于任意两只萤火虫,较不明亮的会向较明亮的移动
  3. 萤火虫的亮度由目标函数值决定

萤火虫算法的核心在于定义吸引力和移动方式:

吸引力公式

β = β 0 ∗ e x p ( − γ r 2 ) β = β₀ * exp(-γr²) β=β0exp(γr2)

其中:

  • β 0 β₀ β0 是距离为0时的吸引力(通常设为1)
  • γ γ γ 是光吸收系数,控制吸引力随距离衰减的速度
  • r r r 是两只萤火虫之间的距离

位置更新公式
x i = x i + β ∗ ( x j − x i ) + α ∗ ( r a n d − 0.5 ) xᵢ = xᵢ + β * (xⱼ - xᵢ) + α * (rand - 0.5) xi=xi+β(xjxi)+α(rand0.5)

其中:

  • x i xᵢ xi 是当前萤火虫的位置
  • x j xⱼ xj 是更亮萤火虫的位置
  • β β β 是计算得到的吸引力
  • α α α 是随机扰动参数
  • r a n d rand rand 是0到1之间的随机数,所以 ( r a n d − 0.5 ) (rand - 0.5) (rand0.5) − 0.5 -0.5 0.5 0.5 0.5 0.5 之间的随机数

2. 算法流程

萤火虫算法的基本流程如下:

  1. 初始化参数:设定种群大小、最大迭代次数、光吸收系数 γ γ γ、吸引力参数 β 0 β₀ β0、随机因子 α α α
  2. 初始化萤火虫种群:随机生成初始位置
  3. 计算适应度:根据目标函数计算每只萤火虫的亮度
  4. 更新位置
    • 对每只萤火虫 i i i
    • 对每只比i亮的萤火虫 j j j
    • 计算i和j之间的距离 r r r
    • 计算吸引力 β β β
    • 更新 i i i的位置
  5. 评估新解:重新计算每只萤火虫的亮度
  6. 排序和找出当前最优解
  7. 迭代直到满足终止条件

3. Python实现

下面是萤火虫算法的Python实现示例:

import numpy as np
import matplotlib.pyplot as pltclass FireflyAlgorithm:def __init__(self, func, dim, lb, ub, pop_size=40, max_iter=100, alpha=0.5, beta0=1.0, gamma=1.0):self.func = func          # 目标函数self.dim = dim            # 问题维度self.lb = lb              # 下界self.ub = ub              # 上界self.pop_size = pop_size  # 种群大小self.max_iter = max_iter  # 最大迭代次数self.alpha = alpha        # 随机扰动参数self.beta0 = beta0        # 初始吸引力self.gamma = gamma        # 光吸收系数# 初始化萤火虫位置self.fireflies = np.random.uniform(lb, ub, (pop_size, dim))self.intensity = np.zeros(pop_size)self.best_solution = Noneself.best_fitness = float('inf')def evaluate(self):for i in range(self.pop_size):self.intensity[i] = self.func(self.fireflies[i])if self.intensity[i] < self.best_fitness:self.best_fitness = self.intensity[i]self.best_solution = self.fireflies[i].copy()def distance(self, i, j):return np.sqrt(np.sum((self.fireflies[i] - self.fireflies[j])**2))def move_fireflies(self):for i in range(self.pop_size):for j in range(self.pop_size):if self.intensity[j] < self.intensity[i]:  # j更亮r = self.distance(i, j)beta = self.beta0 * np.exp(-self.gamma * r**2)# 更新位置self.fireflies[i] = self.fireflies[i] + \beta * (self.fireflies[j] - self.fireflies[i]) + \self.alpha * (np.random.rand(self.dim) - 0.5)# 边界处理self.fireflies[i] = np.clip(self.fireflies[i], self.lb, self.ub)def run(self):convergence_curve = np.zeros(self.max_iter)for t in range(self.max_iter):self.evaluate()self.move_fireflies()convergence_curve[t] = self.best_fitness# 动态调整alpha参数(可选)self.alpha *= 0.98print(f"迭代 {t+1}/{self.max_iter}, 最优值: {self.best_fitness}")return self.best_solution, self.best_fitness, convergence_curve# 测试函数:Sphere函数
def sphere(x):return np.sum(x**2)# 运行算法
if __name__ == "__main__":dim = 10fa = FireflyAlgorithm(func=sphere,dim=dim,lb=-5.12 * np.ones(dim),ub=5.12 * np.ones(dim),pop_size=30,max_iter=100)best_solution, best_fitness, convergence = fa.run()print("\n最优解:", best_solution)print("最优值:", best_fitness)# 绘制收敛曲线plt.figure(figsize=(10, 6))plt.semilogy(range(1, fa.max_iter+1), convergence)plt.xlabel('迭代次数')plt.ylabel('目标函数值 (对数刻度)')plt.title('萤火虫算法收敛曲线')plt.grid(True)plt.show()

4. 算法特点

4.1 优点

  • 全局搜索能力强:萤火虫算法能够有效地探索解空间,避免陷入局部最优
  • 自动分组:算法能够自动将萤火虫分成多个子群,增强了多峰函数的寻优能力
  • 参数少:相比其他元启发式算法,参数较少且易于调整
  • 收敛速度快:在许多测试函数上表现出较快的收敛速度

4.2 缺点

  • 计算复杂度高:时间复杂度为O(n²),n为种群大小
  • 参数敏感:算法性能对参数γ和α较为敏感
  • 维数灾难:在高维问题上性能可能下降

5. 应用领域

萤火虫算法已成功应用于多个领域:

  1. 工程优化问题:结构设计、参数优化等
  2. 机器学习:特征选择、神经网络训练
  3. 图像处理:图像分割、边缘检测
  4. 调度问题:作业调度、资源分配
  5. 路径规划:旅行商问题、物流配送路径优化
  6. 电力系统:负载分配、电网优化

6. 算法变种

随着研究的深入,萤火虫算法也衍生出多种变体:

  1. 离散萤火虫算法:用于解决组合优化问题
  2. 混合萤火虫算法:与其他算法(如PSO、GA)结合
  3. 多目标萤火虫算法:处理多目标优化问题
  4. 混沌萤火虫算法:引入混沌映射提高搜索效率
  5. 自适应萤火虫算法:动态调整参数值

7. 总结与展望

萤火虫算法作为一种生物启发式优化算法,通过模拟萤火虫的社会行为,在解决复杂优化问题方面展现出良好的性能。它简单易实现,全局搜索能力强,在多个领域都有成功应用。

未来的研究方向可能包括:

  • 进一步改进算法以提高计算效率
  • 开发更有效的参数自适应机制
  • 将算法扩展到更多实际应用场景
  • 与深度学习等前沿技术结合

希望这篇文章能帮助大家理解萤火虫算法的原理和应用。如有问题,欢迎在评论区留言讨论!

参考文献

  1. Yang, X. S. (2008). Nature-inspired metaheuristic algorithms. Luniver press.
  2. Yang, X. S. (2009). Firefly algorithms for multimodal optimization. In International symposium on stochastic algorithms (pp. 169-178). Springer.
  3. Fister, I., Fister Jr, I., Yang, X. S., & Brest, J. (2013). A comprehensive review of firefly algorithms. Swarm and Evolutionary Computation, 13, 34-46.

以上就是萤火虫算法的详细介绍,希望对你有所帮助!如果你对算法有任何疑问或需要更深入的讨论,欢迎在评论区交流。

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

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

相关文章

VSCode会击败Cursor和Windsurf吗?

VSCode 会击败 Cursor 和 Windsurf 吗&#xff1f;微软能不能靠自己的地盘优势和规则限制打压对手&#xff1f;答案是"能"&#xff0c;但他们真的会这么干吗&#xff1f; Cursor & Windsurf vs VSCode Copilot 大PKAI编程工具大战越来越激烈现在最火最赚钱的AI…

2025-4-11 情绪周期视角复盘(mini)

简单说两句好了&#xff0c;做一个阶段记录&#xff0c;目前阶段就是上一轮 中毅达 第二轮补涨的退潮结束&#xff0c;回盛生物 金河生物 它们的题材导致 农业和医药这2个题材退潮&#xff0c;注意的是不靠谱导致的反制题材是在这个二轮补涨周期里一起走的&#xff0c;所以 海…

【SLAM】将realsense-viewer录制的rosbag视频导出成图片序列(RealSense D435)

本文介绍了如何将realsense-viewer录制的rosbag格式的视频导出成图片序列&#xff0c;方便合并成mp4视频或插入到论文中。 本文首发于❄慕雪的寒舍 说明 Intel提供的realsense-viewer软件录制的视频都是rosbag格式的&#xff0c;为了编写论文&#xff0c;需要从录制的视频中截…

Ubuntu ROS 对应版本

Ubuntu 18.04 (Bionic Beaver) - 2018年4月发布 对应的ROS版本&#xff1a;ROS Melodic (2018年5月发布) Ubuntu 20.04 (Focal Fossa) - 2020年4月发布 对应的ROS版本&#xff1a;ROS Noetic (2020年5月发布) Ubuntu 22.04 (Jammy Jellyfish) - 预计2022年4月发布 对应的ROS版…

Ubuntu 软件卸载与清理终极指南

Ubuntu 软件卸载与清理指南 适用范围&#xff1a;Ubuntu 及其衍生发行版&#xff08;如 Linux Mint、Pop!_OS 等&#xff09;&#xff0c;Debian 系统大部分方法也适用。 目标&#xff1a;帮助你快速、彻底卸载软件并清理残余文件&#xff0c;保持系统整洁。 前提&#xff1a;建…

基于javaweb的SpringBoot新闻视频发布推荐评论系统(源码+部署文档)

技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文…

Linux-内核驱动

open uboot.bin target-connect U-Boot&#xff08;Universal Boot Loader&#xff09;是一种广泛使用的开源引导加载程序&#xff0c;它允许用户从各种设备&#xff08;如硬盘、USB设备、网络等&#xff09;加载操作系统。U-Boot提供了丰富的命令行接口&#xff08;CLI&#…

DAPP实战篇:使用ethers.js连接以太坊智能合约

专栏:区块链入门到放弃查看目录-CSDN博客文章浏览阅读344次。为了方便查看将本专栏的所有内容列出目录,按照顺序查看即可。后续也会在此规划一下后续内容,因此如果遇到不能点击的,代表还没有更新。声明:文中所出观点大多数源于笔者多年开发经验所总结,如果你想要知道区块…

[原创](现代Delphi 12指南): 设置、运行和调试你的第一个macOS应用程序.

[作者] 常用网名: 猪头三 出生日期: 1981.XX.XX 企鹅交流: 643439947 个人网站: 80x86汇编小站 编程生涯: 2001年~至今[共24年] 职业生涯: 22年 开发语言: C/C、80x86ASM、Object Pascal、Objective-C、C#、R、Python、PHP、Perl、 开发工具: Visual Studio、Delphi、XCode、C …

Adobe Photoshop 2025 Mac中文 Ps图像编辑

Adobe Photoshop 2025 Mac中文 Ps图像编辑 一、介绍 Adobe Photoshop 2025 Mac版集成了多种强大的图像编辑、处理和创作功能。①强化了Adobe Sensei AI的应用&#xff0c;通过智能抠图、自动修复、图像生成等功能&#xff0c;用户能够快速而精确地编辑图像。②3D编辑和动画功…

蓝桥杯备赛知识点总结

一、数论 如果想要计算整除向上取整&#xff08;xy-1&#xff09;/y 或者&#xff08;x-1&#xff09;/y 1 最大公约数&#xff1a; int gcd(int a,int b){return b0?a:gcd(b,a%b); }最小公倍数&#xff1a; int lcm(int a,int b){return a/gcd(a,b)*b; } 埃氏筛法&#…

设计模式 --- 状态模式

状态模式​​是一种​​行为型设计模式​​&#xff0c;允许对象在内部状态改变时动态改变其行为​​&#xff0c;使对象的行为看起来像是改变了。该模式通过将状态逻辑拆分为独立类​​&#xff0c;消除复杂的条件分支语句&#xff0c;提升代码的可维护性和扩展性。 状态模式的…

【读者求助】如何跨行业进入招聘岗位?

文章目录 读者留言回信岗位细分1. 中介公司的招聘岗位2. 猎头专员3. 公司的招聘专员选择建议 面试建议1. 请简单介绍你过去 3 年的招聘工作经历&#xff0c;重点说下你负责的岗位类型和规模2. 你在招聘流程中最常用的渠道有哪些&#xff1f;如何评估渠道效果&#xff1f;3. 当你…

AI Agent入门指南

图片来源网络 ‌一、开箱暴击&#xff1a;你以为的"智障音箱"&#xff0c;其实是赛博世界的007‌ ‌1.1 从人工智障到智能叛逃&#xff1a;Agent进化史堪比《甄嬛传》‌ ‌青铜时代&#xff08;2006-2015&#xff09;‌ “小娜同学&#xff0c;关灯” “抱歉&…

pnpm 中 Next.js 模块无法找到问题解决

问题概述 项目在使用 pnpm 管理依赖时,出现了 “Cannot find module ‘next/link’ or its corresponding type declarations” 的错误。这是因为 pnpm 的软链接机制在某些情况下可能导致模块路径解析问题。 问题诊断 通过命令 pnpm list next 确认项目已安装 Next.js 15.2.…

vulnhub:sunset decoy

靶机下载地址https://www.vulnhub.com/entry/sunset-decoy,505/ 渗透过程 简单信息收集 nmap 192.168.56.0/24 -Pn # 确定靶机ip&#xff1a;192.168.56.121 nmap 192.168.56.121 -A -T4 # 得到开放端口22,80 在80端口得到save.zip&#xff0c;需要密码解压。 john破解压缩…

代码学习总结(一)

代码学习总结&#xff08;一&#xff09; 这个系列的博客是记录下自己学习代码的历程&#xff0c;有来自平台上的&#xff0c;有来自笔试题回忆的&#xff0c;主要基于 C 语言&#xff0c;包括题目内容&#xff0c;代码实现&#xff0c;思路&#xff0c;并会注明题目难度&…

OSPF的接口网络类型【复习篇】

OSPF在不同网络环境下默认的不同工作方式 [a3]display ospf interface g 0/0/0 # 查看ospf接口的网络类型网络类型OSPF接口的网络类型&#xff08;工作方式&#xff09;计时器BMA&#xff08;以太网&#xff09;broadcast &#xff0c;需要DR/BDR的选举hello&#xff1a;10s…

PHM学习软件|PHM预测性维护系统

使用步骤教程如下 1、登录 用户名&#xff1a;52phm 密码&#xff1a;xxx &#xff08;区别在于不同用户密钥不一样&#xff09; 2、上传需要分析的数据集 支持数据集格式&#xff1a;csv、xlsx、xls、mat、json 3、主题1&#xff1a;机械参数计算 计算轴承、齿轮、皮带的…

MySQL MVCC 机制详解

MySQL MVCC 机制详解 1. MVCC 基本概念 MVCC 是一种并发控制的方法&#xff0c;主要用于数据库管理系统&#xff0c;允许多个事务同时读取数据库中的同一个数据项&#xff0c;而不需要加锁&#xff0c;从而提高了数据库的并发性能。 ┌──────────────────…