草庐IT

麻雀搜索算法SSA(Sparrow Search algorithm)

A_lany 2023-04-20 原文

文章目录


前言

麻雀搜索算法是2020提出的一种新的优化算法,出自东华大学xue和shen的论文:A novel swarm intelligence optimization approach: sparrow search algorithm,本文的内容是基于该论文来写的。


数学模型

麻雀搜索算法是受麻雀觅食和反捕食行为启发而提出的。在麻雀集群中,我们将会划分出不同的角色。对于麻雀的行为,我们做出如下假设:
1、能量储备高的麻雀有足够的能力去寻找食物,他们被称为生产者,负责找到可以提供丰富食物来源的区域,他们为乞讨者提供觅食区域或方向。能量储备低的麻雀被称为乞讨者。能量储备的水平取决于对个体适应度值的评估。
2、一旦麻雀发现捕食者,个体就会发出警报,当警报值大于安全阈值时,生产者需要将乞讨者引导至安全区域。
3、每只麻雀只要寻找到更好的食物来源,都可以成为生产者,但生产者和乞讨者在整个种群中的比例保持不变。
4、能量较高的麻雀作为生产者,几个饥饿的乞讨者更有可能飞到其他地方觅食以获得更多的能量。
5、乞讨者会跟随提供最好食物的生产者来寻找食物,同时,一些乞讨者会不断监视生产者并且竞争食物以提高自己的捕食率
6、当意识到危险时,在群体边缘的麻雀将会迅速移动到安全的地方以获得更好的位置,而在群体中间的麻雀将会随机移动以靠近其他麻雀

我们用下面的矩阵来表示麻雀的位置:

其中,n表示麻雀的数量,d表示要优化的变量的维度,那么,所有麻雀的适应度值可用如下向量表示:


FX每一行的值代表个体的适应度值。在SSA中,适应度值较好的生产者在搜索过程中优先获得食物。由于生产者负责寻找食物并指导整个族群的移动,因此,比起乞讨者,生产者能够在更大的范围内寻找食物。
我们用下面的式子来更新生产者的位置信息:

式中,t代表的是当前的迭代次数,j的范围是{1,2,…,d},Xti,j表示第t次迭代时,第i只麻雀的第j个维度的值。itermax是最大的迭代次数,即我们设置要让它迭代多少次才结束的值。α∈(0.1]是一个随机数,R2(R2∈[0,1])和ST(ST∈[0.5,1.0])分别表示警报值和安全阈值。Q是一个满足正态分布的随机数,L是一个1×d的矩阵,并且里面的元素全为1。当R2<ST时,表明周围没有天敌,生产者进入广域搜索模式,当R2>ST时,表明附近存在危险,所有麻雀需要迅速飞到其他安全区域。
我们接着用另外的式子来更新乞讨者的位置信息。

上式中,Xp是生产者占据的最优位置,Xworst表示当前全局的最差位置, A表示一个1×d的矩阵,每个元素随机分配1或者-1。并且A+=AT(AAT)-1,当i>n/2时,表明适应度值较差的第i个乞讨者最有可能挨饿。
在实验中,我们可以假设意识到危险的麻雀占总种群的10%到20%。麻雀的初始位置是随机生成的,根据假设6,数学模型可以用以下式子表示:

其中,Xbest是当前全局最优位置,β是步长控制参数,是随机数的正态分布,均值为0,方差为1,K∈[−1, 1]是随机数,这里fi是当前麻雀的适应度值,fg和fw分别是当前全局最佳和最差适应度值,ε是最小的常数,以避免分母为0。当fi>fg,表明麻雀在群体的边缘,Xbest代表人口中心的位置,并且在其周围就是安全的,fi=fg表明处于种群中间的麻雀意识到了危险,需要靠近其他麻雀,K表示麻雀移动的方向,也是步长控制系数。
以上是关于麻雀搜索算法的具体内容,实现的伪代码如下:

有关麻雀搜索算法SSA(Sparrow Search algorithm)的更多相关文章

  1. ruby-on-rails - Nokogiri:使用 XPath 搜索 <div> - 2

    我使用Nokogiri(Rubygem)css搜索寻找某些在我的html里面。看起来Nokogiri的css搜索不喜欢正则表达式。我想切换到Nokogiri的xpath搜索,因为这似乎支持搜索字符串中的正则表达式。如何在xpath搜索中实现下面提到的(伪)css搜索?require'rubygems'require'nokogiri'value=Nokogiri::HTML.parse(ABBlaCD3"HTML_END#my_blockisgivenmy_bl="1"#my_eqcorrespondstothisregexmy_eq="\/[0-9]+\/"#FIXMEThefoll

  2. 区块链之加解密算法&数字证书 - 2

    目录一.加解密算法数字签名对称加密DES(DataEncryptionStandard)3DES(TripleDES)AES(AdvancedEncryptionStandard)RSA加密法DSA(DigitalSignatureAlgorithm)ECC(EllipticCurvesCryptography)非对称加密签名与加密过程非对称加密的应用对称加密与非对称加密的结合二.数字证书图解一.加解密算法加密简单而言就是通过一种算法将明文信息转换成密文信息,信息的的接收方能够通过密钥对密文信息进行解密获得明文信息的过程。根据加解密的密钥是否相同,算法可以分为对称加密、非对称加密、对称加密和非

  3. ruby - 如何搜索有用的 ruby - 2

    寻找有用的ruby的好网站是什么? 最佳答案 AgileWebDevelopment列出插件(虽然不是ruby​​gems,我不确定为什么),并允许人们对它们进行评级。RubyToolbox按类别列出gem并比较它们的受欢迎程度。Rubygems有一个搜索框。StackOverflow对最有用的rails插件和ruby​​gems有疑问。 关于ruby-如何搜索有用的ruby,我们在StackOverflow上找到一个类似的问题: https://stacko

  4. ruby - 如何搜索、递增和替换 Ruby 字符串中的整数子字符串? - 2

    我有很多这样的文档:foo_1foo_2foo_3bar_1foo_4...我想通过获取foo_[X]的所有实例并将它们中的每一个替换为foo_[X+1]来转换它们。在这个例子中:foo_2foo_3foo_4bar_1foo_5...我可以用gsub和一个block来做到这一点吗?如果不是,最干净的方法是什么?我真的在寻找一个优雅的解决方案,因为我总是可以暴力破解它,但我觉得有一些正则表达式技巧值得学习。 最佳答案 我(完全)不懂Ruby,但类似这样的东西应该可以工作:"foo_1foo_2".gsub(/(foo_)(\d+)/

  5. ruby - Ruby 中的必应搜索 API - 2

    我读了"BingSearchAPI-QuickStart"但我不知道如何在Ruby中发出这个http请求(Weary)如何在Ruby中翻译“Stream_context_create()”?这是什么意思?"BingSearchAPI-QuickStart"我想使用RubySDK,但我发现那些已被弃用前(Rbing)https://github.com/mikedemers/rbing您知道Bing搜索API的最新包装器(仅限Web的结果)吗? 最佳答案 好吧,经过一个小时的挫折,我想出了一个办法来做到这一点。这段代码很糟糕,因为它是

  6. Ruby#index 方法 VS 二进制搜索 - 2

    给定一个元素和一个数组,Ruby#index方法返回元素在数组中的位置。我使用二进制搜索实现了我自己的索引方法,期望我的方法会优于内置方法。令我惊讶的是,内置的在实验中的运行速度大约是我的三倍。有Rubyist知道原因吗? 最佳答案 内置#indexisnotabinarysearch,这只是一个简单的迭代搜索。但是,它是用C而不是Ruby实现的,因此自然可以快几个数量级。 关于Ruby#index方法VS二进制搜索,我们在StackOverflow上找到一个类似的问题:

  7. ruby - 使用 Ransack 搜索枚举字段 - 2

    我有一个表,'jobs'和一个枚举字段'status'。status具有以下枚举集:enumstatus:[:draft,:active,:archived]使用ransack,我如何过滤表,比如说,所有事件记录? 最佳答案 你可以像这样在模型中声明自己的掠夺者:ransacker:status,formatter:proc{|v|statuses[v]}do|parent|parent.table[:status]end然后您可以使用默认的搜索语法_eq来检查相等性,如下所示:Model.ransack(status_eq:'ac

  8. ruby-on-rails - Rails 4 postgres 全文搜索错误(范围) - 2

    我一直在使用postgres关注railscast的全文搜索,但我不断收到以下错误#的未定义局部变量或方法“作用域”我关注了railscast确切地。我安装了所有正确的gem。(pg_search,pg)。这是我的代码文章Controller(我在这里也使用acts_as_taggable)defindex@articles=Article.text_search(params[:query]).page(params[:page]).per_page(3)ifparams[:tag]@articles=Article.tagged_with(params[:tag])else@art

  9. ruby - 如何使用部分字符串搜索数组并返回索引? - 2

    我想使用部分字符串搜索数组,然后获取找到该字符串的索引。例如:a=["Thisisline1","Wehaveline2here","andfinallyline3","potato"]a.index("potato")#thisreturns3a.index("Wehave")#thisreturnsnil使用a.grep将返回完整的字符串,使用a.any?将返回正确的true/false语句,但都不会返回匹配的索引找到了,或者至少我不知道该怎么做。我正在编写一段代码,该代码读取文件、查找特定header,然后返回该header的索引,以便它可以将其用作future搜索的偏移量。如果

  10. 100个python算法超详细讲解:画直线 - 2

    1.问题描述使用Python的turtle(海龟绘图)模块提供的函数绘制直线。2.问题分析一幅复杂的图形通常都可以由点、直线、三角形、矩形、平行四边形、圆、椭圆和圆弧等基本图形组成。其中的三角形、矩形、平行四边形又可以由直线组成,而直线又是由两个点确定的。我们使用Python的turtle模块所提供的函数来绘制直线。在使用之前我们先介绍一下turtle模块的相关知识点。turtle模块提供面向对象和面向过程两种形式的海龟绘图基本组件。面向对象的接口类如下:1)TurtleScreen类:定义图形窗口作为绘图海龟的运动场。它的构造器需要一个tkinter.Canvas或ScrolledCanva

随机推荐