優(yōu)化算法學(xué)習(xí)|布谷鳥算法原理及Python實現(xiàn)

哈嘍,小伙們好~

又到了算法學(xué)習(xí)的時間,那么今天就給大家介紹一個不是太新的算法——布谷鳥算法??靵硪黄饘W(xué)習(xí)吧~

01 算法背景

布谷鳥算法(Cuckoo search algorithm,CS),顧名思義,肯定是和布谷鳥有關(guān)。沒錯,這個算法就是英國學(xué)者 Xin-She Yang 和 Suash Deb 于2009年模仿布谷鳥育雛行為而提出的一種新興基于自然元啟發(fā)式算法。

布谷鳥這種鳥很懶,不會筑巢,自己生娃自己不會孵,直接扔到其他種類鳥的鳥巢中,但是有時候會被宿主鳥媽媽發(fā)現(xiàn)不是自己的蛋,然后就會被拋棄,甚至放棄這個巢。但是布谷鳥一般會比其他的鳥更早破殼,他們還有另外一種隱藏技能,幼鳥會模仿宿主鳥孩子的叫聲來騙取鳥媽媽的信任,同時他們還會本能地把其他的蛋推下巢,從而獲得更多的食物。

因此,我們可以這樣理解:鳥巢=蛋=問題解,蛋能否成功被宿主鳥孵化并茁長成長是衡量問題解好壞的唯一標(biāo)準(zhǔn) 。布谷鳥在尋找鳥巢下蛋的過程就是在D維空間中尋找解的過程,而鳥巢的好壞象征著解的好壞。

02 算法原理

在自然界中,布谷鳥尋找適合自己產(chǎn)卵的鳥窩位置是隨機(jī)的或是類似隨機(jī)的方式,為了模擬布谷鳥尋窩的方式,首先,需要設(shè)定以下3個理想的狀態(tài)

(1)布谷鳥一次只產(chǎn)一個卵,并隨機(jī)選擇鳥窩來孵化它;

(2)在隨機(jī)選擇的一組鳥窩中,最好的鳥窩將會被保留到下一代;

(3)可利用的鳥窩數(shù)量n是固定的,一個鳥窩的主人能發(fā)現(xiàn)一個外來鳥蛋的概率Pa∈[0,1]

可能會有人會問,怎么隨機(jī)去尋找鳥窩的位置。因為更新位置的方法十分重要,關(guān)系到后面算法收斂的速度。那這個時候,我們就不得不提到另外一個概念——“萊維飛行”。一些研究證明,使用萊維飛行(Levy Flight)的方式可以讓布谷鳥更有效地去尋找全局最優(yōu)解而不至于陷入局部最優(yōu)解中。

03 萊維飛行

我們可以先來看一下萊維飛行的演示圖。

通過相關(guān)概念我們知道:萊維飛行是由較長時間的短步長和較短時間的長步長組成。

通俗點(diǎn)說就是,點(diǎn)大多數(shù)時間只有小距離移動,偶爾會有大距離移動的情況。這和自然界中大多數(shù)動物覓食方式類似。找到一塊區(qū)域后細(xì)致的查找獵物,如果沒找到,就換一片區(qū)域。

假設(shè)布谷鳥尋找鳥窩首先隨機(jī)選擇一個方向,然后確定要走多遠(yuǎn)。Levy分布要求大概率落在值比較小的位置,小概率落在值比較大的位置,剛好滿足這種均勻分布。

04 搜索機(jī)制

對于這個算法來說,執(zhí)行兩種類型的搜索方式:局部搜索和全局搜索。

局部搜索可以通過局部隨機(jī)行走實現(xiàn):


其中xj和xk為隨機(jī)選擇的解,H(μ)為赫維賽德函數(shù),pα是用于平衡局部和全局隨機(jī)游走的切換參數(shù),s為步長,ε為均勻分布的隨機(jī)數(shù)。

全局搜索通過萊維飛行實現(xiàn):

其中α>0為步長縮放因子,且:


其中:

萊維飛行是步長服從Lévy分布的隨機(jī)游走:

通過萊維飛行生成的隨機(jī)數(shù)由通過正態(tài)分布創(chuàng)建的隨機(jī)方向選擇組成,步長使用Mantegna算法生成:

其中μ和ν服從正太分布:

05 算法流程

1. 初始化:目標(biāo)函數(shù)f(x)、鳥巢個數(shù)n、最大迭代次數(shù)MaxGeneration、最大發(fā)現(xiàn)概率Pa,解空間上下界Lb與Ub等;

2. 隨機(jī)產(chǎn)生初始解x(i)(鳥巢位置),計算相應(yīng)的初始適應(yīng)度值F(i),并記錄當(dāng)前的最優(yōu)函數(shù)值;

3. 利用Levy飛行更新解(產(chǎn)生新的鳥蛋),計算相應(yīng)的適應(yīng)度值F(j);

4. 比較Fi與Fj適應(yīng)度值,如果Fj(新解)更小,將該適應(yīng)度值及鳥蛋所代表的解賦給原來的鳥巢x(i);

5. 判斷鳥蛋是否會被發(fā)現(xiàn):用隨機(jī)數(shù)r與最大發(fā)現(xiàn)概率Pa比較,若r>Pa,被發(fā)現(xiàn),宿主找新家,鳥巢位置x(i)隨機(jī)改變,反之,則不變;

6. 對各解(鳥巢位置或者鳥巢中的鳥蛋)進(jìn)行適應(yīng)度值排序,保留最優(yōu)適應(yīng)度值的解(鳥巢位置或鳥巢中的鳥蛋);

7. 循環(huán)步驟3-6,直至達(dá)到最大迭代次數(shù)或者滿足終止條件,則算法終止。

偽代碼

06 Python實現(xiàn)

布谷鳥算法提出者之一的Xin-She Yang教授試了多組參數(shù),發(fā)現(xiàn)種群規(guī)模在15到40,布谷鳥蛋被發(fā)現(xiàn)的概率?pa 取0.25時,對于大多數(shù)優(yōu)化問題已足夠,并且結(jié)果和分析也表明收斂速度在一定程度上對所使用的參數(shù)不敏感。

以下列目標(biāo)函數(shù)為例,應(yīng)用布谷鳥算法進(jìn)行求解:

得到最優(yōu)解,與迭代圖分別為:

07 參考文獻(xiàn)

[1] Yang X S . Cuckoo Search and Firefly Algorithm: Overview and Analysis[M]. Springer International Publishing, 2014.

[2] Yang X S ,? Deb S . Cuckoo Search via Lévy flights[C]// World Congress on Nature & Biologically Inspired Computing. IEEE, 2010.

[3] Yang X S ,? Deb S . Cuckoo Search via Levy Flights[J]. mathematics, 2010.

好啦,今天的分享就結(jié)束啦。布谷鳥算法的Python源碼我已經(jīng)放到公眾號“土博在路上”啦,感興趣的小伙伴們關(guān)注公眾號“土博在路上”,后臺回復(fù)布谷鳥自行獲取吧!(ps:需要MATLAB源碼的話可以留言告訴我,看到后就會回復(fù)!)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • “布——咕,布——咕,布——咕......”聲音仿佛能傳的很遠(yuǎn),也許是因為山林樹木多面積大的原因,布谷鳥的...
    璇慧慧閱讀 1,740評論 1 2
  • 概念: 定義:CuckooHash(布谷鳥散列)是為了解決哈希沖突問題而提出,利用較少的計算換取較大的空間。 特點(diǎn)...
    大海孤了島閱讀 17,093評論 1 7
  • “芒種”是農(nóng)歷的二十四個節(jié)氣之一。芒種到來,農(nóng)民們便開始忙碌地在田間耕種。 每年芒種前后,在農(nóng)家房前屋后的大樹頂上...
    花知語閱讀 1,394評論 0 15
  • 一只布谷鳥,飛過山脈,飛過森林,飛了七天七夜,落到田野的一角。 她從口中吐出一顆種子,這是一顆橡樹種子,一顆不像樣...
    桃木梳梳閱讀 371評論 0 3
  • 除了熱映的《解憂雜貨店》,東野圭吾的這本《布谷鳥的蛋是誰的》也是一部不錯的小說?!恫脊萨B的蛋是誰的》是由馬杰譯、2...
    簡美路上閱讀 1,841評論 0 2

友情鏈接更多精彩內(nèi)容