麻雀优化算法(Sparrow Search Algorithm)

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

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

算法背景

麻雀算法(Sparrow Search Algorithm, SSA)是一种受自然界麻雀群体行为启发的优化算法。想象一下,一群麻雀在寻找食物的过程中,它们需要在广阔的区域内快速而有效地搜索到食物资源。这种行为恰恰体现了算法的核心思想:在一个广阔的搜索空间内,通过群体的合作与竞争,高效地找到最优解。

在现实生活中,就像麻雀在广阔的土地上寻找食物一样,我们常常面临着在大量选择中寻找最佳方案的问题。比如,在投资市场中,投资者需要在众多的股票或资产中找到收益最大化的投资组合。这就像麻雀在寻找食物时,需要判断哪里的食物最丰富,同时还要避开天敌。

算法应用

麻雀算法因其灵活性和有效性,在多种复杂的优化问题中都有应用,例如:

  • 工程优化:在工程设计中优化特定参数,比如减少材料成本或提高结构稳定性。
  • 金融市场分析:优化投资组合,以最大化收益或最小化风险。
  • 机器学习参数调优:自动选择最佳的机器学习模型参数。

麻雀算法的主要优势在于其优秀的全局搜索能力和较快的收敛速度,使其在处理复杂的多峰值优化问题时表现出色。

算法计算流程

麻雀优化算法 (Sparrow Search Algorithm, SSA) 是一种模仿麻雀受食和防御行为的优化算法。它主要应用于求解全局优化问题。我将使用函数f(x,y)=x^2+y^2来具体演示这个算法的应用过程。

1. 定义

麻雀优化算法灵感来自于麻雀的社会行为,如领导和跟随、受食和逃避等。算法模拟麻雀群体在搜索食物时的行为模式,以此来指导寻优过程。

2. 公式

SSA算法中,每只麻雀的位置代表解空间中的一个解,其位置的更新取决于麻雀的角色 (领导者或追随者) 和环境因素。

主要公式包括:
– 领导者位置更新
– 追随者位置更新
– 躲避天敌的位置更新

具体来说,在SSA中,麻雀的位置表示解空间中的一个点。主要的位置更新规则如下:
– 领导者位置更新:

                                x_\mathrm{new}=x_\mathrm{best}-r_1\times|x_\mathrm{best}-x_\mathrm{current}|

其中 x_{\mathrm{best}}是当前最好的位置,x_{\mathrm{current}} 是麻雀当前的位置, r_1 是[0,1]范围内的随机数。

这里的“-”表示领导者在其当前位置与最佳位置之间进行微调。这种调整是为了更精细地探索周围的区域,以保持在最佳位置附近。领导者已经在一个相对较好的位置( x_{\mathrm{best}}),所以它通过减少与当前位置的差距来细微地调整自己的位置,这是一种精细搜索策略。


– 追随者位置更新:

                                       x_\text{new }=x_i+r_2\times(x_\text{leader }-x_i)

其中 \mathrm{~}x_{\mathrm{leader}} 是群体中领导者的位置, x_i 是当前麻雀的位置, r_2是[0,1]范围内的随机数。

在这个公式中,“+”表示追随者正在向领导者或更好的位置移动。追随者试图通过增加自己的位置与领导者位置之间的差异来改善自己的位置。这反映了一种向更优位置探索的策略,即向领导者的位置靠拢。

躲避天敌的位置更新:

                                x_\mathrm{new}=x_\mathrm{current}+r_3\times(x_\mathrm{current}-x_\mathrm{worst})

其中:
– x_{new} 是更新后的位置。
x_{\mathrm{current}} 是麻雀当前的位置。
– x_{worst}是群体中最差的位置,代表天敌可能出现的位置。
– r_3 是[0,1]范围内的随机数。

在这里,“+”表示麻雀正在从最差位置(可能是天敌所在的位置)移开。这是一种避险策略,麻雀通过增加与危险区域的距离来提高自己的安全性。

3. 示例: f(x,y)=x^2+y^2


a. 初始化

例如,我们初始化10只麻雀,随机生成它们在解空间的位置。假设一只麻雀的初始位置是 (x_1,y_1)=(2,3) 。
b. 评估

计算每只麻雀的适应度,即 f\left(x_i,y_i\right)=x_i^2+y_i^2。对于 (2,3) 这只麻雀,适应度为 2^2+3^2=13.
c. 领导者和追随者的更新
– 领导者更新:找到适应度最好的麻雀,假设为 (1,2) ,适应度为 5 。
– 追随者更新:其他麻雀根据领导者位置更新。例如,如果r_1=0.5,(2,3) 这只麻雀的新位置为:                        \begin{aligned}x_\mathrm{new}&=1-0.5\times|1-2|=1-0.5\times1=0.5\\y_\mathrm{new}&=2-0.5\times|2-3|=2-0.5\times1=1.5\end{aligned}

– 躲避天敌:

假设在一次迭代中,麻雀感知到天敌的威胁,需要更新其位置。我们使用之前的麻雀位置 (2,3) 和假设的最差位置 (5,5) 来说明这一过程。假设r_3=0.6,则麻雀的新位置由下式计算:

                     \begin{aligned}x_\mathrm{new}&=2+0.6\times(2-5)=2+0.6\times(-3)=2-1.8=0.2\\y_\mathrm{new}&=3+0.6\times(3-5)=3+0.6\times(-2)=3-1.2=1.8\end{aligned}

因此,麻雀的新位置更新为 (0.2,1.8) 。

d. 迭代过程

重复上述过程,每次迭代更新所有麻雀的位置,直到达到预定的迭代次数或满足停止条件。

算法注意事项

  • 逃避策略的平衡:逃避天敌策略需要与寻找食物(优化目标)之间保持平衡,以避免过于频繁的逃避导致搜索效率降低。
  • 参数调整:躲避天敌的行为可能需要根据问题的特性调整。具体来说:

在麻雀优化算法(Sparrow Search Algorithm, SSA)中,定义麻雀什么时候需要躲避天敌通常依赖于算法中设置的一些规则和条件。这些规则模拟麻雀在自然环境中对天敌出现的反应。以下是一种常见的方法来定义这个行为:

天敌出现的条件

  1. 迭代次数阈值:在算法的迭代过程中,可以设置一个阈值,当迭代次数达到这个阈值时,认为天敌出现。这个阈值可以是固定的,也可以是随机的。
  2. 解的质量:如果一定数量的连续迭代没有改善解的质量(比如适应度没有显著提升),可以认为是天敌的影响,促使麻雀改变搜索策略。
  3. 随机事件:在每次迭代中,可以以一定的概率随机决定天敌是否出现。这种方法更加模拟自然环境中天敌出现的不确定性。

天敌出现时的行为

一旦满足上述任一条件,认为天敌出现,麻雀将采取躲避策略。躲避策略通常涉及到更新麻雀位置的公式,使其远离当前的位置,这反映了在自然环境中麻雀为了躲避天敌而改变方向或位置的行为。

示例

假设我们使用阈值方法,并设定每20次迭代天敌出现一次。那么在第20次、第40次、第60次迭代时,麻雀会进行躲避天敌的位置更新。具体来说,算法需要平衡躲避天敌的行为和寻找最优解的行为。过度的躲避可能会导致算法效率降低。请根据具体问题和算法的表现,调整天敌出现的条件和频率,以及躲避策略的强度。通过这种方式,SSA算法不仅在追求最优解的过程中增加了多样性,而且还提高了算法的鲁棒性,使其更加贴近自然界麻雀的行为。

代码示例

我们可以编写一个Python程序。以下是一个简化的例子,包括了麻雀的初始化、适应度评估、位置更新(包括躲避天敌的情况)以及可视化算法训练过程的代码。

import numpy as np
import matplotlib.pyplot as plt

# 定义目标函数
def objective_function(x, y):
    return x**2 + y**2

# 初始化麻雀群体
def initialize_sparrows(population_size, bounds):
    population = np.random.uniform(bounds[0], bounds[1], (population_size, 2))
    return population

# 计算适应度
def calculate_fitness(population):
    return np.array([objective_function(ind[0], ind[1]) for ind in population])

# 更新麻雀位置
def update_position(population, best_idx, worst_idx, bounds, avoid_predator=False):
    r1, r2, r3 = np.random.random(), np.random.random(), np.random.random()
    new_population = np.copy(population)
    for i in range(len(population)):
        if avoid_predator:
            # 躲避天敌
            new_population[i] += r3 * (population[i] - population[worst_idx])
        elif i == best_idx:
            # 领导者
            new_population[i] -= r1 * abs(new_population[i] - population[best_idx])
        else:
            # 追随者
            new_population[i] += r2 * (population[best_idx] - population[i])
        
        # 确保位置在界限内
        new_population[i] = np.clip(new_population[i], bounds[0], bounds[1])
    return new_population

# SSA算法主函数
def sparrow_search_algorithm(objective_function, bounds, population_size=20, iterations=100):
    population = initialize_sparrows(population_size, bounds)
    fitness_history = []
    position_history = []  # 用于存储每次迭代的位置

    for iteration in range(iterations):
        fitness = calculate_fitness(population)
        best_idx = np.argmin(fitness)
        worst_idx = np.argmax(fitness)
        fitness_history.append(fitness[best_idx])
        position_history.append(np.copy(population))  # 存储当前位置

        # 每20次迭代,麻雀躲避天敌
        avoid_predator = iteration % 20 == 0
        population = update_position(population, best_idx, worst_idx, bounds, avoid_predator)

    return position_history, fitness_history

# 参数
bounds = [-10, 10]
population_size = 20
iterations = 20

# 运行算法
position_history, fitness_history = sparrow_search_algorithm(objective_function, bounds, population_size, iterations)

# 函数表面图
x = np.linspace(bounds[0], bounds[1], 50)
y = np.linspace(bounds[0], bounds[1], 50)
x, y = np.meshgrid(x, y)
z = objective_function(x, y)

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(x, y, z, alpha=0.5, cmap='viridis')

# 麻雀位置和训练路径
for i in range(1, iterations):
    # 使用浮点数确保正确的颜色映射
    color = plt.cm.jet(float(i) / iterations)
    for j in range(population_size):
        # 绘制线段
        ax.plot([position_history[i-1][j][0], position_history[i][j][0]],
                [position_history[i-1][j][1], position_history[i][j][1]],
                [fitness_history[i-1], fitness_history[i]],
                color=color)
        # 绘制点
        ax.scatter(position_history[i][j][0], position_history[i][j][1], fitness_history[i], color=color, marker='o')

ax.set_xlabel('X Position')
ax.set_ylabel('Y Position')
ax.set_zlabel('Fitness')
plt.title('3D Visualization of Sparrow Search Algorithm with Objective Function')
plt.show()

麻雀优化算法针对上述例子的训练可视化结果如下:

图片[1]-麻雀优化算法(Sparrow Search Algorithm)-VenusAI

如图所示,随着训练轮数的迭代,麻雀们慢慢的聚集在了最优解的位置附近(0,0)。

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

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

相关文章

Linux学习-网络UDP

网络 数据传输,数据共享 网络协议模型 OSI协议模型 应用层 实际发送的数据 表示层 发送的数据是否加密 会话层 是否建立会话连接 传输层 数据传输的方式(数据报、流式&#…

esp32上PWM呼吸灯

1、什么是pwm PWM(Pulse Width Modulation)简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在测量、通信、工控等方面。 1.1频率 单位时间内PWM方波重复的次数 1.2占空比 一个周期内…

HarmonyOS 应用开发-根据icon自适应背景颜色

介绍 本示例将介绍如何根据图片设置自适应的背景色。 效果图预览 使用说明 转换图片为PixelMap,取出所有像素值遍历所有像素值,查找到出现次数最多的像素,即为图片的主要颜色适当修改图片的主要颜色,作为自适应的背景色 实现思…

云岚到家项目

一.项目介绍 云岚到家项目是一个家政服务o2o平台,互联网家政是继打车、外卖后的又一个风口,创业者众多,比如:58到家,天鹅到家等,o2o(Online To Offline)是将线下商务的机会与互联网…

负荷预测 | Matlab基于TCN-BiGRU-Attention单输入单输出时间序列多步预测

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab基于TCN-BiGRU-Attention单输入单输出时间序列多步预测; 2.单变量时间序列数据集,采用前12个时刻预测未来96个时刻的数据; 3.excel数据方便替换,运行环境matlab…

高端大气自适应全屏酷炫渐变卡片html源码图片切换特效html5源码导航引导网站源码

源码特点: 1:手工书写DIVCSS、代码精简无冗余。 2:自适应结构,全球先进技术,高端视觉体验。 3:SEO框架布局,栏目及文章页均可独立设置标题/关键词/描述。 4:附带测试数据、安装教程、…

说说对WebSocket的理解?应用场景?

一、是什么 WebSocket,是一种网络传输协议,位于OSI模型的应用层。可在单个TCP连接上进行全双工通信,能更好的节省服务器资源和带宽并达到实时通迅 客户端和服务器只需要完成一次握手,两者之间就可以创建持久性的连接&#xff0c…

flutter组件_AlertDialog

官方说明:A Material Design alert dialog. 翻译:一个材料设计警告对话框。 作者释义:显示弹窗,类似于element ui中的Dialog组件。 AlertDialog的定义 const AlertDialog({super.key,this.icon,this.iconPadding,this.iconColor,t…

c++的学习之路:18、容器适配器与反向迭代器

摘要 本文有可能讲的不是特别清楚,我也是初学者有的理解可能有偏差欢迎指出,文章末附上导图。 目录 摘要 一、什么是适配器 二、STL标准库中stack和queue的底层结构 三、deque 1、deque的原理介绍 2、deque的缺陷 四、反向迭代器 五、思维导图…

政安晨:【Keras机器学习实践要点】(二十一)—— MobileViT:基于变换器的移动友好图像分类模型

目录 简介 导入 超参数 MobileViT 实用程序 政安晨的个人主页:政安晨 欢迎 👍点赞✍评论⭐收藏 收录专栏: TensorFlow与Keras机器学习实战 希望政安晨的博客能够对您有所裨益,如有不足之处,欢迎在评论区提出指正! …

kafka(四)——生产者流程分析(c++)

前言 kafka生产者负责将数据发布到kafka集群的主题;kafka生产者消息发送方式有两种: 同步发送异步回调发送 流程 流程说明: Kafka Producer整体可看作是一个异步处理操作;消息发送过程中涉及两个线程:main线程和se…

JetBrains IDE(IDEA/WebStorm)配置GitHub Copilot

关于 GitHub Copilot 和 JetBrains IDE GitHub Copilot 在编写代码时提供 AI 对程序员的自动完成样式的建议。 有关详细信息,请参阅“关于 GitHub Copilot Individual”。 如果使用 JetBrains IDE,可以直接在编辑器中查看并合并来自 GitHub Copilot 的…

DXP学习002-PCB编辑器的环境参数及电路板参数相关设置

目录 一,dxp的pcb编辑器环境 1,创建新的PCB设计文档 2,PCB编辑器界面 1)布线工具栏 2)公用工具栏 3)层标签栏 ​编辑 3,PCB设计面板 1)打开pcb设计面板 4,PCB观…

线程的666种状态

文章目录 在Java中,线程有以下六种状态: NEW:新建状态,表示线程对象已经被创建但还未启动。RUNNABLE:可运行状态,表示线程处于就绪状态,等待系统分配CPU资源执行。BLOCKED:阻塞状态…

抖音在线点赞任务发布接单运营平台PHP网站源码 多个支付通道+分级会员制度

源码介绍 1、三级代理裂变,静态返佣/动态返佣均可设置。(烧伤制度)。 2、邀请二维码接入防红跳转。 3、自动机器人做任务,任务时间可设置,机器人价格时间可设置。 4、后台可设置注册即送X天机器人。 5、不同级别会…

LLM大语言模型助力DataEase小助手,新增气泡地图,DataEase开源数据可视化分析平台v2.5.0发布

2024年4月8日,DataEase开源数据可视化分析平台正式发布v2.5.0版本。 这一版本的功能升级包括:新增DataEase小助手支持,通过结合智能算法和LLM(即Large Language Model,大语言模型)能力,DataEas…

Servlet(一)

文章目录 1.Servlet整体框架2.Servlet快速入门1.创建项目配置基本环境2.添加jar包1.在WEB-INF下创建目录lib,添加文件2.添加到项目中3.配置代码提示 3.src下创建文件4.实现Servlet接口5.在web.xml配置HelloServlet6.通过浏览器访问HelloServlet 3.浏览器访问Servlet…

axios是什么?axios使用axios和ajax

Axios 是一个基于 Promise 的 HTTP 客户端,用于浏览器和 Node.js 环境。它是由 GitHub 用户 mzabriskie 开发的,并且得到了广泛的社区支持。Axios 的设计目标是提供一种简洁、易用且功能强大的 HTTP 请求方式,以替代传统的 Ajax(A…

ssm031社区管理与服务的设计与实现+jsp

社区管理与服务系统的设计与实现 摘 要 Abstract 第一章 绪论 1.1研究背景 1.2 研究现状 1.3 研究内容 第二章 系统关键技术 2.1 Java简介 2.2 MySql数据库 2.3 B/S结构 2.4 Tomcat服务器 第三章 系统分析 3.1可行性分析 3.1.1技术可行性 3.1.2经济可行性 3.1.…

usbserial驱动流程解析_Part3_write_read数据流分析

usb转串口设备需要进行收发,主机接到uart rx线上的数据,把主机数据发送到 uart tx线上,对应的就是read函数和write函数,以上两个Part提到了tty有关的函数,在以下结构体被定义,write被指定为serial_write&a…