麻雀优化算法(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.mzph.cn/news/801337.shtml

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

相关文章

【MacOs】proxychains配置使用

一、开始 1. 安装proxychains 使用brew进行安装 brew install proxychains-ng没有homebrew的,可以使用该命令安装 /usr/bin/ruby -e "$(curl -fsSL https://cdn.jsdelivr.net/gh/ineo6/homebrew-install/install)"2. 配置代理配置文件 cd /opt/homeb…

day5 nest商业项目初探·一(java转ts全栈/3R教室)

背景:从头一点点学起太慢了,直接看几个商业项目吧,看看根据Java的经验,自己能看懂多少,然后再系统学的话也会更有针对性。先看3R教室公开的 kuromi 移民机构官方网站吧 【加拿大 | 1.5w】Nextjs:kuromi 移民…

专业140+总410+国防科技大学831信号与系统考研经验国防科大电子信息与通信,真题,大纲,参考书。

应群里同学要求,总结一下我自己的复习经历,希望对大家有所借鉴,报考国防科技大学,专业课831信号与系统140,总分410,大家以前一直认为国防科技大学时军校,从而很少关注这所军中清华,现…

Java 基于微信小程序的助农扶贫小程序

博主介绍:✌Java徐师兄、7年大厂程序员经历。全网粉丝13w、csdn博客专家、掘金/华为云等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇🏻 不…

React - 你知道props和state之间深层次的区别吗

难度级别:初级及以上 提问概率:60% 如果把React组件看做一个函数的话,props更像是外部传入的参数,而state更像是函数内部定义的变量。那么他们还有哪些更深层次的区别呢,我们来看一下。 首先说props,他是组件外部传入的参数,我们知道…

鸿蒙实战开发-相机和媒体库、如何在eTS中调用相机拍照和录像

介绍 此Demo展示如何在eTS中调用相机拍照和录像,以及使用媒体库接口将图片和视频保存的操作。实现效果如下: 效果预览 使用说明 1.启动应用,在权限弹窗中授权后返回应用,进入相机界面。 2.相机界面默认是拍照模式,…

【第二十九篇】BurpSuite杂项综合

文章目录 Intruder模块URL编码Grep检索提取logger日志模块Intruder模块URL编码 假设我们需要对GET请求包中的URL目录进行爆破FUZZ: example.com/xxxx(文件名)Intruder模块会自动对我们的文件名字典进行URL编码 例如payload为1.txt时,burp对其进行URL编码并连接到example.c…

性能优化 - 你知道dns-prefetch有什么用吗

难度级别:中级及以上 提问概率:50% 我们在HTML文档里写一个script标签,为src属性指定Javascript文件网络地址,这是一件再平凡不过的事情。当浏览器加载HTML文档,加载到这个script标签的时候,就会去下载Javascript文件。而在下载之前,就…

携程旅行 abtest

声明: 本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!wx a15018601872 本文章…

使用 Jenkins、Gitlab、Harbor、Helm、k8s 来实现流水线作业

文章目录 一、流程二、Dockerfile 使用 Jenkins、Gitlab、Harbor、Helm、Kubernetes 来实现一个完整的持续集成和持续部署的流水线作业 一、流程 开发人员提交代码到 Gitlab 代码仓库通过 Gitlab 配置的 Jenkins Webhook 触发 Pipeline 自动构建Jenkins 触发构建构建任务&…

尚硅谷html5+css3(3)布局

1.文档流normal flow -网页是一个多层结构 -通过CSS可以分别为每一层设置样式 -用户只能看到最顶层 -最底层&#xff1a;文档流&#xff08;我们所创建的元素默认都是从文档流中进行排列&#xff09; <head><style>.box1 {background-color: blue;}/*它的父元…

C# + OpencvSharp4 错误信息收集

异常1&#xff1a; 初次使用&#xff0c;如下代码报错&#xff0c;OpenCvSharp.OpenCvSharpException:“imread failed.” Mat src Cv2.ImRead("Source.png", ImreadModes.Unchanged); 原因&#xff1a;检查Nuget包与OpencvSharp4库相关安装是否完整&#xff0c;…

系统架构评估_3.ATAM方法

架构权衡分析方法&#xff08;Architecture Tradeoff Analysis Method&#xff0c;ATAM&#xff09;是在SAAM的基础发展起来的&#xff0c;主要针对性能、实用性、安全性和可修改性&#xff0c;在系统开发之前&#xff0c;对这些质量属性进行评价和折中。 &#xff08;1&#x…

Unity2023使用sdkmanager命令行工具安装Android SDK

1&#xff0c;下载cmdline-tools&#xff0c;官网地址&#xff1a;https://developer.android.com/studio或者https://dl.google.com/android/repository/文件名 文件名对应版本名。例如文件名为commandlinetools-win-9862592_latest.zip 引用Android cmdline-tools 版本与其…

【网络】什么是RPC

RPC 是Remote Procedure Call的缩写&#xff0c;译为远程过程调用。是一个计算机通信协议。 1、为什么需要远程调用 在如何给女朋友解释什么是分布式这一篇文章中介绍过&#xff0c;为了提升饭店的服务能力&#xff0c;饭店从一开始只有一个负责所有事情的厨师发展成有厨师、切…

一种新兴的身份安全理念:身份结构免疫

文章目录 前言一、从身份管理到身份结构免疫二、身份结构免疫应用实践三、典型应用场景前言 随着组织的数字身份数量激增,基于身份的网络攻击活动也在不断增长。在身份优先的安全原则下,新一代身份安全方案需要更好的统一性和控制度。而在现有的身份管理模式中,组成业务运营…

OpenCV图像处理——基于OpenCV的ORB算法实现目标追踪

概述 ORB&#xff08;Oriented FAST and Rotated BRIEF&#xff09;算法是高效的关键点检测和描述方法。它结合了FAST&#xff08;Features from Accelerated Segment Test&#xff09;算法的快速关键点检测能力和BRIEF&#xff08;Binary Robust Independent Elementary Feat…

c语言:操作符

操作符 一.算术操作符: + - * % / 1.除了%操作符之外,其他的几个操作符可以作用与整数和浮点数,如:5%2.0//error. 2.对于操作符,如果两个操作数都为整数,执行整数除法而只要有浮点数执行的就是浮点数除法。 3.%操作符的两个操作数必须为整数。 二.移位操作符:<&…

SSL中的CA证书

目录 一、CA概述 二、数据加密 三、身份认证 一、CA概述 SSL如何保证网络通信的安全和数据的完整性呢&#xff1f;就是采用了两种手段&#xff1a;身份认证和数据加密。身份认证就需要用到CA证书。 CA是证书的签发机构&#xff0c;它是公钥基础设施&#xff08;Public Key In…

【触想智能】工业一体机和普通电脑的区别是什么?

工业一体机和普通电脑的区别是什么&#xff0c;工业一体机可以当普通电脑一样使用吗? 要想了解工业一体机和普通电脑的区别是什么?我们首先来看看工业一体机是什么&#xff0c;它跟普通电脑有哪些相似的地方?下面小编就为大家来详细介绍一下。 在工作原理上&#xff0c;工业…