麻雀优化算法(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 == 0population = 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)。

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

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

相关文章

(表征学习论文阅读)A Simple Framework for Contrastive Learning of Visual Representations

Chen T, Kornblith S, Norouzi M, et al. A simple framework for contrastive learning of visual representations[C]//International conference on machine learning. PMLR, 2020: 1597-1607. 1. 前言 本文作者为了了解对比学习是如何学习到有效的表征,对本文所…

3. Django 初探路由

3. 初探路由 一个完整的路由包含: 路由地址, 视图函数(或者视图类), 可选变量和路由命名. 本章讲述Django的路由编写规则与使用方法, 内容分为: 路由定义规则, 命名空间与路由命名, 路由的使用方式.3.1 路由定义规则 路由称为URL (Uniform Resource Locator, 统一资源定位符)…

蓝桥杯简单模板

目录 最大公约数 两个数的最大公约数 多个数的最大公约数 最小公倍数 两个数的最小公倍数 多个数的最小公倍数 素数 ​编辑 位数分离 正写 ​编辑 反写 闰年 最大公约数 两个数的最大公约数 之前看见的是辗转相除法,例如现在让算一个49,21…

该主机与 Cloudera Manager Server 失去联系的时间过长。 该主机未与 Host Monitor 建立联系

该主机与 Cloudera Manager Server 失去联系的时间过长。 该主机未与 Host Monitor 建立联系 这个去集群主机cm界面上看会出现这个错误 排查思路: 一般比较常见的原因可能是出问题的主机和集群主节点的时间对应不上了。还有就是cm agent服务出现问题了 去该主机的…

React - 你使用过高阶组件吗

难度级别:初级及以上 提问概率:55% 高阶组件并不能单纯的说它是一个函数,或是一个组件,在React中,函数也可以做为一种组件。而高阶组件就是将一个组件做为入参,被传入一个函数或者组件中,经过一定的加工处理,最终再返回一个组件的组合…

不使用 Docker 构建 Triton 服务器并在 Google Colab 平台上部署 HuggingFace 模型

Build Triton server without docker and deploy HuggingFace models on Google Colab platform EnvironmentBuilding Triton serverDeploying HuggingFace models客户端推荐阅读参考 Environment 根据Triton 环境对应表 ,Colab 环境缺少 tensorrt-8.6.1&#xff0…

IP地址到底有什么用

IP地址在计算机网络中的作用至关重要,它不仅是设备在网络中的唯一标识,更是实现网络通信、网络管理和安全的关键要素。下面,我们将从多个方面详细阐述IP地址的作用。 首先,IP地址作为设备的唯一标识,为网络通信提供了…

再探Java为面试赋能(二)Java基础知识(二)反射机制、Lambda表达式、多态

文章目录 前言1.4 反射机制1.4.1 Class对象的获取1.4.2 Class类的方法1.4.3 通过反射机制修改只读类的属性 1.5 Lambda表达式1.5.1 函数式接口1.5.2 Lambda表达式的使用 1.6 多态1.6.1 多态的概念1.6.2 多态的实现条件1.6.3 重载(Overload)和重写&#x…

用Python+OpenCV截取视频中所有含有字幕的画面

1、需求背景 有的视频文件的字幕已经压制到了视频的图像中,不能单独提取出字幕文件。网上的 “提取视频字幕” 网站多为提取视频中的字幕文件,而非识别视频图像中的字幕。少数通过OCR技术识别画面中字幕的工具需要在线运行、运行速度较慢,或…

力扣2- 两数相加

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。 请你将两个数相加,并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外,这两个数都不会以 0 …

前端layui自定义图标的简单使用

iconfont-阿里巴巴矢量图标库 2. 3. 4.追加新图标 5.文件复制追加新图标

TCP/IP协议、HTTP协议和FTP协议等网络协议简介

文章目录 一、常见的网络协议二、TCP/IP协议1、TCP/IP协议模型被划分为四个层次2、TCP/IP五层模型3、TCP/IP七层模型 三、FTP网络协议四、Http网络协议1、Http网络协议简介2、Http网络协议的内容3、HTTP请求协议包组成4、HTTP响应协议包组成 一、常见的网络协议 常见的网络协议…

DIY可视化UniApp表格组件

表格组件在移动端的用处非常广泛,特别是在那些需要展示结构化数据、进行比较分析或提供详细信息的场景中。数据展示与整理:表格是展示结构化数据的理想方式,特别是在需要展示多列和多行数据时。通过表格,用户可以轻松浏览和理解数…

vue 中使 date/time/datetime 类型的 input 支持 placeholder 方法

一般在开发时,设置了 date/time/datetime 等类型的 input 属性 placeholder 提示文本时, 发现实际展示中却并不生效,如图: 处理后效果如图: 处理逻辑 判断表单项未设置值时,则设置其伪类样式,文…

2024-04-08 NO.6 Quest3 自定义交互事件

文章目录 1 交互事件——更改 Cube 颜色2 交互事件——创建 Cube2.1 非代码方式2.2 代码方式 ​ 在开始操作前,我们导入上次操作的场景,相关介绍在 《2024-04-08 NO.5 Quest3 手势追踪进行 UI 交互-CSDN博客》 文章中。 1 交互事件——更改 Cube 颜色 …

知识管理系统|基于Springboot和vue的知识管理系统设计与实现(源码+数据库+文档)

知识管理 目录 基于Springboot和vue的知识管理系统设计与实现 一、前言 二、系统设计 三、系统功能设计 1、前台: 5.2.2 文章信息 5.3.1 论坛交流 2、后台 用户管理 5.1.2 文章分类 5.2.1 资料分类 四、数据库设计 五、核心代码 六、论文参考 七、最…

OpenHarmony实战:Combo解决方案之W800芯片移植案例

本方案基于OpenHarmony LiteOS-M内核,使用联盛德W800芯片的润和软件海王星系列Neptune100开发板,进行开发移植。 移植架构采用Board与SoC分离方案,支持通过Kconfig图形化配置编译选项,增加玄铁ck804ef架构移植,实现了…

老子云、AMRT3D、眸瑞科技

老子云概述 老子云3D可视化快速开发平台,集云压缩、云烘焙、云存储云展示于一体,使3D模型资源自动输出至移动端PC端、Web端,能在多设备、全平台进行展示和交互,是全球领先、自主可控的自动化3D云引擎。 平台架构 平台特性 1、基…

Java | Leetcode Java题解之第18题四数之和

题目&#xff1a; 题解&#xff1a; class Solution {public List<List<Integer>> fourSum(int[] nums, int target) {List<List<Integer>> quadruplets new ArrayList<List<Integer>>();if (nums null || nums.length < 4) {return…

spring cloud gateway openfeign 联合使用产生死锁问题

spring cloud gateway openfeign 联合使用产生死锁问题&#xff0c;应用启动的时候阻塞卡住。 spring.cloud 版本如下 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><vers…