Python實(shí)現(xiàn)人工蜂群算法的示例代碼
算法簡(jiǎn)介
ABC,即人工蜂群算法(Artificial Bee Colony Algorithm),由Karaboga等人提出。
在ABC中,有三種不同的蜜蜂,即雇傭蜂、跟隨蜂和偵察蜂,這三種蜜蜂的目的都是采蜜,但行為模式并不相同
- 雇傭蜂,一直在采蜜的蜂種,所以與蜜源一一對(duì)應(yīng)。換言之,雇傭蜂的個(gè)數(shù),就是蜜源的個(gè)數(shù)。
- 跟隨蜂,依靠雇傭蜂分享情報(bào)過活,換言之,雇傭蜂會(huì)告訴跟隨蜂一些有關(guān)蜜源的信息,然后跟隨蜂結(jié)合自己的理解找蜜。
- 偵察蜂,沒有任何蜜源的信息,所以像無頭蒼蠅一樣到處亂找。
接下來就將不同峰種的行為邏輯數(shù)學(xué)化,首先要初始化蜜源,而從數(shù)學(xué)上來說,蜜源和雇傭蜂是一回事兒,蜜源在哪、雇傭蜂就在哪;有多少蜜源就有多少雇傭蜂。而蜜蜂的位置,便是待擬合參數(shù),可用向量表示。
其初始化方法就是在搜解范圍內(nèi)設(shè)置隨機(jī)數(shù)
x ? i 便是第i只蜜蜂所對(duì)應(yīng)的向量,xij表示第i只蜜蜂的第j維參數(shù)。N為蜜源數(shù),即雇傭蜂的個(gè)數(shù),也意味著參與競(jìng)爭(zhēng)的解的個(gè)數(shù)。
則雇傭蜂的更新方法為
其中,j,k均為隨機(jī)整數(shù),但k=?j,rij為(−1,1)區(qū)間內(nèi)的隨機(jī)數(shù)。
記跟隨蜂的個(gè)數(shù)為Ns,則其選擇第i個(gè)蜜源的概率為
如果經(jīng)過多次循環(huán)之后并未得到改善,則雇傭蜂變?yōu)閭刹旆?,其位置變?dòng)為
蜂群的Python實(shí)現(xiàn)
首先,要把蜜源表述成一組解。由于在蜂群算法中,蜜源可能會(huì)被拋棄,而拋棄的原因則是這個(gè)蜜源很長(zhǎng)時(shí)間沒有產(chǎn)生更優(yōu)秀的解,所以,在描述蜜源的時(shí)候,除了一組解之外,還要有一個(gè)參數(shù)表示這個(gè)解多久沒有更新了。
所以,用一個(gè)二元組表示蜜源中的單個(gè)解,即[xs, n],其中,xs為當(dāng)前最優(yōu)解,n表示這個(gè)解未更新的次數(shù)。
而生成蜜源的方法則是
import numpy as np uniform = np.random.uniform srcs = [[uniform(xL, xR), 0] for _ in range(nSrc)]
其中,xL和xR為蜜源位置的最大值和最小值,nSrc為蜜源個(gè)數(shù),蜜源個(gè)數(shù),也就意味著雇傭蜂的個(gè)數(shù)。
接下來考慮三種蜜蜂的更新方法,首先考慮雇傭蜂的更新方式
def genX(srcs, index): xs = srcs[index][0] diff = np.delete(np.arange(len(srcs)), index) index = rand.choice(diff) xTest = srcs[index][0] d = randint(0, len(xs) - 1) # 更改的數(shù)據(jù)維度 r = uniform(-1, 1) # 隨機(jī)因子 xNew = np.copy(xs) xNew[d] = xs[d] + r * (xs[d] - xTest[d]) return xNew def leadStep(srcs, func, i): food = srcs[i] xNew = genX(srcs, i) if func(xNew) < func(food[0]): srcs[i] = [xNew, 0] else: food[1] += 1
其中,func為優(yōu)化函數(shù),srcs為所有蜜源,genX實(shí)現(xiàn)的是下面這個(gè)邏輯
接下來實(shí)現(xiàn)跟隨蜂,其行為模式與雇傭蜂高度相似,最大的區(qū)別是在交換信息的時(shí)候不用排除自身,因?yàn)樗械男畔⒍荚诠蛡蚍淠抢铩?/p>
def followStep(srcs, func): indRange = range(len(srcs)) fs = [func(food[0]) for food in srcs] ps = np.array(fs)/np.sum(fs) index = rand.choices(indRange, ps)[0] food = srcs[index] xNew = genX(srcs, index) if func(xNew) < func(food[0]): srcs[index] = [xNew, 0] else: food[1] += 1
最后是偵察蜂,其行為最容易實(shí)現(xiàn)
def spyStep(srcs, maxTrial, xL, xR, i): if srcs[i][1] > maxTrial: srcs[i] = [uniform(xL, xR), 0]
最后,寫一下ABC算法的主流程,ABC算法就算實(shí)現(xiàn)了
def ABC(func, nIter, xL, xR, nPop, perEm=0.5, maxTrial=50): nSrc = round(nPop * perEm) # 雇傭/跟隨蜂數(shù) nSpy = nPop - nSrc # 偵察蜂數(shù) xL, xR = np.array(xL), np.array(xR) srcs = [[uniform(xL, xR), 0] for _ in range(nSrc)] for _ in range(nIter): for i in range(nSrc): leadStep(srcs, func, i) spyStep(srcs, maxTrial, xL, xR, i) for i in range(nSpy): followStep(srcs, func) best = np.argmax([func(food[0]) for food in srcs]) xs = srcs[best][0] msg = "當(dāng)前參數(shù):" + ",".join([f"{x:.5f}" for x in xs]) msg += f"\n 最佳值{test(xs)}" print(msg) return srcs[best][0]
測(cè)試
又到了激動(dòng)人心的測(cè)試環(huán)節(jié),函數(shù)還是用各種三角函數(shù)組成的坑坑洼洼的高維函數(shù)
def test(xs): _sum = 0.0 for i in range(len(xs)): _sum = _sum + np.cos((xs[i]*i)/5)*(i+1) return _sum def main(): xL=np.full(5,-20) xR=np.full(5,20) ABC(test, 49, xL, xR, 30) if __name__ == '__main__': main()
結(jié)果為
>python ab_c.py
當(dāng)前參數(shù):-9.75841,15.18612,-7.31309,-5.40571,43.79218
最佳值-12.342115673734227
以上就是Python實(shí)現(xiàn)人工蜂群算法的示例代碼的詳細(xì)內(nèi)容,更多關(guān)于Python人工蜂群算法的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Django1.11配合uni-app發(fā)起微信支付的實(shí)現(xiàn)
這篇文章主要介紹了Django1.11配合uni-app發(fā)起微信支付的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10Pytorch GPU內(nèi)存占用很高,但是利用率很低如何解決
這篇文章主要介紹了Pytorch GPU內(nèi)存占用很高,但是利用率很低的原因及解決方法,具有很好的參考價(jià)值,希望對(duì)大家 有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06Python操作mysql數(shù)據(jù)庫實(shí)現(xiàn)增刪查改功能的方法
這篇文章主要介紹了Python操作mysql數(shù)據(jù)庫實(shí)現(xiàn)增刪查改功能的方法,涉及Python針對(duì)mysql數(shù)據(jù)庫的連接、增刪改查等相關(guān)操作技巧,需要的朋友可以參考下2018-01-01python實(shí)戰(zhàn)之利用pygame實(shí)現(xiàn)貪吃蛇游戲(一)
這篇文章主要介紹了python實(shí)戰(zhàn)之利用pygame實(shí)現(xiàn)貪吃蛇游戲,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)python的小伙伴們有很好的幫助喲,需要的朋友可以參考下2021-05-05python自動(dòng)化測(cè)試之破解滑動(dòng)驗(yàn)證碼
這篇文章介紹了python自動(dòng)化破解之破解滑動(dòng)驗(yàn)證碼的解決方案,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07