1. 人工蜂群算法簡介
(以下描述,均不是學術(shù)用語,僅供大家快樂的閱讀)
工蜂群算法(Artificial Bee Colony Algorithm,ABC)是一種模仿蜜蜂采蜜機理而產(chǎn)生的群智能優(yōu)化算法。其原理相對復雜,但實現(xiàn)較為簡單,在許多領(lǐng)域中都有研究和應(yīng)用。
人工蜂群算法中,每一個蜜源的位置代表了待求問題的一個可行解。蜂群分為采蜜蜂、觀察蜂和偵查蜂。采蜜蜂與蜜源對應(yīng),一個采蜜蜂對應(yīng)一個蜜源。觀察蜂則會根據(jù)采蜜蜂分享的蜜源相關(guān)信息選擇跟隨哪個采蜜蜂去相應(yīng)的蜜源,同時該觀察蜂將轉(zhuǎn)變?yōu)閭刹榉洹刹榉鋭t自由的搜索新的蜜源。每一個蜜源都有開采的限制次數(shù),當一個蜜源被采蜜多次而達到開采限制次數(shù)時,在該蜜源采蜜的采蜜蜂將轉(zhuǎn)變?yōu)閭刹榉洹C總€偵查蜂將隨機尋找一個新蜜源進行開采,并轉(zhuǎn)變成為采蜜蜂。
2. 算法流程
這次我們的主角是一群勤勞的小蜜蜂。這群小蜜蜂分為三個職業(yè):采蜜蜂、觀察蜂和偵查蜂。
采蜜蜂:也有叫雇傭蜂,蜜源的發(fā)現(xiàn)者,發(fā)現(xiàn)蜜源后會去招募觀察蜂小伙伴來一同開采這個蜜源。
觀察蜂:也有叫非雇傭蜂、跟隨蜂等,在等來數(shù)只采蜜蜂來招募時,觀察蜂會在眾多的采蜜蜂中選擇一只跟隨去開采采蜜蜂所發(fā)現(xiàn)的蜜源,直到該蜜源被開采完。
偵查蜂:不跟隨任何其他蜜蜂,自己尋找蜜源,找到之后則會轉(zhuǎn)變?yōu)椴擅鄯淙フ心加^察蜂。
每只蜜蜂第t代的位置如下,每一個位置都代表一個蜜源,蜜源值越優(yōu)對蜜蜂的吸引越大。
在大多數(shù)書和論文上都是這么描述的,可是,這有什么用?這些描述一點都不具體,完全無法按照這些描述精準的完成算法。
下面來說一下我的關(guān)鍵問題所在。
1.三種蜜蜂之間的角色如何轉(zhuǎn)換?都說采蜜蜂能轉(zhuǎn)換成偵查蜂,偵查蜂能轉(zhuǎn)換成采蜜蜂,那么觀察蜂能否轉(zhuǎn)變成采蜜蜂和偵查蜂?
2.蜜源數(shù)量是否有上限?采蜜蜂每次找到蜜源后即轉(zhuǎn)換為偵查蜂,若偵查蜂又可以搜尋新的蜜源,那么每次迭代后,都會新增采蜜蜂數(shù)量的蜜源,但是對一個蜜源的開采可能并不是一次迭代過程就能夠完成的,那么會擁有大量的未被開采完甚至未被開采的蜜源,是否會造成資源浪費。
下面是我的實現(xiàn)方式(我的答案):
1. 三種蜜蜂之間可以相互轉(zhuǎn)化。
采蜜蜂->觀察蜂:有觀察蜂在采蜜過程中發(fā)現(xiàn)了比當前采蜜蜂更好的蜜源,則采蜜蜂放棄當前蜜源轉(zhuǎn)而變成觀察蜂跟隨優(yōu)質(zhì)蜜源,同時該觀察蜂轉(zhuǎn)變?yōu)椴擅鄯洹?br>
采蜜蜂->觀察蜂:當該采蜜蜂所發(fā)現(xiàn)的蜜源被開采完后,它會轉(zhuǎn)變?yōu)橛^察蜂去跟隨其他采蜜蜂。
采蜜蜂->偵查蜂:當所有的采蜜蜂發(fā)現(xiàn)的蜜源都被開采完后,采蜜蜂將會變?yōu)閭刹榉洌^察蜂也會變成偵查蜂,因為大家都無蜜可采。
偵查蜂->采蜜蜂、觀察蜂:偵查蜂隨機搜索蜜源,選擇較好的數(shù)個蜜源位置的蜜蜂為采蜜蜂,其他蜜蜂為觀察蜂。
2.蜜源的數(shù)量上限
蜜源的數(shù)量上限等于采蜜蜂的數(shù)量上限。初始化時所有蜜蜂都是偵查蜂,在這些偵查蜂所搜索到的蜜源中選出數(shù)個較優(yōu)的蜜源,發(fā)現(xiàn)這些蜜源的偵查蜂變?yōu)椴擅鄯洌渌鄯渥優(yōu)橛^察蜂。直到所有的蜜源都被開采完之前,蜜源的數(shù)量不會增加,因為這個過程中沒有產(chǎn)生偵查蜂。所有的蜜源都被開采完后,所有的蜜蜂再次全部轉(zhuǎn)化為偵查蜂,新的一輪蜜源搜索開始。也可以在一個蜜源開采完時馬上產(chǎn)生一個新的蜜源補充,保證在整個開采過程中蜜源數(shù)量恒定不變。
2.1蜜源的開采
蜜源的開采實際上就是觀察蜂跟隨采蜜蜂飛向蜜源的過程。得到的下一代的位置公式如下:
表示第i只觀察蜂在第t代時隨機選擇第r只采蜜蜂飛行一段距離,其中R為(-1,1)的隨機數(shù)。
2.2蜜源的選擇
一只觀察蜂在一次迭代過程中只能選擇一只采蜜蜂跟隨,它需要從眾多的采蜜蜂中選擇一只來進行跟隨。觀察蜂選擇的策略很簡單,隨機跟隨一只采蜜蜂,該采蜜蜂發(fā)現(xiàn)的蜜源越優(yōu),則選擇它的概率越大。
是不是很像輪盤賭,對,這就是輪盤賭,同時我們也可以稍作修改,比如將勤勞的小蜜蜂改為懶惰的小蜜蜂,小蜜蜂會根據(jù)蜜源的優(yōu)劣和距離以及開采程度等因素綜合來選擇跟隨哪只采蜜蜂(雖然影響不大,但聊勝于無)。
忘記了輪盤賭的小伙伴可以看一下優(yōu)化算法筆記(六)遺傳算法。
下面是我的人工蜂群算法流程圖
其實到最后才會發(fā)現(xiàn),蜜蜂之間如何轉(zhuǎn)換,按照何種策略從偵查蜂中選擇采蜜蜂等等,對算法的性能和結(jié)果影響都不大。
蜂群算法的核心思想其實是觀察蜂跟隨采蜜蜂在蜜源周圍的采蜜過程,即集中力量發(fā)展生產(chǎn)力才是最重要的,也可以說讓一部分人先富起來,再讓先富帶動后富,實現(xiàn)共同富裕。
其他的參數(shù)如采蜜蜂的數(shù)量以及蜜源的最大開采程度也是只是影響了算法的全局-局部搜索精度和收斂速度。集中力量發(fā)展的方面較多,發(fā)展的速度就會較慢,發(fā)展的深度越深得到的結(jié)果越精確。但是一味最求深度必然會影響廣度,必須在深度和廣度之間做好平衡。
3. 實驗
又到了實驗環(huán)節(jié),參數(shù)實驗較多,全部給出將會占用太多篇幅,僅將結(jié)果進行匯總展示。
實驗1:參數(shù)如下
參數(shù) | 值 |
---|---|
問題維度(維度) | 2 |
蜂群數(shù)量(種群數(shù)) | 20 |
迭代次數(shù)(最大迭代次數(shù)) | 50 |
采蜜蜂最大數(shù) | 10%,20%,30%,40%,50% 總?cè)簲?shù) |
蜜源最大開采次數(shù) | 60 |
取值范圍 | (-100,100) |
實驗次數(shù) | 10 |
上圖分別為采蜜蜂上限為10%總數(shù)和50%總數(shù)的情況,可以看出當采蜜蜂上限為10%總?cè)簲?shù)時,種群收斂的速度較快,但是到最后有一個點死活不動,這是因為該點作為一個蜜源,但由于適應(yīng)度值太差,使用輪盤賭被選擇到的概率太小從而沒有得到更佳的蜜源位置,而因未開采完,采蜜蜂又不能放棄該蜜源。
看了看采蜜蜂上限為50%總?cè)簲?shù)時的圖,發(fā)現(xiàn)也有幾個點不動的狀態(tài),可以看出,這時不動的點的數(shù)量明顯多于上限為10%總數(shù)的圖,原因很簡單,采蜜蜂太多,“先富”的人太多,而“后富”的人較少,沒有帶動“后富者”的“先富者”也得不到發(fā)展。
看看結(jié)果
采蜜蜂上限 | 最優(yōu)值 | 均值 | 最差值 |
---|---|---|---|
10% | 2.7246701609773516E-4 | 0.03148418695322249 | 0.14939095776515166 |
20% | 2.738392784607894E-5 | 0.034678207336322917 | 0.22487475255209172 |
30% | 2.0064357050454994E-5 | 0.030860813779668102 | 0.16996661317938938 |
40% | 1.453883912235495E-4 | 0.02199654087939065 | 0.07422594736502292 |
50% | 9.28501533821353E-4 | 0.19582266625078354 | 0.7879489746465032 |
嗯,感覺結(jié)果并沒有什么差別,可能由于問題較簡單,迭代次數(shù)較少,無法體現(xiàn)出采蜜蜂數(shù)對于結(jié)果的影響,也可能由于蜜源的搜索次數(shù)為60較大,總?cè)阂还仓荒軐ψ疃?0*50/60=16個蜜源進行搜索。我們將最大迭代次數(shù)調(diào)大至200代再看看結(jié)果
采蜜蜂上限 | 最優(yōu)值 | 均值 | 最差值 |
---|---|---|---|
10% | 3.734568294857327E-11 | 4.2729655428076835E-7 | 2.033165476252375E-6 |
20% | 4.813275393712557E-10 | 8.800554109847244E-7 | 4.369403717638076E-6 |
30% | 7.53183905542997E-10 | 4.671766666435679E-7 | 2.044803420983268E-6 |
40% | 9.491398322676551E-9 | 2.5663373709208893E-6 | 9.861923272267325E-6 |
50% | 3.1942404020660714E-9 | 3.819585072332345E-6 | 3.0717059125095225E-5 |
當最大迭代次數(shù)為200時,人工蜂群算法的結(jié)果如上圖,我們可以明顯的看出,隨著采蜜蜂上限的上升,算法結(jié)果的精度在不斷的下降,這也印證了之前的結(jié)果,由于蜜源搜索次數(shù)較大(即搜索深度較深)采蜜蜂數(shù)量越多(搜索廣度越多),結(jié)果的精度越低。不過影響也不算太大,下面我們再來看看蜜源最大開采次數(shù)對結(jié)果的影響。
實驗2:參數(shù)如下
參數(shù) | 值 |
---|---|
問題維度(維度) | 2 |
蜂群數(shù)量(種群數(shù)) | 20 |
迭代次數(shù)(最大迭代次數(shù)) | 200 |
采蜜蜂最大數(shù) | 20% 總?cè)簲?shù) |
蜜源最大開采次數(shù) | 1,2,5,10,20 |
取值范圍 | (-100,100) |
實驗次數(shù) | 10 |
上圖分別是蜜源開采限度為1,20和4000的實驗。
當蜜源開采上限為1時,即一個蜜源只能被開采一次,即此時的人工蜂群算法只有偵查蜂隨機搜索的過程,沒有觀察蜂跟隨采蜜蜂的過程,可以看出圖中的蜜蜂一直在不斷的隨機出現(xiàn)在新位置不會向某個點收斂。
當蜜源開采上限為20時,我們可以看到此時種群中的蜜蜂都會向一個點飛行。在一段時間內(nèi),有數(shù)個點一動不動,這些點可能就是采蜜蜂發(fā)現(xiàn)的位置不怎么好的蜜源,但是在幾次迭代之后,它們?nèi)詴挥^察蜂開采,從而更新位置,蜜源開采上限越高,它們停頓的代數(shù)也會越長。在所有蜜蜂都收斂于一個點之后,我們可以看到仍會不斷的出現(xiàn)其他的隨機點,這些點是偵查蜂進行隨機搜索產(chǎn)生的新的蜜源位置,這些是人工蜂群算法跳出局部最優(yōu)能力的體現(xiàn)。
當蜜源開采上限為4000時,即不會出現(xiàn)偵查蜂的搜索過程,觀察蜂只會開采初始化時出現(xiàn)的蜜源而不會采蜜蜂不會有新的蜜源產(chǎn)生,可以看出在蜂群收斂后沒有出現(xiàn)新的蜜源位置。
蜜源開采上限 | 最優(yōu)值 | 均值 | 最差值 |
---|---|---|---|
1 | 6.337994185481664E-8 | 0.05861357186812096 | 0.49990188473311625 |
2 | 5.293512648483095E-41 | 4.230581226891911E-6 | 4.163020392599152E-5 |
5 | 1.4674611682904505E-44 | 1.5470665541636557E-32 | 1.5390674100134358E-31 |
10 | 3.921568363593575E-27 | 1.1008071173291054E-22 | 6.647404140842794E-22 |
20 | 3.939678224553763E-18 | 2.0461861284987338E-14 | 1.7279556385292846E-13 |
4000 | 1.9806615835705686E-9 | 5.980622770720888E-5 | 3.3351556713991E-4 |
看看最終結(jié)果,我們發(fā)現(xiàn),當蜜源開采上線大于1時的結(jié)果提升,但是好像開采上限為5時結(jié)果明顯好于開采次數(shù)上限為其他的結(jié)果,而且隨著開采次數(shù)不斷上升,結(jié)果在不斷的變差。為什么會出現(xiàn)這樣的結(jié)果呢?原因可能還是因為問題較為簡單,在5次開采的限度內(nèi),觀察蜂已經(jīng)能找到更好的蜜源進行開采,當問題較為復雜時,我們無法知曉開采發(fā)現(xiàn)新蜜源的難度,蜜源開采上限應(yīng)該取一個相對較大的值。當蜜源開采限度為4000時,即一個蜜源不可能被開采完(開采次數(shù)為20(種群數(shù))*200(迭代次數(shù))),搜索的深度有了但是其結(jié)果反而不如開采限度為幾次幾十次來的好,而且這樣不會有偵查蜂隨機搜索的過程,失去了跳出局部最優(yōu)的能力。
我們應(yīng)該如何選擇蜜源的最大開采次數(shù)限制呢?其實,沒有最佳的開采次數(shù)限制,當適應(yīng)度函數(shù)較為簡單時,開采次數(shù)較小時能得到比較好的結(jié)果,但是適應(yīng)度函數(shù)較復雜時,經(jīng)過試驗,得出的結(jié)果遠差于開采次數(shù)較大時。當然,前面就說過,適應(yīng)度函數(shù)是一個黑盒模型,我們無法判斷問題的難易。那么我們應(yīng)該選擇一個適中的值,個人的選擇是種群數(shù)的0.5倍到總?cè)簲?shù)的2倍作為蜜源的最大開采次數(shù),這樣可以保證極端情況下,1-2個迭代周期內(nèi)小蜜蜂們能將一個蜜源開采完。
4. 總結(jié)
人工蜂群算法算是一個困擾我比較長時間的算法,幾年時間里,我根據(jù)文獻實現(xiàn)的人工蜂群算法都有數(shù)十種,只能說人工蜂群算法的描述太過模糊,或者說太過抽象,研究者怎么實現(xiàn)都說的通。但是通過實現(xiàn)多次之后發(fā)現(xiàn)雖然實現(xiàn)細節(jié)大不相同,但效果相差不多,所以我們可以認為人工蜂群算法的穩(wěn)定性比較強,只要實現(xiàn)其主要思想即可,細節(jié)對于結(jié)果的影響不太大。
對于人工蜂群算法影響最大的因素還是蜜源的開采次數(shù)限制,開采次數(shù)限制越大,對同一蜜源的開發(fā)力度越大,但是分配給其他蜜源的搜索力度會相對減少,也會降低蜂群算法的跳出局部最優(yōu)能力。可以動態(tài)修改蜜源的開采次數(shù)限制來實現(xiàn)對算法的改進,不過效果不顯著。
其次對于人工蜂群算法影響是三類蜜蜂的搜索行為,我們可以重新設(shè)計蜂群的搜索方式來對算法進行改進,比如采蜜蜂在開采蜜源時是隨機飛向其他蜜源,而觀察蜂向所選的蜜源靠近。這樣改進有一定效果但是在高維問題上效果仍不明顯。
以下指標純屬個人yy,僅供參考
指標 | 星數(shù) |
---|---|
復雜度 | ★★★★☆☆☆☆☆☆ |
收斂速度 | ★★★★★★☆☆☆☆ |
全局搜索 | ★★★★★★★★☆☆ |
局部搜索 | ★★★★★☆☆☆☆☆ |
優(yōu)化性能 | ★★★★★★☆☆☆☆ |
跳出局部最優(yōu) | ★★★★★★☆☆☆☆ |
改進點 | ★★★★★☆☆☆☆☆ |