蛙跳算法matlab
1. 优化算法笔记(十六)混合蛙跳算法
(以下描述,均不是学术用语,仅供大家快乐的阅读)
混合蛙跳算法(Shuffled Frog Leaping Algorithm)是根据青蛙在石块上觅食时的种群分布变化而提出的算法。算法提出于2003年,时间有点久远,但相关的论文并不是特别多,仍有较大的研究和改进空间。
混合蛙跳算法中,每个青蛙的位置代表了一个可行解。青蛙所在的池塘中有数块石块,每一代,青蛙们会被分配到石块上。在这一代中,只有石块上位置最差的青蛙会跳动。该青蛙首先会向着同一个石块上的最优位置的青蛙跳动,如果新的位置比原位置差则向则全局最优位置跳动,若该位置仍旧比原位置差则在解空间内随机跳动一次。可以看出每只跳动青蛙在每代中至少跳动一次,至多跳动三次,但由于每次跳动的青蛙数量等于石块数,故当石块数<青蛙数/3时,每代总跳动次数小于青蛙总数。
(查找文献追根溯源的时候看到了一个有趣的现象,原始的提出论文提出于2000年(Shuffled frog leaping algorithm:a memetic meta-heuristic for combinatorial optimization.)但是到2006年才出版,而2003年的论文(Optimization of Water Distribution Network Design Using the Shuffled Frog Leaping Algorithm)引用了2000年的原始论文,并标注为出版中。到了2006年出版时,原始论文引用了2003年发表的那篇论文,即这两篇论文相互引用,真是奇妙。估计是原始论文被拒了后又修改了结果到2006年才发表。)
这次的主角就是青蛙了。(没有石块就用荷叶代替吧)。
每一只青蛙只有两个属性:位置,当前位置的适应度值。
池塘中一共有m片荷叶,青蛙总数为n。
每一代中,将所有的青蛙按位置从优到劣排列,并依此放置在m个荷叶上。举个栗子,有5片荷叶(m1-m5)和21只青蛙(f1-f21,按适应度值从优到劣排列)。
即m1荷叶上的青蛙有{f1,f6,f11,f16,f21},m2荷叶上的青蛙有{f2,f7,f12,f17},依此类推。
每代中最差的青蛙会首先向着当前荷叶上最优位置的青蛙跳动,即该代中f21会向着f1跳动,f17向着f2跳动,f18向着f3跳动,f19向着f4跳动,f20向着f5跳动。
如果f21、f17、f18、f19、f20这五只青蛙没有找到优于自己当前位置的位置,则它们会向着全局最优位置的青蛙f1跳动,如果新的位置仍然差于自己的原位置,则该青蛙跳到一个随机的位置。
在D维空间内青蛙f1的位置 ,其适应度值为 。
(1)青蛙f17向f2跳动后的新位置为 :
若 优于 则青蛙f17跳到 ,否则跳到(2)。
(2)由于f1在全局最优位置,故在这一步,f17会向f1跳动:
优于 则青蛙f17跳到 ,否则跳到(3)。
(3)f17会跳到解空间内的随机位置:
若 优于 则青蛙f17跳到 。
可以看出混合蛙跳算法的流程灰常的简单,跳动的算子也非常的简单,而且每次跳动的青蛙的数量等于荷叶的数量,所有其迭代次数会快于多数其他的优化算法。
我自己特别喜欢这个优化算法,总能从中体会出分治的思想。下面我们来看看实验,看看其效果如何。
适应度函数 。
实验一:
荷叶数为1的图像及结果如下:
荷叶数为2的图像及结果如下:
荷叶数为3的图像及结果如下:
荷叶数为4的图像及结果如下:
从上述的四个实验可以看出,随着荷叶数的增加,算法的收敛速度在不断的加快。同时,随着荷叶数的增加,每代青蛙跳动的次数也在不断的增加。荷叶数为1时,每代青蛙总共会跳动1-3次,荷叶数为2时每代青蛙总共跳动2-6次,当荷叶数为10时,每代青蛙会跳动10-30次。由于每片荷叶上至少得有2只青蛙,所以荷叶数最多为总群数的一半。
算法的效果比较稳定,但好像没有体现出其跳出局部最优能力,在种群收敛后其全搜索能力较弱,大多在进行局部搜索。
看了看算法的结构,其跳出局部最优操作为第三段跳动,而这次跳动仍旧按照贪心算法跳到优于当前位置的随机位置。现在我将其增强为:如果进行了第三段跳动(随机跳动),则无论该位置的好坏,青蛙都将跳到该随机位置。
实验二: 永远接受公式(3)得到的随机位置
可以看出在种群收敛后,仍然会有一些个体随机出现在解空间内,并继续收敛。比较结果可以看出实验二的结果中的最优值不如实验一,但是其均值和最差值均优于实验一,说明对原算法进行修改后算法更加稳定,且算法的性能和全局搜索能力有一定的提升,算法跳出局部最优能力更强。
混合蛙跳算法是提出近20年,其实现的方式与分治的思想有异曲同工之处。由于每次都更新的是每片荷叶上的最差位置的青蛙,故群体不容易集中于较小的范围。同时由于“三段跳”的操作,让混合蛙跳算法有了一定的跳出局部最优能力。其全局搜索能力和局部搜索能力应该差不多,当最差的部分青蛙跳走后,次差的部分青蛙则会变成了最差的青蛙,此时群体不会过分集中。当群体相对分散时,为搜索范围较大的全局搜索,反之为搜索范围较小的局部搜索,由于收敛速度不算很快,所以进行全局搜索和局部搜索的时间相对均衡。
混合蛙跳算法的流程非常简单,几乎可以说是流程最简单的优化算法。其中的算子也很简单,优化的能力由种群的结构提供。算法的文章中比较了 “模因” 与 “基因” ,模因类似与思想,其传播可以在同代中快速传播,比如音乐,几分钟就可以传播给其他人,而基因则只能有父母辈传递给子女背,传递的时间比较久。这也决定了混合优化算法的最重要的部分在于其群体的结构而不是其中的优化算子,实验说明这样的效果也不错,简单明了的算法也能有不错的效果。
参考文献
Eusuff M , Lansey K , Pasha F . Shuffled frog-leaping algorithm: a memetic meta-heuristic for discrete optimization[J]. Engineering Optimization, 2006, 38(2):129-154. 提取码:ttgx
Eusuff, M.M. and Lansey, K.E., Optimization of water distribution network design using the shuffled frog leaping algorithm (SFLA). J.Water Resources Planning Mgmt,Am. Soc. Civ. Engrs, 2003, 129(3), 210–225. 提取码:cyu8
以下指标纯属个人yy,仅供参考
目录
上一篇 优化算法笔记(十五)蝙蝠算法
下一篇 优化算法笔记(十七)万有引力算法
优化算法matlab实现(十六)混合蛙跳算法matlab实现
2. 优化算法笔记(十七)万有引力算法
(以下描述,均不是学术用语,仅供大家快乐的阅读)
万有引力算法(Gravitational Search Algorithm)是受物体之间的万有引力启发而提出的算法。算法提出于2008(2009)年,时间不长,不过相关的文章和应用已经相对较多,也有不少的优化改进方案。
万有引力算法中,每一个物体的位置代表了一个可行解,而物体的质量则反映了该位置的好坏,位置越好的物体的质量越大,反之物体的质量越小(质量由适应度值计算出,不是直接相等)。物体在解空间中的运动方式由其他物体的引力决定,质量越大的物体,在同等引力作用下的加速度较小,所以单位时间内的速度也相对较小,位移距离较短,反之加速度和速度都较大,位移距离较长。故可以简单的认为, 位置越优的个体的移动速度越慢,位置越差的个体的移动速度越快 。
万物之间皆有万有引力,不过在我们谈到万有引力之时,对象大多是天体,否则万有引力太小可以忽略不计。所有这次我们的主角就是天体了。(总不可能是苹果吧)。
每一个天体都有个属性:位置X,质量M,加速度A,以及速度V,还有适应度值F。
在D维空间内有N个天体,其位置为
,加速度
,速度
,其适应度值为
。
第i个天体的质量则是根据其适应度值计算得出:
其中M为天体的质量在群体重质量中的占比, 分别表示全局最差天体的适应度值和全局最优个体的适应度值。
可以看出,处于最优位置的天体的质量m为1,最差位置的天体的质量m为0。当最优天体和最差天体重合时,所有的天体的质量m都为1。
由万有引力计算公式和加速度公式可以计算出当前天体收到另一个天体万有引力而产生的加速度:
其中R表示第i个天体和第j个天体之间的欧式距离,aij为天体i在第d维上受到天体j的万有引力而产生的加速度,ai为第i个天体受到的其他所有天体万有引力的合力产生的加速度。G为万有引力常量,可以根据一下公式计算:
其中G0为初始值,T为最大迭代次数。
计算出了天体的加速度,则可以根据当前速度计算出下一步天体的运行速度以及天体下一步的位置。
这一步比较简单与粒子群、蝙蝠等有速度的算法一致。
可以看出万有引力算法的流程异常的简单,与经典的粒子群差不多。万有引力算法也可以看做是一个优化改进版的粒子群,不过设计比较巧妙,引入的质量、加速度等概念,但实现仍然很简单。万有引力算法的效果如何,在下一节将会进行实验测试。
适应度函数 。
实验一:
从图像中可以看出,各个天体都在不停的运动,由于没有贪心算法(优于当前值才改变位置)的加入,所以个天体有可能运动到比原先位置更差的地方,而且其收敛速度也比较快。
从结果上看,似乎还不错,受到最差值的影响均值也相对较大,算法结果的稳定性不是太好。
直觉上感觉算法有点问题。根据物理得来的直觉告诉我,这些天体会相互靠近,所以,它们不会集中到它们所构成的凸包之外, 凸实心物体的质心不会跑到该物体的外部 。做个试验验证一下,将测试函数的最优解设置到一个极端的位置。
实验二 : 适应度函数
这次最优解位置在(90,90)处,该点有很大概率出现在初始天体所围成的凸多边形外。
从图像中可以看出,在天体们还没有到达最优位置附近(右下角的红点)时,它们已经收敛于一个点,之后则很难再次向最优解靠经。看结果可以发现几乎每一次实验的结果都不太好,算法果然有点问题,不过问题不大。
万有引力出现这种现象可能有两个原因: 1.算法收敛的太快 ,还未对全局进行充分搜索之时就收敛到了一点,收敛到一点后无法再运到。 2.算法没有跳出局部最优的策略 ,万有引力作用下的天体慢慢聚集到奇点,形成黑洞,无法从中逃离。
那接下来,对万有引力算法的改进方向也比较明确了:1.减缓其收敛速度,2增加跳出局部最优操作,使之逃离黑洞。
看看万有引力常量G的函数图像
将万有引力常量的值修改为随着迭代次数线性下降,从图像中可以看出,效果还是比较明显的,天体在不断的运动,最后才收敛、聚集于一起。从实验结果也可以看出,算法相对稳定。结合图像可以知道,改进后,算法的收敛性下降,但全局搜索能力有较大的提升,算法的结果不会很差但是精度较低。
将万有引力常量的下降趋势放缓为原来的1/4,从图像中可以看出,算法的收敛速度非常快,也得到了较好的结果,相比线性下降,算法有着更好的精度,不足之处则是没有跳出局部最优的操作,收敛过快也容易陷入局部最优。
不知道原文为什么让万有引力常量G的如此快的降到0,明明降的更慢能有更好的全局搜索能力,但精度可能较差。猜测如果精度较差则在测试函数结果和曲线上比不赢对比的其他算法,论文没法发了。其使用的测试函数的最优解大多处于解空间的中心位置附近,即很少出现最优解在天体所围成的凸多面体之外的情况,而实际问题中我们是无法预知最优解在个位置的。
接下来,将试着为万有引力算法加入一点跳出局部最优的操作。
实验四 :改进,新增以下规则及操作
在实验二的条件下
1 . 处于最优位置的天体保持自己的位置不动.
2 . 如果某一个天体的运动后的位置优于当前全局最优个体的位置则将当前的最优个体初始化到解空间的随机位置.(将被自己干掉的大哥流放)。
3 . 如果触发了规则2,将所有的个体的以迭代次数重置为0,即计算G=G0*e^(-20t/T)中的t置为0,重新计算万有引力常量,若未触发条件2则t=t+1。
从图像上看,算法的全局搜索能力有大幅的增强,并且已经集中到了最优解的附近,而且由于加入了“流放”这一跳出局部最优的操作,可以看出,不断的有新的个体出现在距最优位置较远的位置。不过收敛速度有所下降,因此局部搜索能力有一定减弱。
看结果,好像没有实验三那么好,但与实验二相比,已经有了很大的提升,而且有了跳出局部最优的操作,结果也相对稳定。
上述的实验仅仅是对直观猜想的实现,如果想以此为改进点,还要对其进行大量的调优,相信会有不错的结果。
万有引力算法根据万有引力提出,结合了牛顿第二定律,可以说其操作步骤与真实的物理规律非常的贴切。不过就像前文说过,受物理现象启发而来的优化算法其性能是未知的,因为它们不具备智能,只有着规律,有规律就会存在弱点,就会有搜索盲区。宇宙那么大,肯定存在没有任何天体到达过的空间。
不过由于万有引力算法流程简单,理解方便,其优化方案和能改进的地方相对较多。万有引力算法的收敛速度过快,导致其全局搜索能力较弱而局部搜索能力很强,容易陷入局部最优。根据其特点,我们可以降低其收敛速度或者增加跳出局部最优操作,来平衡算法的各个性能。
参考文献
Rashedi E , Nezamabadi-Pour H , Saryazdi S . GSA: A Gravitational Search Algorithm[J]. Information Sciences, 2009, 179(13):2232-2248. 提取码:xhpa
以下指标纯属个人yy,仅供参考
目录
上一篇 优化算法笔记(十六)混合蛙跳算法
下一篇 优化算法笔记(十八)灰狼算法
优化算法matlab实现(十七)万有引力算法matlab实现