1. 優化演算法筆記(八)人工蜂群演算法
(以下描述,均不是學術用語,僅供大家快樂的閱讀)
工蜂群演算法(Artificial Bee Colony Algorithm,ABC)是一種模仿蜜蜂采蜜機理而產生的群智能優化演算法。其原理相對復雜,但實現較為簡單,在許多領域中都有研究和應用。
人工蜂群演算法中,每一個蜜源的位置代表了待求問題的一個可行解。蜂群分為采蜜蜂、觀察蜂和偵查蜂。采蜜蜂與蜜源對應,一個采蜜蜂對應一個蜜源。觀察蜂則會根據采蜜蜂分享的蜜源相關信息選擇跟隨哪個采蜜蜂去相應的蜜源,同時該觀察蜂將轉變為偵查蜂。偵查蜂則自由的搜索新的蜜源。每一個蜜源都有開採的限制次數,當一個蜜源被采蜜多次而達到開采限制次數時,在該蜜源采蜜的采蜜蜂將轉變為偵查蜂。每個偵查蜂將隨機尋找一個新蜜源進行開采,並轉變成為采蜜蜂。
下面是我的實現方式(我的答案):
1. 三種蜜蜂之間可以相互轉化。
采蜜蜂->觀察蜂:有觀察蜂在采蜜過程中發現了比當前采蜜蜂更好的蜜源,則采蜜蜂放棄當前蜜源轉而變成觀察蜂跟隨優質蜜源,同時該觀察蜂轉變為采蜜蜂。
采蜜蜂->觀察蜂:當該采蜜蜂所發現的蜜源被開采完後,它會轉變為觀察蜂去跟隨其他采蜜蜂。
采蜜蜂->偵查蜂:當所有的采蜜蜂發現的蜜源都被開采完後,采蜜蜂將會變為偵查蜂,觀察蜂也會變成偵查蜂,因為大家都無蜜可采。
偵查蜂->采蜜蜂、觀察蜂:偵查蜂隨機搜索蜜源,選擇較好的數個蜜源位置的蜜蜂為采蜜蜂,其他蜜蜂為觀察蜂。
2.蜜源的數量上限
蜜源的數量上限等於采蜜蜂的數量上限。初始化時所有蜜蜂都是偵查蜂,在這些偵查蜂所搜索到的蜜源中選出數個較優的蜜源,發現這些蜜源的偵查蜂變為采蜜蜂,其他蜜蜂變為觀察蜂。直到所有的蜜源都被開采完之前,蜜源的數量不會增加,因為這個過程中沒有產生偵查蜂。所有的蜜源都被開采完後,所有的蜜蜂再次全部轉化為偵查蜂,新的一輪蜜源搜索開始。也可以在一個蜜源開采完時馬上產生一個新的蜜源補充,保證在整個開采過程中蜜源數量恆定不變。
蜜源的開采實際上就是觀察蜂跟隨采蜜蜂飛向蜜源的過程。得到的下一代的位置公式如下:
表示第i只觀察蜂在第t代時隨機選擇第r只採蜜蜂飛行一段距離,其中R為(-1,1)的隨機數。
一隻觀察蜂在一次迭代過程中只能選擇一隻采蜜蜂跟隨,它需要從眾多的采蜜蜂中選擇一隻來進行跟隨。觀察蜂選擇的策略很簡單,隨機跟隨一隻采蜜蜂,該采蜜蜂發現的蜜源越優,則選擇它的概率越大。
是不是很像輪盤賭,對,這就是輪盤賭,同時我們也可以稍作修改,比如將勤勞的小蜜蜂改為懶惰的小蜜蜂,小蜜蜂會根據蜜源的優劣和距離以及開采程度等因素綜合來選擇跟隨哪只採蜜蜂(雖然影響不大,但聊勝於無)。
忘記了輪盤賭的小夥伴可以看一下 優化演算法筆記(六)遺傳演算法 。
下面是我的人工蜂群演算法流程圖
又到了實驗環節,參數實驗較多,全部給出將會佔用太多篇幅,僅將結果進行匯總展示。
實驗1:參數如下
上圖分別為采蜜蜂上限為10%總數和50%總數的情況,可以看出當采蜜蜂上限為10%總群數時,種群收斂的速度較快,但是到最後有一個點死活不動,這是因為該點作為一個蜜源,但由於適應度值太差,使用輪盤賭被選擇到的概率太小從而沒有得到更佳的蜜源位置,而因未開采完,采蜜蜂又不能放棄該蜜源。
看了看采蜜蜂上限為50%總群數時的圖,發現也有幾個點不動的狀態,可以看出,這時不動的點的數量明顯多於上限為10%總數的圖,原因很簡單,采蜜蜂太多,「先富」的人太多,而「後富」的人較少,沒有帶動「後富者」的「先富者」也得不到發展。
看看結果
嗯,感覺結果並沒有什麼差別,可能由於問題較簡單,迭代次數較少,無法體現出采蜜蜂數對於結果的影響,也可能由於蜜源的搜索次數為60較大,總群一共只能對最多20*50/60=16個蜜源進行搜索。我們將最大迭代次數調大至200代再看看結果
當最大迭代次數為200時,人工蜂群演算法的結果如上圖,我們可以明顯的看出,隨著采蜜蜂上限的上升,演算法結果的精度在不斷的下降,這也印證了之前的結果,由於蜜源搜索次數較大(即搜索深度較深)采蜜蜂數量越多(搜索廣度越多),結果的精度越低。不過影響也不算太大,下面我們再來看看蜜源最大開采次數對結果的影響。
實驗2:參數如下
上圖分別是蜜源開采限度為1,20和4000的實驗。
當蜜源開采上限為1時,即一個蜜源只能被開采一次,即此時的人工蜂群演算法只有偵查蜂隨機搜索的過程,沒有觀察蜂跟隨采蜜蜂的過程,可以看出圖中的蜜蜂一直在不斷的隨機出現在新位置不會向某個點收斂。
當蜜源開采上限為20時,我們可以看到此時種群中的蜜蜂都會向一個點飛行。在一段時間內,有數個點一動不動,這些點可能就是采蜜蜂發現的位置不怎麼好的蜜源,但是在幾次迭代之後,它們仍會被觀察蜂開采,從而更新位置,蜜源開采上限越高,它們停頓的代數也會越長。在所有蜜蜂都收斂於一個點之後,我們可以看到仍會不斷的出現其他的隨機點,這些點是偵查蜂進行隨機搜索產生的新的蜜源位置,這些是人工蜂群演算法跳出局部最優能力的體現。
當蜜源開采上限為4000時,即不會出現偵查蜂的搜索過程,觀察蜂只會開采初始化時出現的蜜源而不會采蜜蜂不會有新的蜜源產生,可以看出在蜂群收斂後沒有出現新的蜜源位置。
看看最終結果,我們發現,當蜜源開采上線大於1時的結果提升,但是好像開采上限為5時結果明顯好於開采次數上限為其他的結果,而且隨著開采次數不斷上升,結果在不斷的變差。為什麼會出現這樣的結果呢?原因可能還是因為問題較為簡單,在5次開採的限度內,觀察蜂已經能找到更好的蜜源進行開采,當問題較為復雜時,我們無法知曉開采發現新蜜源的難度,蜜源開采上限應該取一個相對較大的值。當蜜源開采限度為4000時,即一個蜜源不可能被開采完(開采次數為20(種群數)*200(迭代次數)),搜索的深度有了但是其結果反而不如開采限度為幾次幾十次來的好,而且這樣不會有偵查蜂隨機搜索的過程,失去了跳出局部最優的能力。
我們應該如何選擇蜜源的最大開采次數限制呢?其實,沒有最佳的開采次數限制,當適應度函數較為簡單時,開采次數較小時能得到比較好的結果,但是適應度函數較復雜時,經過試驗,得出的結果遠差於開采次數較大時。當然,前面就說過,適應度函數是一個黑盒模型,我們無法判斷問題的難易。那麼我們應該選擇一個適中的值,個人的選擇是種群數的0.5倍到總群數的2倍作為蜜源的最大開采次數,這樣可以保證極端情況下,1-2個迭代周期內小蜜蜂們能將一個蜜源開采完。
人工蜂群演算法算是一個困擾我比較長時間的演算法,幾年時間里,我根據文獻實現的人工蜂群演算法都有數十種,只能說人工蜂群演算法的描述太過模糊,或者說太過抽象,研究者怎麼實現都說的通。但是通過實現多次之後發現雖然實現細節大不相同,但效果相差不多,所以我們可以認為人工蜂群演算法的穩定性比較強,只要實現其主要思想即可,細節對於結果的影響不太大。
對於人工蜂群演算法影響最大的因素還是蜜源的開采次數限制,開采次數限制越大,對同一蜜源的開發力度越大,但是分配給其他蜜源的搜索力度會相對減少,也會降低蜂群演算法的跳出局部最優能力。可以動態修改蜜源的開采次數限制來實現對演算法的改進,不過效果不顯著。
其次對於人工蜂群演算法影響是三類蜜蜂的搜索行為,我們可以重新設計蜂群的搜索方式來對演算法進行改進,比如采蜜蜂在開采蜜源時是隨機飛向其他蜜源,而觀察蜂向所選的蜜源靠近。這樣改進有一定效果但是在高維問題上效果仍不明顯。
以下指標純屬個人yy,僅供參考
目錄
上一篇 優化演算法筆記(七)差分進化演算法
下一篇 優化演算法筆記(九)杜鵑搜索演算法
優化演算法matlab實現(八)人工蜂群演算法matlab實現
2. 群智能演算法有哪些
群智能演算法主要包括以下幾種:
蟻群演算法:
粒子群優化演算法:
人工蜂群演算法:
3. 人工分蜂的時間該如何選擇,這期間要注意什麼
當蜜蜂種群過旺,就會造N王台,在N個新王准備出來之時,老蜂王會帶走一部分蜂群,另立新家。新王出世,出早的會把出遲的咬死,同時出的會互相博斗,強者勝,無論幾個王台只會留下一個新王。
人工養的,如果要分群就會在新王出來之前分群(黑頂就是新王准備出),如果不需要分群,那麼就會沒出來的新王割掉弄死就行。
蜜蜂
在群體智慧形成過程中,蜜蜂間交換信息是最重要的一環。舞蹈區是蜂巢中最為重要的信息交換地。蜜蜂的舞蹈也叫搖擺舞。食物源的信息在舞蹈區通過搖擺舞的形式與其他蜜蜂共享,引領蜂通過搖擺舞的持續時間等來表現食物源的收益率,故跟隨蜂可以觀察到大量的舞蹈並依據收益率來選擇到哪個食物源采蜜。收益率與食物源被選擇的可能性成正比。因而,蜜蜂被招募到一個食物源的概率與食物源的收益率成正比。