赞
踩
飞蛾扑火算法Moth Flame Optimization
MFO算法2015年诞生,就是固定数量的Moth(飞蛾)在解空间内游荡(游荡路线见更新公式)寻找更合适的位置(更符合目标函数的解),而Flame(火)就是目前最优秀的解(Flame数量处于变化)。
理解粒子群PSO的同学就比较好理解这类算法,相对粒子群算法,这个算法区别在:
1、更新公式中,新Moth的解变化范围更大,让MFO比传统粒子群的开发能力更强;
2、Flame个数随迭代变化。PSO始终追逐一个最优解,而MFO最初拥有n个Flame(同时n个moths),在迭代中逐步淘汰最次Flame,最终剩1个最优秀Flame。如此,迭代之初Moths(PSO的粒子)不会迅速集中,有利于MFO的开发能力;
3、更新公式中r取值的变化也是为了加强迭代末期的探索能力。后期可以让新Moth更加接近Flame,提高了探索能力。
这个算法求解优势在不需要求导,Hessian 矩阵,可以应付更多类型的函数。
但是在单峰函数unimodal中探索能力exploration不如最速下降法,牛顿法,换言之,精度不够,可以选择非常高的迭代次数来弥补。
在多峰函数multimodal中开发能力强,善于发现全局极值global minimum,避开局部极值local minimum。
本人初学,目前认为如果使用时发现每次运行结果都差别很大(精度也不够),直接加大迭代次数就可以应付。
1、 初始n个moth,位置在解空间内随机分布
2、 向量存储每个moth 的Fitness value(性能指标或求极值目标方程)
3、 将第一代moth位置排序后作为Flame坐标(最满意的解放在最上面)
4、 更新位置,每个moth的单个维度的值依据更新公式按螺旋轨迹向对应Flame飞去,当moth数量小于等于flame数量时,第i个moth追逐第i个flame;当moth数量大于flame数量时,多出来的moth追逐最末flame
5、 moth位置更新后需要检查是否越界,超过极值即重新赋极值
6、 计算所有moth的Fitness value,与之前Flame的Fitness value共同排序,将拥有n个最优秀Fitness value的解作为新的Flame,最满意的解放在首行。
7、 计算Flame数量,其随着迭代次数增长而逐渐减少,迭代结束时仅有1个Flame
引用下文论文中的两张图,介绍Moth游荡的路线:
paper介绍moth走螺旋线,但是实际更新公式,每次更新1个元素,而不是每个Moth的所有元素一起更新。如果用Matlab画图就发现2D解空间中Moth并不是绕螺旋线。所谓螺旋线只是让Moth解中每一维的元素有更大取值空间(更强的开发能力exploitation),因为他让新Moth取值不局限于Flame和旧Moth,可以大于这两点,可以小于这两点,也可以在两点之间活动。这是圆的优势,而粒子群PSO的直线让新粒子只能选最优粒子和旧粒子之间的值。第二点,相对圆,螺旋线的w末尾让Moth有接近Flame的机会,这就代表Moth可以探索,提高解的精度,这就是螺旋线的优势了。文章末尾的Paper在最后推荐大家深入研究不同螺旋线的带来不同效果。
迭代算法步骤:
1、 随机散布n个moth位置
开始迭代
2、 根据当前迭代次数计算Flame数量fn
3、 将越界moth的位置重置为空间边界值(解为向量时,仅重置具体越界元素)
4、 计算所有moth的性能指标或者目标方程值
5、 Flame选择:第1次迭代时,将moth根据性能指标从优到劣排列,并作为flame;
第1 次之后的迭代,将flame和上一次迭代的moth共同根据性能指标排列,选前fn个优秀解(包含flame和新的moth)作为火焰,取最优解作为最优flame
6、 重新计算r值,介绍见更新公式
7、 根据更新公式,逐个更新moth中每个元素(每次产生新的随机数t)。第i个moth追逐第i个火焰,当i>火焰数量fn时,追逐第fn个火焰
本次迭代结束,重新返回第2步;
全部迭代结束后,最优flame作为最终解。
可能的应用:
焊缝设计优化
齿轮链优化设计
弹簧优化设计
参考文献:
Mirjalili, S. (2015). Moth-flame optimization algorithm: A novel nature-inspired heuristic paradigm. Knowledge-Based Systems, 89, pp.228–249.
https://zhuanlan.zhihu.com/p/50380893
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。