蛙跳演算法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實現