优化算法笔记|飞蛾扑火优化算法理解及实现
飛蛾撲火算法
- 一、飛蛾撲火算法背景知識
- 二、飛蛾撲火算法原理
- 三、算法流程總結
- 四、飛蛾撲火算法Python實現
一、飛蛾撲火算法背景知識
飛蛾撲火優化(Moth-flame optimization,MFO)是一種啟發式搜索算法,由由Seyedali Mirjalili在2015年提出。該算法具有并行優化能力強,全局性優且不易落入局部極值的性能特征,逐漸引起了學術界和工程界的關注。
飛蛾在夜間有一種特殊的導航方式:橫向定向。即它會與月亮(光源)保持一定的角度飛行,從而能夠保持直線的飛行路徑,但是,這種方式只在光源離飛蛾較遠的情況下才有效。當有人造光源存在時,飛蛾會被人工燈光所欺騙,一直保持與人造燈光相同的角度飛行,由于它與光源的距離過近,它飛行的路徑已經不是直線,而是一種螺旋的路徑。
受這種自然現象的啟發,Seyedali Mirjalili將飛蛾繞著光源螺旋飛行的過程抽象成為一個尋優的過程,飛蛾飛行的整個空間即是問題的解空間,一只飛蛾即是問題的一個解,而火焰(光源)即是問題的一個較優解,每一只飛蛾對應一個光源,避免了算法陷入局部最優;當飛蛾與火焰足夠多的時候,飛蛾的飛行能夠搜索解空間的絕大部分區域,從而保證了算法的探索能力;而在尋優的過程中,火焰數隨著迭代次數的增加而減少,使飛蛾能夠充分搜索更優解的鄰域空間,保證了算法的利用能力。
基于以上特點,MFO在探索與利用之間找到了平衡,在算法優化問題中有一個較好的效果。
二、飛蛾撲火算法原理
MFO是一種基于種群的隨機啟發式搜索算法,它與PSO、GSA等算法最大的區別就在于其粒子搜索路徑是螺旋形的,粒子圍繞著更優解以一種螺旋的方式移動,而不是直線移動。
三、算法流程總結
MFO 的過程如下:
1)初始化飛蛾種群。設置輸入最優潮流控制變量維度 d,飛蛾種群搜索規模 n,最大迭代次數 T以及對數螺旋形狀常數 b 等參數。
2)在搜索空間中隨機生成飛蛾位置,對飛蛾種群中每只飛蛾進行適應度評價。
3)重復如下過程指導達到停止標準
3.1)自適應更新火焰個數n。將飛蛾空間位置以適應度值遞增的順序排序后賦值給火焰,作為第一代中火焰的空間位置。當迭代次數為1時,飛蛾個數即為火焰個數。
3.2)將更新后的火焰位置與飛蛾位置的適應度值重新排序,選取適應度值更優的空間位置更新為下一代火焰的位置。
3.3)自適應機制減少火焰數量,更新飛蛾的搜索參數。
3.4)更新飛蛾位置。根據每只飛蛾對應的火焰與飛行參數更新飛蛾的位置
4)輸出所得最優解(火焰)
四、飛蛾撲火算法Python實現
# Moth-flame optimization algorithm import random as rd from math import exp, cos, pi from copy import deepcopydef ini(n, d):population, fitness = [], []for i in range(n):moth = []for j in range(d):moth.append(rd.uniform(-10, 10))population.append(moth)return populationdef getFitness(moths):fitness = []for i in range(len(moths)):fitness.append(objFunction(moths[i]))return fitnessdef objFunction(moth):objFunctionValue = 0for i in range(len(moth)):objFunctionValue += moth[i] ** 2return objFunctionValuedef run():number, dimension = 10, 10b = 1mothPopulation = ini(number, dimension)iterx, maxIterx = 0, 100while iterx < maxIterx:mothFitness = getFitness(mothPopulation)if iterx > 90:flameNumber = 1elif iterx == 0:flameNumber = 10else:flameNumber = int((maxIterx - iterx) / 10) + 1flamePopulation, flameFitness = getFlame(mothPopulation, mothFitness, flameNumber)for i in range(number):for j in range(dimension):r = -1 - 0.01 * iterxt = rd.uniform(r, 1)if i < len(flamePopulation):distance = abs(flamePopulation[i][j] - mothPopulation[i][j])mothPopulation[i][j] = distance * exp(b * t) * cos(2 * pi * t) + flamePopulation[i][j]mothPopulation[i][j] = check(mothPopulation[i][j])else:distance = abs(flamePopulation[0][j] - mothPopulation[i][j])mothPopulation[i][j] = distance * exp(b * t) * cos(2 * pi * t) + flamePopulation[0][j]mothPopulation[i][j] = check(mothPopulation[i][j])iterx += 1print(flamePopulation, flameFitness)def getFlame(mothPopulation, mothFitness, flameNumber):flamePopulation, flameFitness = [], []fitness = deepcopy(mothFitness)fitness.sort()for i in range(flameNumber):flameFitness.append(fitness[i])flamePopulation.append(mothPopulation[mothFitness.index(fitness[i])])return flamePopulation, flameFitnessdef check(x):if x < -10:return -10elif x > 10:return 10else:return xif __name__ == '__main__':run()運行結果顯示:
輸出所有火焰位置為:
參考:
Mirjalili S. Moth-flame optimization algorithm: A novel nature-inspired heuristic paradigm[J]. Knowledge-based systems, 2015, 89: 228-249.
參考1:https://blog.csdn.net/qq_40894102/article/details/107298522
參考2:https://blog.csdn.net/u011835903/article/details/107764895?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-2&spm=1001.2101.3001.4242
總結
以上是生活随笔為你收集整理的优化算法笔记|飞蛾扑火优化算法理解及实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 卷积神经网络CNN(8)—— Pix2P
- 下一篇: scatter() 散点图样式