位极算法
㈠ 详细介绍双序列比对、blast 以及多序列比对的区别,以及均适用于哪些场 景
序列比对是将两个或多个序列排列在一起,标明其相似之处。使用间隔表示未比对上,比对上的相同或相似的符号排列在同一列上。序列比对是生物信息学以及基因组学与进化的基础之一,其基本思想是:在生物学中普遍存在的序列决定结构、结构决定功能的规律,通过将核酸序列或者蛋白质序列的一级结构看成由基本字符构成的字符串,通过序列比对我们可以找到相似的序列并由此发现生物序列中的功能、结构和进化信息。
全局比对:全局比对是指将参与比对的两条序列里面的所有字符进行比对。全局比对在全局范围内对两条序列进行比对打分,找出最佳比对,主要被用来寻找关系密切的序列。其可以用来鉴别或证明新序列与已知序列家族的同源性,是进行分子进化分析的重要前提。其代表是Needleman-Wunsch算法。
局部比对:与全局比对不同,局部比对不必对两个完整的序列进行比对,而是在每个序列中使用某些局部区域片段进行比对。其产生的需求在于、人们发现有的蛋白序列虽然在序列整体上表现出较大的差异性,但是在某些局部区域能独立的发挥相同的功能,序列相当保守。这时候依靠全局比对明显不能得到这些局部相似序列的。其次,在真核生物的基因中,内含子片段表现出了极大变异性,外显子区域却较为保守,这时候全局比对表现出了其局限性,无法找出这些局部相似性序列。其代表是Smith-Waterman局部比对算法。
双重序列比对:双序列比对是指对两条序列M和N进行比对,找到其相似性关系,这种寻找生物序列相似性关系的过程被称为双序列比对。其算法可以主要分成基于全局比对的Needleman-Wunsch算法和基于局部比对的Smith-Waterman局部比对算法
多重序列比对:多序列比对是双序列比对推广,即把两个以上字符序列对齐,逐列比较其字符的异同,使得每一列字符尽可能一致,以发现其共同的结构特征的方法称为多序列比对。多序列比对算法可以分成渐进法和同步法。其可以发现不同的序列之间的相似部分,从而推断它们在结构和功能上的相似关系,主要用于分子进化关系,预测蛋白质的二级结构和三级结构、估计蛋白质折叠类型的总数,基因组序列分析等。
基因组比对:是多序列比对的一种特例,指对基因组范围内的序列信息进行比对的过程。通过对不同亲缘关系物种的基因组序列进行比较,能够鉴定出编码序列、非编码调控序列及给定物种独有的序列。而基因组范围之内的序列比对,可以了解不同物在核苷酸组成、同线性关系和基因顺序方面的异同,进而得到基因分析预测与定位、生物系统发生进化关系等方面的信息。
BLAST:BLAST[1](Basic Local Alignment Search Tool)是在在1990年由Altschul等人提出的双序列局部比对算法,是一套在蛋白质数据库或DNA数据库中进行相似性比较的分析工具。BLAST是一种启发式算法,用于在大型数据库中寻找比对序列,是一种在局部比对基础上的近似比对算法,可以在保持较高精度的情况下大大减少程序运行的时间。
算法思想描述:
双重序列比对主要分成以Needleman-Wunsch算法为代表的全局比对和以Smith-Waterman局部比对算法为代表的局部比对,BLAST是局部比对的一种推广。多重比对算法可以主要分成动态规划算法、随机算法、迭代法和渐进比对算法。
(1)双重序列比对:
Needleman-Wunsch算法:该算法是基于动态规划思想的全局比对的基本算法,动态规划的比对算法的比对过程可以用一个以序列S为列,T为行的(m+1)×(n+1)的二维矩阵来表示,用
sigma表示置换矩阵。
在计算完矩阵后,从矩阵的右下角单元到左上单元回溯最佳路径(用箭头表示),根据最佳路径给出两序列的比对结果。其中,斜箭头表示2个残基匹配,水平箭头表示在序列S的相应位置插入一个空位,垂直方向的箭头表示在序列T的相应位置插入一个空位。
Smith-Waterman算法:该算法是一种用来寻找并比较具有局部相似性区域的动态规划算法,这种算法适用于亲缘关系较远、整体上不具有相似性而在一些较小的区域上存在局部相似性的两个序列。该算法的基本思想是:使用迭代方法计算出两个序列的相似分值,存在一个得分矩阵M中,然后根据这个得分矩阵,通过动态规划的方法回溯找到最优的比对序列。与全局比对相比,这种算法的改变是把矩阵单元值为负者一律取为0,这是因为分值为负的比对丧失了比对的生物学意义,因此把得分为负值的子序列丢弃。
BLAST: BLAST算法的基本思想是通过产生数量更少的但质量更好的增强点来提高比对的速度。算法的原理主要分为以下五步:(1)过滤:首先过滤掉低复杂度区域,即含有大量重复的序列;(2)Seeding:将Query序列中每k个字组合成一个表,即将一个序列拆分成多个连续的‘seed words’(通常蛋白质k=3,核酸k=11);(3)比对:列出我们所关心的所有可能的字组,再配合置换矩阵给出高分值的字组并组织成快速搜索树结构或者哈希索引,因此此步骤可以快速搜索出大数据集中的所有匹配序列,找到每个seed words在参考序列中的位置;(4)延伸:当找到seed words的位置后,接下来需要将seed word延伸成长片段,延伸过程中,得分值也在变化,当得分值小于阈值时即停止延伸,最后得到的片段成为高分片段对,HSP(High-scoring segment pair);(5)显着性分析,最后我们使用如下公式计算E值,E值衡量了在随机情况下,数据库存在的比当前匹配分数更好的比对的数目,因此可以用该值作为指标评价HSP比对序列的可信度。
其中,m是数据库长度,n是query的长度,S是HSP分数,其他两个参数是修正系数。
(2)多重序列比对
动态规划算法:其基本思想是将一个二维的动态规划矩阵扩展到三维或者多维,多序列比对的积分是n个序列中两两进行比对所得积分之和。矩阵的维度反映了参与比对的序列数。这种方法对计算资源要求比较高[6]。
随机算法:主要包括遗传算法和模拟退火算法,遗传算法是一类借鉴生物界进化规律演化来的全局意义上的自适应随机搜索方法。当用遗传算法进行生物序列分析时,每一代包含固定数量的个体,这些个体用他们的适应度来评价。变异则模拟了生物进化过程中的偶然残基突变现象。对产生的新一代群体进行重新评价、选择、交叉、变异,如此循环往复,使群体中最优个体的适应度不断提高,直到达到一个阈值,算法结束。模拟退火的基本思想是用一物质系统的退火过程来模拟优化问题的寻优方法,当物质系统达到最小能量状态时,优化问题的目标函数也相应地达到了全局最优解。这两种方法都是对构造好的目标函数进行最优解搜索,但实际比对效果并不好[6,7]。
迭代法:迭代法的代表是Muscle[8], Muscle是一个新的渐进比对和迭代比对的综合算法,主要由两部分构成,第一部分是迭代渐进比对:第一次渐进比对的目的是快速产生一个多序列比对而不强调准确率,以此为基础再对渐进比对进行改良。经过两次渐进比对,形成一个相对准确的多序列比对;第二部分是迭代比对:该过程类似于Prrp算法[9],即通过不断的迭代,逐步优化最终比对结果。其主要特点包括:使用kmer counting进行快速的距离测量,使用一个新的图谱比对打分函数进行渐进比对,使用依赖于数的有限分隔进行细化。
渐进比对算法:该算法以Feng和Doolittle提出的最为经典[10]。渐进比对算法的基本思想是迭代地利用两序列动态规划比对算法,先由两个序列的比对开始,逐渐添加新序列,直到所有序列都加入为止。但是不同的添加顺序会产生不同的比对结果。确定合适的比对顺序是渐进比对算法的一个关键问题。通常,整个序列的比对应该从最相似的两个序列开始,由近至远逐步完成。作为全局多序列比对的渐进比对算法有个基本的前提假设:所有要比对的序列是同源的,即由共同的祖先序列经过一系列的突变积累,并经自然选择遗传下来的,分化越晚的序列之间相似程度就越高。因此,在渐进比对过程中,应该对近期的进化事件比远期的进化事件给予更大的关注。由于同源序列是进化相关的,因此可以按着序列的进化顺序,即沿着系统发育树(指导树)的分支,由近至远将序列或已比对序列按双序列比对算法逐步进行比对,重复这一过程直到所有序列都己添加到这个比对中为止[10]。其三个步骤为:(1)利用双序列比对方法对所有的序列进行两两比对,得到相似性分值;(2)利用相似性矩阵(或距离矩阵)产生辅助导向树;(3)根据导向树进行渐进比对。渐进比对算法是最常用、简单又有效的启发式多序列比对方法,它所需时间较短、所占内存较小,其算法很多,主要有CLUSTAL W, T-Coffee和DiAlign等,其中 CLUSTAL W应用最广泛。
应用:
类型+应用
双重序列对比:判断两个序列的同源性和一致性。(1)全局多序列比对可以鉴别或证明新序列与己有序列家族的同源性;帮助预测新蛋白质序列的二级和二级结构,是进行分子进化分析的重要前提。适合序列相似性较高,序列长度近似时的比对;(2)局部比对考虑序列部分区域的相似性。局部多序列比对可以用来刻画蛋白质家族和超家族。适合于未知两个序列相似程度的,可能存在一些片段极其相似而另一些片段相异的序列比对情况。
多重序列比对:多重比对经常用来研究序列间的进化关系,构建进化树;探究序列间的保守性。主要用于分子进化关系,预测蛋白质的二级结构和三级结构、估计蛋白质折叠类型的总数,基因组序列分析等。
基因组比对:通过对不同亲缘关系物种的基因组序列进行比较,能够鉴定出编码序列、非编码调控序列及给定物种独有的序列。而基因组范围之内的序列比对,可以了解不同物在核苷酸组成、同线性关系和基因顺序方面的异同,进而得到基因分析预测与定位、生物系统发生进化关系等方面的信息。
其中,BLAST作为最重要的比对工具,意义特殊,拿出来单独讨论。BLAST可以分成Basic BLAST和 Specialized BLAST, BLAST包括常规的nucleotide blast, Protein blast和Translating blast;Specialize blast可以对特殊生物或特殊研究领域的序列数据库进行检索。
㈡ Hello,密码学:第三部分,公钥密码(非对称密码)算法
在 《Hello,密码学:第二部分,对称密码算法》 中讲述了对称密码的概念,以及DES和AES两种经典的对称密码算法原理。既然有对称密码的说法,自然也就有非对称密码,也叫做公钥密码算法。 对称密码和非对称密码两种算法的本质区别在于,加密密钥和解密密钥是否相同 :
公钥密码产生的初衷就是为了解决 密钥配送 的问题。
Alice 给远方的 Bob 写了一封情意慢慢的信,并使用强悍的 AES-256 进行了加密,但她很快就意识到,光加密内容不行,必须要想一个安全的方法将加密密钥告诉 Bob,如果将密钥也通过网络发送,很可能被技术高手+偷窥癖的 Eve 窃听到。
既要发送密钥,又不能发送密钥,这就是对称密码算法下的“密钥配送问题” 。
解决密钥配送问题可能有这样几种方法:
这种方法比较高效,但有局限性:
与方法一不同,密钥不再由通信个体来保存,而由密钥分配中心(KDC)负责统一的管理和分配。 双方需要加密通信时,由 KDC 生成一个用于本次通信的通信密钥交由双方,通信双方只要与 KDC 事先共享密钥即可 。这样就大大减少密钥的存储和管理问题。
因此,KDC 涉及两类密钥:
领略下 KDC 的过程:
KDC 通过中心化的手段,确实能够有效的解决方法一的密钥管理和分配问题,安全性也还不错。但也存在两个显着的问题:
使用公钥密睁衡码,加密密钥和解密密钥不同,只要拥有加密密钥,所有人都能进行加密,但只有拥有解密密钥的人才能进行解密。于是就出现了这个过程:
密钥配送的问题天然被解决了。当然,解密密钥丢失而导致信息泄密,这不枯脊属于密钥配送的问题。
下面,再详细看下这个过程。
公钥没早渗密码流程的核心,可以用如下四句话来概述:
既然加密密钥是公开的,因此也叫做 “公钥(Public Key)” 。
既然解密密钥是私有的,因此也叫做 “私钥(Private Key) 。
公钥和私钥是一一对应的,称为 “密钥对” ,他们好比相互纠缠的量子对, 彼此之间通过严密的数学计算关系进行关联 ,不能分别单独生成。
在公钥密码体系下,再看看 Alice 如何同 Bob 进行通信。
在公钥密码体系下,通信过程是由 Bob 开始启动的:
过程看起来非常简单,但为什么即使公钥被窃取也没有关系?这就涉及了上文提到的严密的数学计算关系了。如果上一篇文章对称密钥的 DES 和 AES 算法进行概述,下面一节也会对公钥体系的数学原理进行简要说明。
自从 Diffie 和 Hellman 在1976年提出公钥密码的设计思想后,1978年,Ron Rivest、Adi Shamir 和 Reonard Adleman 共同发表了一种公钥密码算法,就是大名鼎鼎的 RSA,这也是当今公钥密码算法事实上的标准。其实,公钥密码算法还包括ElGamal、Rabin、椭圆曲线等多种算法,这一节主要讲述 RSA 算法的基本数学原理。
一堆符号,解释下,E 代表 Encryption,D 代表 Decryption,N 代表 Number。
从公式种能够看出来,RSA的加解密数学公式非常简单(即非常美妙)。 RSA 最复杂的并非加解密运算,而是如何生成密钥对 ,这和对称密钥算法是不太一样的。 而所谓的严密的数学计算关系,就是指 E 和 D 不是随便选择的 。
密钥对的生成,是 RSA 最核心的问题,RSA 的美妙与奥秘也藏在这里面。
1. 求N
求 N 公式:N = p × q
其中, p 和 q 是两个质数 ,而且应该是很大又不是极大的质数。如果太小的话,密码就容易被破解;如果极大的话,计算时间就会很长。比如 512 比特的长度(155 位的十进制数字)就比较合适。
这样的质数是如何找出来的呢? 需要通过 “伪随机数生成器(PRNG)” 进行生成,然后再判断其是否为质数 。如果不是,就需要重新生成,重新判断。
2. 求L
求 L 公式:L = lcm(p-1, q-1)
lcm 代表 “最小公倍数(least common multiple)” 。注意,L 在加解密时都不需要, 仅出现在生成密钥对的过程中 。
3. 求E
E 要满足两个条件:
1)1 < E < L
2)gcd(E,L) = 1
gcd 代表 “最大公约数(greatest common divisor)” 。gcd(E,L) = 1 就代表 “E 和 L 的最大公约数为1,也就是说, E 和 L 互质 ”。
L 在第二步已经计算出来,而为了找到满足条件的 E, 第二次用到 “伪随机数生成器(PRNG)” ,在 1 和 L 之间生成 E 的候选,判断其是否满足 “gcd(E,L) = 1” 的条件。
经过前三步,已经能够得到密钥对种的 “公钥:{E, N}” 了。
4. 求D
D 要满足两个条件:
1)1 < D < L
2)E × D mod L = 1
只要 D 满足上面的两个条件,使用 {E, N} 进行加密的报文,就能够使用 {D, N} 进行解密。
至此,N、L、E、D 都已经计算出来,再整理一下
模拟实践的过程包括两部分,第一部分是生成密钥对,第二部分是对数据进行加解密。为了方便计算,都使用了较小的数字。
第一部分:生成密钥对
1. 求N
准备两个质数,p = 5,q = 7,N = 5 × 7 = 35
2. 求L
L = lcm(p-1, q-1) = lcm (4, 6) = 12
3. 求E
gcd(E, L) = 1,即 E 和 L 互质,而且 1 < E < L,满足条件的 E 有多个备选:5、7、11,选择最小的 5 即可。于是,公钥 = {E, N} = {5, 35}
4. 求D
E × D mod L = 1,即 5 × D mod 12 = 1,满足条件的 D 也有多个备选:5、17、41,选择 17 作为 D(如果选择 5 恰好公私钥一致了,这样不太直观),于是,私钥 = {D, N} = {17, 35}
至此,我们得到了公私钥对:
第二部分:模拟加解密
明文我们也使用一个比较小的数字 -- 4,利用 RSA 的加密公式:
密文 = 明文 ^ E mod N = 4 ^ 5 mod 35 = 9
明文 = 密文 ^ D mod N = 9 ^ 17 mod 35 = 4
从这个模拟的小例子能够看出,即使我们用了很小的数字,计算的中间结果也是超级大。如果再加上伪随机数生成器生成一个数字,判断其是否为质数等,这个过程想想脑仁儿就疼。还好,现代芯片技术,让计算机有了足够的运算速度。然而,相对于普通的逻辑运算,这类数学运算仍然是相当缓慢的。这也是一些非对称密码卡/套件中,很关键的性能规格就是密钥对的生成速度
公钥密码体系中,用公钥加密,用私钥解密,公钥公开,私钥隐藏。因此:
加密公式为:密文 = 明文 ^ E mod N
破译的过程就是对该公式进行逆运算。由于除了对明文进行幂次运算外, 还加上了“模运算” ,因此在数学上, 该逆运算就不再是简单的对数问题,而是求离散对数问题,目前已经在数学领域达成共识,尚未发现求离散对数的高效算法 。
暴力破解的本质就是逐个尝试。当前主流的 RSA 算法中,使用的 p 和 q 都是 1024 位以上,这样 N 的长度就是 2048 位以上。而 E 和 D 的长度和 N 差不多,因此要找出 D,就需要进行 2048 位以上的暴力破解。即使上文那个简单的例子,算出( 蒙出 ) “9 ^ D mod 35 = 4” 中的 D 也要好久吧。
因为 E 和 N 是已知的,而 D 和 E 在数学上又紧密相关(通过中间数 L),能否通过一种反向的算法来求解 D 呢?
从这个地方能够看出,p 和 q 是极为关键的,这两个数字不泄密,几乎无法通过公式反向计算出 D。也就是说, 对于 RSA 算法,质数 p 和 q 绝不能被黑客获取,否则等价于交出私钥 。
既然不能靠抢,N = p × q,N是已知的,能不能通过 “质因数分解” 来推导 p 和 q 呢?或者说, 一旦找到一种高效的 “质因数分解” 算法,就能够破解 RSA 算法了 。
幸运的是,这和上述的“离散对数求解”一样,当下在数学上还没有找到这种算法,当然,也无法证明“质因数分解”是否真的是一个困难问题 。因此只能靠硬算,只是当前的算力无法在可现实的时间内完成。 这也是很多人都提到过的,“量子时代来临,当前的加密体系就会崩溃”,从算力的角度看,或许如此吧 。
既不能抢,也不能算,能不能猜呢?也就是通过 “推测 p 和 q 进行破解” 。
p 和 q 是通过 PRNG(伪随机数生成器)生成的,于是,又一个关键因素,就是采用的 伪随机数生成器算法要足够随机 。
随机数对于密码学极为重要,后面会专门写一篇笔记 。
前三种攻击方式,都是基于 “硬碰硬” 的思路,而 “中间人攻击” 则换了一种迂回的思路,不去尝试破解密码算法,而是欺骗通信双方,从而获取明文。具体来说,就是: 主动攻击者 Mallory 混入发送者和接收者之间,面对发送者伪装成接收者,面对接收者伪装成发送者。
这个过程可以重复多次。需要注意的是,中间人攻击方式不仅能够针对 RSA,还可以针对任何公钥密码。能够看到,整个过程中,公钥密码并没有被破译,密码体系也在正常运转,但机密性却出现了问题,即 Alice 和 Bob 之间失去了机密性,却在 Alice 和 Mallory 以及 Mallory 和 Bob 之间保持了机密性。即使公钥密码强度再强大 N 倍也无济于事。也就是说,仅仅依靠密码算法本身,无法防御中间人攻击 。
而能够抵御中间人攻击的,就需要用到密码工具箱的另一种武器 -- 认证 。在下面一篇笔记中,就将涉及这个话题。
好了,以上就是公钥密码的基本知识了。
公钥密码体系能够完美的解决对称密码体系中 “密钥配送” 这个关键问题,但是抛开 “中间人攻击” 问题不谈,公钥密码自己也有个严重的问题:
公钥密码处理速度远远低于对称密码。不仅体现在密钥对的生成上,也体现在加解密运算处理上。
因此,在实际应用场景下,往往会将对称密码和公钥密码的优势相结合,构建一个 “混合密码体系” 。简单来说: 首先用相对高效的对称密码对消息进行加密,保证消息的机密性;然后用公钥密码加密对称密码的密钥,保证密钥的机密性。
下面是混合密码体系的加解密流程图。整个体系分为左右两个部分:左半部分加密会话密钥的过程,右半部分是加密原始消息的过程。原始消息一般较长,使用对称密码算法会比较高效;会话密钥一般比较短(十几个到几十个字节),即使公钥密码算法运算效率较低,对会话密钥的加解密处理也不会非常耗时。
着名的密码软件 PGP、SSL/TLS、视频监控公共联网安全建设规范(GB35114) 等应用,都运用了混合密码系统。
好了,以上就是公钥密码算法的全部内容了,拖更了很久,以后还要更加勤奋一些。
为了避免被傻啦吧唧的审核机器人处理,后面就不再附漂亮姑娘的照片(也是为了你们的健康),改成我的摄影作品,希望不要对收视率产生影响,虽然很多小伙儿就是冲着姑娘来的。
就从喀纳斯之旅开始吧。
㈢ 优化算法笔记(十八)灰狼算法
(以下描述,均不是学术用语,仅供大家快乐的阅读)
灰狼算法(Grey Wolf Algorithm)是受灰狼群体捕猎行为启发而提出的算法。算法提出于2013年,仍是一个较新的算法。目前为止(2020)与之相关的论文也比较多,但多为算法的应用,应该仍有研究和改进的余地。
灰狼算法中,每只灰狼的位置代表了解空间中的一个可行解。群体中,占据最好位置的三只灰狼为狼王及其左右护法(卫)。在捕猎过程中这三只狼将带领着狼群蛇皮走位,抓捕猎物,直至找到猎物(最优解)。当然狼王不会一直是狼王,左右护法也是一样,每一轮走位后,会根据位置的优劣重新选出新的狼王和左右护法。狼群中的每一只灰狼会向着(也可能背向)这三只位置最优的灰狼移动一定的距离,来决定这一步自己将如何走位。简单来说, 灰狼个体会向则群体中最优的三个个体移动 。
很明显该算法的主角就是灰狼了。
设定目标灰狼为
,当前灰狼的为 ,则该灰狼向着目标灰狼移动后的位置 可以由一下公式计算得出:
灰狼群体中位置最好的三只灰狼编号为1,2,3,那么当前的灰狼i通过观察灰狼1、灰狼2和灰狼3,根据公式(1)得出的三个位置为Xi1,Xi2,Xi3。那么灰狼i将要移动到的位置可以根据以下供述计算得出:
可以看出该灰狼的目标位置是通过观察三只头狼得到的三个目标位置的所围成的区域的质心。(质心超出边界时,取值为边界值)。
灰狼算法的论文描述很多,但是其公式和流程都非常简单,主要对其参数A和C的作用效果进行了详细描述。
C主要决定了新位置相对于目标灰狼的方位,而A则决定新位置向目标靠近还是远离目标灰狼。当|A|>=1时,为远离目标,表现出更强的全局搜索能力,|A|<1时靠近目标,表现出更强的局部搜索能力。
适应度函数 。
实验一:
看看这图像和结果,效果好极了。每当我这么认为时,总会出现意想不到的转折。
修改一下最优解位置试一试, 。
实验二 : 。
其结果比上面的实验差了不少,但我觉得这才是一个优化算法应有的搜索图像。其结果看上去较差只是因为迭代次数较少,收敛不够迅速,这既是优点也是缺点,收敛慢但是搜索更细致。
仔细分析灰狼算法的流程,它并没有向原点靠近的趋势,那只能理解为算法群体总体上向着群体的中心移动。 猜想 :当初始化群体的中心恰好是正解时,算法的结果将会非常的好。
下面使用 ,并将灰狼的初始位置限定在(50,100)的范围内,看看实验图像是否和实验二的图像一致。
实验三 . ,初始种群取值范围为(50,100)
这图像和结果跟实验一的不是一样的吗?这说明从实验二中得出的猜想是错误的。
从图像和结果上看,都和实验二非常相似,当解在解空间的中心时但不在原点时,算法的结果将差一些。
为什么会这样呢?从算法的流程上看,灰狼算法的各个行为都是关于头狼对称的,当最优解在原点且头狼在附近时,公式(1)将变为如下:
实验五 . ,三只头狼添加贪心算法。
从图像可以看出中心的三个点移动的频率要比其他点的移动频率低。从结果上可以看出其结果相对稳定了不少,不过差距非常的小,几乎可以认为是运气好所导致。如果所有的个体都添加贪心算法呢?显然,算法的全局搜索能力将进一步减弱,并且更容易向群体中心收敛,这并不是一个好的操作。
实验六 . ,
在实验五的基础上为狼群添加一个统一的步长,即每只狼每次向着目标狼移动的距离不能大于其步长,将其最大步长设为1,看看效果。
从图像可以看出,受到步长的约束每只狼的移动距离较小,在结束时还没有收敛,其搜索能力较强但收敛速度过慢且极易陷入局部最优。现在将最大步长设置为10(1/10解空间范围)使其搜索能力和收敛速度相对平衡,在看看效果。
从图像可以看出,算法的收敛速度快了不少,但从结果可知,相较于实验五,算法的提升并不太大。
不过这个图像有一种似曾相识的感觉,与萤火虫算法(FireFly Algorithm)差不多,仔细对比这两个算法可以发现, 灰狼算法相当于萤火虫算法的一个简化 。实验六种对灰狼算法添加步长的修改,让其离萤火虫算法更近了一步。
实验七 . ,
在实验六的基础上让最大步长随着迭代次数增加递减。
从实验七的图像可以看出,种群的收敛速度好像快了那么一点,结果也变好了不少。但是和改进后的萤火虫算法相比仍然有一定的差距。
灰狼算法在全局搜索和局部搜索上的平衡已经比较好了,尝试过对其进行改进,但是修改使搜索能力更强时,对于局部最优的函数求解效果很差,反之结果的精度较低,总体而言修改后的算法与原算法相差无几。
灰狼算法是根据灰狼群体的捕猎行动而提出的优化算法,其算法流程和步骤非常简单,数学模型也非常的优美。灰狼算法由于没有贪心算法,使得其有着较强的全局搜索能力同时参数A也控制了算法的局部搜索范围,算法的全局搜索能力和局部搜索能力比较平衡。
从算法的优化图像可以看出,灰狼算法和萤火虫算法非常的相似。可以认为,灰狼算法是对萤火虫算法的一种改进。萤火虫算法向着由于自己的个体飞行,而灰狼算法则的条件更为苛刻,向着群体前三强前进,萤火虫算法通过步长控制搜索范围,而灰狼算法则直接定义搜索范围参数A,并令A线性递减。
灰狼算法的结构简单,但也不容易改进,数次改进后只是改变了全局搜索能力和局部搜索能力的比例,综合能力并没有太大变化。
由于原点对于灰狼算法有着隐隐的吸引力,当测试函数目标值在原点时,其结果会异常的好。因此,灰狼算法的实际效果没有论文中的那么好,但也不差,算是一个中规中矩的优化算法。
参考文献
Mirjalili S , Mirjalili S M , Lewis A . Grey Wolf Optimizer[J]. Advances in Engineering Software, 2014, 69:46-61. 提取码:wpff
以下指标纯属个人yy,仅供参考
目录
上一篇 优化算法笔记(十七)万有引力算法
下一篇 优化算法笔记(十九)头脑风暴算法
优化算法matlab实现(十八)灰狼算法matlab实现