1. 人工蜂群算法簡介
(以下描述,均不是學(xué)術(shù)用語诺擅,僅供大家快樂的閱讀)
工蜂群算法(Artificial Bee Colony Algorithm啡直,ABC)是一種模仿蜜蜂采蜜機(jī)理而產(chǎn)生的群智能優(yōu)化算法。其原理相對復(fù)雜烹玉,但實(shí)現(xiàn)較為簡單阐滩,在許多領(lǐng)域中都有研究和應(yīng)用掂榔。
人工蜂群算法中,每一個(gè)蜜源的位置代表了待求問題的一個(gè)可行解装获。蜂群分為采蜜蜂穴豫、觀察蜂和偵查蜂。采蜜蜂與蜜源對應(yīng)秤涩,一個(gè)采蜜蜂對應(yīng)一個(gè)蜜源司抱。觀察蜂則會(huì)根據(jù)采蜜蜂分享的蜜源相關(guān)信息選擇跟隨哪個(gè)采蜜蜂去相應(yīng)的蜜源,同時(shí)該觀察蜂將轉(zhuǎn)變?yōu)閭刹榉湓纫ァ刹榉鋭t自由的搜索新的蜜源资溃。每一個(gè)蜜源都有開采的限制次數(shù)溶锭,當(dāng)一個(gè)蜜源被采蜜多次而達(dá)到開采限制次數(shù)時(shí),在該蜜源采蜜的采蜜蜂將轉(zhuǎn)變?yōu)閭刹榉浔跋АC總€(gè)偵查蜂將隨機(jī)尋找一個(gè)新蜜源進(jìn)行開采驻售,并轉(zhuǎn)變成為采蜜蜂。
2. 算法流程
這次我們的主角是一群勤勞的小蜜蜂毫痕。這群小蜜蜂分為三個(gè)職業(yè):采蜜蜂迟几、觀察蜂和偵查蜂类腮。
采蜜蜂:也有叫雇傭蜂,蜜源的發(fā)現(xiàn)者缸逃,發(fā)現(xiàn)蜜源后會(huì)去招募觀察蜂小伙伴來一同開采這個(gè)蜜源厂抽。
觀察蜂:也有叫非雇傭蜂、跟隨蜂等昭殉,在等來數(shù)只采蜜蜂來招募時(shí)藐守,觀察蜂會(huì)在眾多的采蜜蜂中選擇一只跟隨去開采采蜜蜂所發(fā)現(xiàn)的蜜源卢厂,直到該蜜源被開采完。
偵查蜂:不跟隨任何其他蜜蜂巢块,自己尋找蜜源巧号,找到之后則會(huì)轉(zhuǎn)變?yōu)椴擅鄯淙フ心加^察蜂。
每只蜜蜂第t代的位置如下越走,每一個(gè)位置都代表一個(gè)蜜源,蜜源值越優(yōu)對蜜蜂的吸引越大铜跑。
在大多數(shù)書和論文上都是這么描述的,可是,這有什么用?這些描述一點(diǎn)都不具體,完全無法按照這些描述精準(zhǔn)的完成算法锅纺。
下面來說一下我的關(guān)鍵問題所在肋殴。
1.三種蜜蜂之間的角色如何轉(zhuǎn)換?都說采蜜蜂能轉(zhuǎn)換成偵查蜂,偵查蜂能轉(zhuǎn)換成采蜜蜂,那么觀察蜂能否轉(zhuǎn)變成采蜜蜂和偵查蜂?
2.蜜源數(shù)量是否有上限官地?采蜜蜂每次找到蜜源后即轉(zhuǎn)換為偵查蜂,若偵查蜂又可以搜尋新的蜜源,那么每次迭代后,都會(huì)新增采蜜蜂數(shù)量的蜜源,但是對一個(gè)蜜源的開采可能并不是一次迭代過程就能夠完成的,那么會(huì)擁有大量的未被開采完甚至未被開采的蜜源,是否會(huì)造成資源浪費(fèi)驱入。
下面是我的實(shí)現(xiàn)方式(我的答案):
1. 三種蜜蜂之間可以相互轉(zhuǎn)化氯析。
采蜜蜂->觀察蜂:有觀察蜂在采蜜過程中發(fā)現(xiàn)了比當(dāng)前采蜜蜂更好的蜜源,則采蜜蜂放棄當(dāng)前蜜源轉(zhuǎn)而變成觀察蜂跟隨優(yōu)質(zhì)蜜源宴杀,同時(shí)該觀察蜂轉(zhuǎn)變?yōu)椴擅鄯洹?br>
采蜜蜂->觀察蜂:當(dāng)該采蜜蜂所發(fā)現(xiàn)的蜜源被開采完后拾因,它會(huì)轉(zhuǎn)變?yōu)橛^察蜂去跟隨其他采蜜蜂绢记。
采蜜蜂->偵查蜂:當(dāng)所有的采蜜蜂發(fā)現(xiàn)的蜜源都被開采完后,采蜜蜂將會(huì)變?yōu)閭刹榉涔蚪猓^察蜂也會(huì)變成偵查蜂签孔,因?yàn)榇蠹叶紵o蜜可采。
偵查蜂->采蜜蜂图仓、觀察蜂:偵查蜂隨機(jī)搜索蜜源救崔,選擇較好的數(shù)個(gè)蜜源位置的蜜蜂為采蜜蜂,其他蜜蜂為觀察蜂六孵。
2.蜜源的數(shù)量上限
蜜源的數(shù)量上限等于采蜜蜂的數(shù)量上限劫窒。初始化時(shí)所有蜜蜂都是偵查蜂烛亦,在這些偵查蜂所搜索到的蜜源中選出數(shù)個(gè)較優(yōu)的蜜源懂拾,發(fā)現(xiàn)這些蜜源的偵查蜂變?yōu)椴擅鄯洌渌鄯渥優(yōu)橛^察蜂檬果。直到所有的蜜源都被開采完之前唐断,蜜源的數(shù)量不會(huì)增加脸甘,因?yàn)檫@個(gè)過程中沒有產(chǎn)生偵查蜂。所有的蜜源都被開采完后钝的,所有的蜜蜂再次全部轉(zhuǎn)化為偵查蜂铆遭,新的一輪蜜源搜索開始。也可以在一個(gè)蜜源開采完時(shí)馬上產(chǎn)生一個(gè)新的蜜源補(bǔ)充碗脊,保證在整個(gè)開采過程中蜜源數(shù)量恒定不變衙伶。
2.1蜜源的開采
蜜源的開采實(shí)際上就是觀察蜂跟隨采蜜蜂飛向蜜源的過程害碾。得到的下一代的位置公式如下:
表示第i只觀察蜂在第t代時(shí)隨機(jī)選擇第r只采蜜蜂飛行一段距離,其中R為(-1卧须,1)的隨機(jī)數(shù)。
2.2蜜源的選擇
一只觀察蜂在一次迭代過程中只能選擇一只采蜜蜂跟隨笋籽,它需要從眾多的采蜜蜂中選擇一只來進(jìn)行跟隨车海。觀察蜂選擇的策略很簡單隘击,隨機(jī)跟隨一只采蜜蜂,該采蜜蜂發(fā)現(xiàn)的蜜源越優(yōu)州叠,則選擇它的概率越大凶赁。
是不是很像輪盤賭虱肄,對,這就是輪盤賭斟或,同時(shí)我們也可以稍作修改集嵌,比如將勤勞的小蜜蜂改為懶惰的小蜜蜂纸淮,小蜜蜂會(huì)根據(jù)蜜源的優(yōu)劣和距離以及開采程度等因素綜合來選擇跟隨哪只采蜜蜂(雖然影響不大,但聊勝于無)绘面。
忘記了輪盤賭的小伙伴可以看一下優(yōu)化算法筆記(六)遺傳算法侈沪。
下面是我的人工蜂群算法流程圖
其實(shí)到最后才會(huì)發(fā)現(xiàn)亭罪,蜜蜂之間如何轉(zhuǎn)換应役,按照何種策略從偵查蜂中選擇采蜜蜂等等燥筷,對算法的性能和結(jié)果影響都不大肆氓。
蜂群算法的核心思想其實(shí)是觀察蜂跟隨采蜜蜂在蜜源周圍的采蜜過程底瓣,即集中力量發(fā)展生產(chǎn)力才是最重要的,也可以說讓一部分人先富起來拨扶,再讓先富帶動(dòng)后富患民,實(shí)現(xiàn)共同富裕官套。
其他的參數(shù)如采蜜蜂的數(shù)量以及蜜源的最大開采程度也是只是影響了算法的全局-局部搜索精度和收斂速度奶赔。集中力量發(fā)展的方面較多杠氢,發(fā)展的速度就會(huì)較慢,發(fā)展的深度越深得到的結(jié)果越精確绞旅。但是一味最求深度必然會(huì)影響廣度因悲,必須在深度和廣度之間做好平衡勺爱。
3. 實(shí)驗(yàn)
又到了實(shí)驗(yàn)環(huán)節(jié),參數(shù)實(shí)驗(yàn)較多卫旱,全部給出將會(huì)占用太多篇幅顾翼,僅將結(jié)果進(jìn)行匯總展示奈泪。
實(shí)驗(yàn)1:參數(shù)如下
參數(shù) | 值 |
---|---|
問題維度(維度) | 2 |
蜂群數(shù)量(種群數(shù)) | 20 |
迭代次數(shù)(最大迭代次數(shù)) | 50 |
采蜜蜂最大數(shù) | 10%,20%耗绿,30%砾隅,40%晴埂,50% 總?cè)簲?shù) |
蜜源最大開采次數(shù) | 60 |
取值范圍 | (-100,100) |
實(shí)驗(yàn)次數(shù) | 10 |
上圖分別為采蜜蜂上限為10%總數(shù)和50%總數(shù)的情況,可以看出當(dāng)采蜜蜂上限為10%總?cè)簲?shù)時(shí)琅锻,種群收斂的速度較快恼蓬,但是到最后有一個(gè)點(diǎn)死活不動(dòng),這是因?yàn)樵擖c(diǎn)作為一個(gè)蜜源小槐,但由于適應(yīng)度值太差凿跳,使用輪盤賭被選擇到的概率太小從而沒有得到更佳的蜜源位置疮方,而因未開采完骡显,采蜜蜂又不能放棄該蜜源。
看了看采蜜蜂上限為50%總?cè)簲?shù)時(shí)的圖承边,發(fā)現(xiàn)也有幾個(gè)點(diǎn)不動(dòng)的狀態(tài)石挂,可以看出痹愚,這時(shí)不動(dòng)的點(diǎn)的數(shù)量明顯多于上限為10%總數(shù)的圖蛔糯,原因很簡單蚁飒,采蜜蜂太多萝喘,“先富”的人太多阁簸,而“后富”的人較少,沒有帶動(dòng)“后富者”的“先富者”也得不到發(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個(gè)蜜源進(jìn)行搜索筒主。我們將最大迭代次數(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 |
當(dāng)最大迭代次數(shù)為200時(shí)乌妙,人工蜂群算法的結(jié)果如上圖建钥,我們可以明顯的看出熊经,隨著采蜜蜂上限的上升荔睹,算法結(jié)果的精度在不斷的下降,這也印證了之前的結(jié)果,由于蜜源搜索次數(shù)較大(即搜索深度較深)采蜜蜂數(shù)量越多(搜索廣度越多)喜每,結(jié)果的精度越低灼卢。不過影響也不算太大来农,下面我們再來看看蜜源最大開采次數(shù)對結(jié)果的影響沃于。
實(shí)驗(yàn)2:參數(shù)如下
參數(shù) | 值 |
---|---|
問題維度(維度) | 2 |
蜂群數(shù)量(種群數(shù)) | 20 |
迭代次數(shù)(最大迭代次數(shù)) | 200 |
采蜜蜂最大數(shù) | 20% 總?cè)簲?shù) |
蜜源最大開采次數(shù) | 1,2,5,10,20 |
取值范圍 | (-100繁莹,100) |
實(shí)驗(yàn)次數(shù) | 10 |
上圖分別是蜜源開采限度為1,20和4000的實(shí)驗(yàn)咨演。
當(dāng)蜜源開采上限為1時(shí)薄风,即一個(gè)蜜源只能被開采一次,即此時(shí)的人工蜂群算法只有偵查蜂隨機(jī)搜索的過程循诉,沒有觀察蜂跟隨采蜜蜂的過程茄猫,可以看出圖中的蜜蜂一直在不斷的隨機(jī)出現(xiàn)在新位置不會(huì)向某個(gè)點(diǎn)收斂困肩。
當(dāng)蜜源開采上限為20時(shí)锌畸,我們可以看到此時(shí)種群中的蜜蜂都會(huì)向一個(gè)點(diǎn)飛行。在一段時(shí)間內(nèi)芭毙,有數(shù)個(gè)點(diǎn)一動(dòng)不動(dòng)退敦,這些點(diǎn)可能就是采蜜蜂發(fā)現(xiàn)的位置不怎么好的蜜源,但是在幾次迭代之后瓮下,它們?nèi)詴?huì)被觀察蜂開采钝域,從而更新位置例证,蜜源開采上限越高织咧,它們停頓的代數(shù)也會(huì)越長。在所有蜜蜂都收斂于一個(gè)點(diǎn)之后抵屿,我們可以看到仍會(huì)不斷的出現(xiàn)其他的隨機(jī)點(diǎn)捅位,這些點(diǎn)是偵查蜂進(jìn)行隨機(jī)搜索產(chǎn)生的新的蜜源位置艇搀,這些是人工蜂群算法跳出局部最優(yōu)能力的體現(xiàn)。
當(dāng)蜜源開采上限為4000時(shí)姜胖,即不會(huì)出現(xiàn)偵查蜂的搜索過程淀散,觀察蜂只會(huì)開采初始化時(shí)出現(xiàn)的蜜源而不會(huì)采蜜蜂不會(huì)有新的蜜源產(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),當(dāng)蜜源開采上線大于1時(shí)的結(jié)果提升调煎,但是好像開采上限為5時(shí)結(jié)果明顯好于開采次數(shù)上限為其他的結(jié)果士袄,而且隨著開采次數(shù)不斷上升谎僻,結(jié)果在不斷的變差。為什么會(huì)出現(xiàn)這樣的結(jié)果呢艘绍?原因可能還是因?yàn)閱栴}較為簡單赤拒,在5次開采的限度內(nèi),觀察蜂已經(jīng)能找到更好的蜜源進(jìn)行開采诱鞠,當(dāng)問題較為復(fù)雜時(shí)需了,我們無法知曉開采發(fā)現(xiàn)新蜜源的難度,蜜源開采上限應(yīng)該取一個(gè)相對較大的值般甲。當(dāng)蜜源開采限度為4000時(shí),即一個(gè)蜜源不可能被開采完(開采次數(shù)為20(種群數(shù))*200(迭代次數(shù))),搜索的深度有了但是其結(jié)果反而不如開采限度為幾次幾十次來的好,而且這樣不會(huì)有偵查蜂隨機(jī)搜索的過程,失去了跳出局部最優(yōu)的能力肋乍。
我們應(yīng)該如何選擇蜜源的最大開采次數(shù)限制呢?其實(shí)敷存,沒有最佳的開采次數(shù)限制,當(dāng)適應(yīng)度函數(shù)較為簡單時(shí)锚烦,開采次數(shù)較小時(shí)能得到比較好的結(jié)果觅闽,但是適應(yīng)度函數(shù)較復(fù)雜時(shí),經(jīng)過試驗(yàn)涮俄,得出的結(jié)果遠(yuǎn)差于開采次數(shù)較大時(shí)蛉拙。當(dāng)然,前面就說過彻亲,適應(yīng)度函數(shù)是一個(gè)黑盒模型孕锄,我們無法判斷問題的難易。那么我們應(yīng)該選擇一個(gè)適中的值苞尝,個(gè)人的選擇是種群數(shù)的0.5倍到總?cè)簲?shù)的2倍作為蜜源的最大開采次數(shù)畸肆,這樣可以保證極端情況下,1-2個(gè)迭代周期內(nèi)小蜜蜂們能將一個(gè)蜜源開采完宙址。
4. 總結(jié)
人工蜂群算法算是一個(gè)困擾我比較長時(shí)間的算法轴脐,幾年時(shí)間里,我根據(jù)文獻(xiàn)實(shí)現(xiàn)的人工蜂群算法都有數(shù)十種,只能說人工蜂群算法的描述太過模糊大咱,或者說太過抽象恬涧,研究者怎么實(shí)現(xiàn)都說的通。但是通過實(shí)現(xiàn)多次之后發(fā)現(xiàn)雖然實(shí)現(xiàn)細(xì)節(jié)大不相同碴巾,但效果相差不多溯捆,所以我們可以認(rèn)為人工蜂群算法的穩(wěn)定性比較強(qiáng),只要實(shí)現(xiàn)其主要思想即可餐抢,細(xì)節(jié)對于結(jié)果的影響不太大现使。
對于人工蜂群算法影響最大的因素還是蜜源的開采次數(shù)限制,開采次數(shù)限制越大旷痕,對同一蜜源的開發(fā)力度越大碳锈,但是分配給其他蜜源的搜索力度會(huì)相對減少,也會(huì)降低蜂群算法的跳出局部最優(yōu)能力欺抗∈厶迹可以動(dòng)態(tài)修改蜜源的開采次數(shù)限制來實(shí)現(xiàn)對算法的改進(jìn),不過效果不顯著绞呈。
其次對于人工蜂群算法影響是三類蜜蜂的搜索行為贸人,我們可以重新設(shè)計(jì)蜂群的搜索方式來對算法進(jìn)行改進(jìn),比如采蜜蜂在開采蜜源時(shí)是隨機(jī)飛向其他蜜源佃声,而觀察蜂向所選的蜜源靠近艺智。這樣改進(jìn)有一定效果但是在高維問題上效果仍不明顯。
以下指標(biāo)純屬個(gè)人yy,僅供參考
指標(biāo) | 星數(shù) |
---|---|
復(fù)雜度 | ★★★★☆☆☆☆☆☆ |
收斂速度 | ★★★★★★☆☆☆☆ |
全局搜索 | ★★★★★★★★☆☆ |
局部搜索 | ★★★★★☆☆☆☆☆ |
優(yōu)化性能 | ★★★★★★☆☆☆☆ |
跳出局部最優(yōu) | ★★★★★★☆☆☆☆ |
改進(jìn)點(diǎn) | ★★★★★☆☆☆☆☆ |