目录
一、算法理论基础
二、飞蛾扑火算法数学模型
三、MFO算法流程
四、MFO有效解决优化问题的分析
飞蛾扑火优化算法是Mirjalili于2015年提出的一种新型智能优化算法,其灵感来源于一种特殊的导航机制—横向定位导航,实现了勘探与开发的较好平衡以获得全局优化性能。MFO算法具有并行优化能力强,全局性优且不易落入局部极值的性能特征,因此在多个领域中得到广泛的应用。在MFO算法中,将待优化变量作为飞蛾在空间中的位置,通过改变飞蛾的位置向量,在多维空间中不断迭代寻优进而得到符合要求的全局最优解。‘
飞蛾最有趣的事实是它们在夜间的特殊导航,使用月光在夜间飞行,称为横向导航的机制。在这种方法中,飞蛾通过与月球保持固定的角度飞行,这是一种在直线上长距离飞行是非常有效的机制,如图1所示:
在城市中,存在很多人工光源,飞蛾会错认为“月光”。月亮距离地球遥远得很,飞蛾只要保持同月亮的固定角度,就可保持飞行。但灯光距离飞蛾很近,其仍使自己同光源保持相同角度,所以只能围着光源作螺旋式飞行。如图2所示:
这里应该指出的是,飞蛾和火焰都是解决方案。它们之间的区别在于我们在每次迭代中处理和更新它们的方式。飞蛾是在搜索空间中移动的实际搜索代理,而火焰是飞蛾目前为止获得的最佳位置。换句话说,火焰可以被认为是飞蛾在搜索搜索空间时掉落的旗子或大针。因此,每只蛾子都在一面旗帜(火焰)周围搜索,并在找到更好的解决方案时更新它。有了这个机制,飞蛾永远不会失去它最好的解决方案。
MFO算法是一个三元组,近似于优化问题的全局最优,定义如下:
是产生一个随机的飞蛾种群和相应的适应度值的函数。该函数的系统模型如下:
是使飞蛾在搜索空间里移动的主函数。接受矩阵,并返回更新后的。
如果满足终止准则,函数返回真;如果不满足,则函数返回假。
MFO算法的总体框架定义如下:
函数需要生成初始解并计算目标函数值。在这个函数中可以使用任意的随机分布。默认使用以下方法:
可以看到,还有另外两个数组叫和。这些矩阵定义变量的上界和下界:
式中,表示第个变量的上界,表示第个变量的下界。
初始化之后,迭代运行函数,直到函数返回。函数是在搜索空间中移动飞蛾的主要函数。如上所述,该算法的灵感来自于横向方向。为了建立这种行为的数学模型,每只蛾子的位置都是用下面的公式更新的:
其中,为第只蛾子,为第只火焰,为螺旋函数。
本文选择对数螺旋作为飞蛾的主要更新机制。但在以下条件下,任何类型的螺旋都可以在这里使用:
螺旋的起始点应该从飞蛾开始。
螺旋的最后一点应该是火焰的位置。
螺旋线的波动范围不应超过搜索空间。
考虑到这些点,MFO算法的对数螺旋线被定义为:
其中表示第个蛾对第次火焰的距离,是定义对数螺旋线形状的常数,是[-1,1]中的随机数。上式模拟了飞蛾螺旋飞行路径。从这个等式可以看出,飞蛾的下一个位置是相对于火焰的。螺旋方程中的参数定义了飞蛾的下一个位置应该是多少靠近火焰 (是最靠近火焰的位置,而最远)。
因此,超椭圆可以假定在火焰周围的各个方向以及飞蛾的下一个位置就在这个空间里。螺旋运动是提出的方法的主要组成部分,因为它决定了飞蛾如何更新它们在火焰周围的位置。
螺旋方程允许飞蛾围绕火焰飞行,而不一定在火焰之间的空间。从而保证了对搜索空间的探索和利用。下图给出了对数螺旋、火焰周围的空间以及考虑不同 在曲线上的位置。
D的计算公式如下 :
式中,为第只蛾子,为第次火焰,为第只蛾子距离第次火焰的距离。
下图为飞蛾围绕火焰位置更新的概念模型。注意,纵轴只显示一维(给定问题的1个变量/参数),但是所提出的方法可以用来改变问题的所有变量。
围绕火焰(绿色水平线)的蛾子(黑色的线)的下一个可能位置如图所示,清楚地表明飞蛾可以在一维的火焰周围探索和利用搜索空间。
当下一个位置在飞蛾和火焰之间的空间之外时,探索就发生了,如箭头所示的1、3 和 4。
当下一个位置位于飞蛾和火焰之间的空间时,就会发生剥削,正如箭头2所示。
对于这个模型有如下一些有趣的观察:
火焰通过改变 ,飞蛾能收敛于飞蛾附近的任何一点。
越低,距离火焰越近。
火焰两侧位置更新的频率随着飞蛾靠近火焰增加。
所提出的位置更新程序可以保证火焰周围的探索。为了提高找到更好解的概率,将目前得到的最优解视为火焰。因此,矩阵总是包含到目前为止得到的个最近的最优解。要求飞蛾根据这个矩阵更新它们的位置。
为了进一步强调剥削,假设是[中的随机数,其中在迭代过程中线性递减,从 -1 下降到 -2。其中称为收敛常数。通过这种方法,飞蛾倾向于利用它们对应的火焰更精确地与迭代次数成比例。
这里可能出现的一个问题是,这个位置更新只要求飞蛾向火焰移动,然而它使MFO算法快速陷入局部最优。为了防止这种情况,每只飞蛾都必须根据其中一个火焰更新自己的位置。
它每次迭代并更新火焰列表后,将根据它们的适应度值对火焰进行排序。
然后蛾子根据它们对应的火焰更新它们的位置。第一个飞蛾总是更新它的位置与最好的火焰,而最后一个飞蛾更新它的位置与最坏的火焰在列表中。
下图显示了如何将每个飞蛾分配到火焰列表中的一个火焰上。
应该注意的是,这个假设是为设计 MFO 算法而做的,而可能不是自然界中蛾子的实际行为。但横向定向仍然是由人工飞蛾完成的。为每个飞蛾分配特定的火焰的原因是为了防止局部最优停滞。如果所有的飞蛾都被一个火焰吸引,它们会在搜索空间中聚集到一点,因为它们只能飞向火焰而不能向外。要求他们在不同的火焰周围移动,会导致更高的搜索空间剥削和更低的局部最优停滞的概率。
因此,由于以下原因,该方法可以保证对目前所获得的最佳位置周围搜索空间的探索:
飞蛾根据超球体周围获得的最佳解决方案更新他们的位置。
火焰的顺序根据每次迭代的最佳解决方案而改变,并且要求飞蛾根据更新的火焰更新它们的位置。
因此,在不同的火焰周围可能会发生飞蛾的位置更新,这是一种使飞蛾在搜索空间中突然移动,促进探索的机制。
这里的另一个问题是,蛾在搜索空间中相对于个不同位置的位置更新可能会降低对最有前途的解决方案的利用。为了解决这一问题,提出了一种火焰数量的适应性机制。下图显示了火焰数量在迭代过程中是如何自适应减少的。在这方面使用了下列公式:
其中为当前迭代次数,为最大火焰数,为最大迭代数。从图可以看出,在迭代的初始步骤中有个火焰。然而,飞蛾只在迭代的最后一步更新它们的位置。火焰数量的逐渐减少平衡了搜索空间的剥削和利用。函数被执行,直到函数返回为止。终止函数后,返回最优蛾子作为最优蛾子的最优近似。
Step1:初始化种群数量、空间维度、最大迭代次数;
Step2: 算法通过随机初始化方法产生一定数量的飞蛾,然后使用适应度函数计算每个飞蛾适应度值;
Step3: 将飞蛾和火焰的位置的适应度值排序,取当前最优的参数作为下一代火焰位置;
Step4: 飞蛾按照对数螺旋曲线对自己的位置进行更新,并将新的适应度值加入之前的序列中重新排序,更新最优解并更新火焰数量;
Step5: 判断是否达到最大迭代次数,若是,则输出最优解;若不是,则返回步骤三。
更新位置的程序允许获得围绕火焰相邻的位置的解决方案,主要是一种促进机制剥削。
由于MFO利用了大量的飞蛾,能够有效避免局部最优。
为每个蛾子分配一个火焰并更新序列,火焰在每次迭代中都增加了搜索空间的探索,降低了局部最优停滞的概率。
考虑到目前为止获得的最佳解决方案保存有前途的解决方案作为蛾的参考。
最好的解被保存在矩阵中,所以它们永远不会丢失。
自适应的火焰数量平衡了探索和剥削。
自适应收敛常数会加速收敛围绕着火焰的迭代过程。
这些观察结果使MFO算法有可能改进初始随机解和收敛到搜索空间中的一个更好的点。