最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python實現(xiàn)人工蜂群算法的示例代碼

 更新時間:2023年08月01日 09:45:16   作者:微小冷  
ABC,即人工蜂群算法(Artificial?Bee?Colony?Algorithm),由Karaboga等人提出,這篇文章主要介紹了人工蜂群算法的概念與Python實現(xiàn),感興趣的可以了解一下

算法簡介

ABC,即人工蜂群算法(Artificial Bee Colony Algorithm),由Karaboga等人提出。

在ABC中,有三種不同的蜜蜂,即雇傭蜂、跟隨蜂和偵察蜂,這三種蜜蜂的目的都是采蜜,但行為模式并不相同

  • 雇傭蜂,一直在采蜜的蜂種,所以與蜜源一一對應。換言之,雇傭蜂的個數(shù),就是蜜源的個數(shù)。
  • 跟隨蜂,依靠雇傭蜂分享情報過活,換言之,雇傭蜂會告訴跟隨蜂一些有關蜜源的信息,然后跟隨蜂結合自己的理解找蜜。
  • 偵察蜂,沒有任何蜜源的信息,所以像無頭蒼蠅一樣到處亂找。

接下來就將不同峰種的行為邏輯數(shù)學化,首先要初始化蜜源,而從數(shù)學上來說,蜜源和雇傭蜂是一回事兒,蜜源在哪、雇傭蜂就在哪;有多少蜜源就有多少雇傭蜂。而蜜蜂的位置,便是待擬合參數(shù),可用向量表示。

其初始化方法就是在搜解范圍內設置隨機數(shù)

x ? i 便是第i只蜜蜂所對應的向量,xij表示第i只蜜蜂的第j維參數(shù)。N為蜜源數(shù),即雇傭蜂的個數(shù),也意味著參與競爭的解的個數(shù)。

則雇傭蜂的更新方法為

其中,j,k均為隨機整數(shù),但k=?j,rij為(−1,1)區(qū)間內的隨機數(shù)。

記跟隨蜂的個數(shù)為Ns,則其選擇第i個蜜源的概率為

如果經(jīng)過多次循環(huán)之后并未得到改善,則雇傭蜂變?yōu)閭刹旆?,其位置變動?/p>

蜂群的Python實現(xiàn)

首先,要把蜜源表述成一組解。由于在蜂群算法中,蜜源可能會被拋棄,而拋棄的原因則是這個蜜源很長時間沒有產生更優(yōu)秀的解,所以,在描述蜜源的時候,除了一組解之外,還要有一個參數(shù)表示這個解多久沒有更新了。

所以,用一個二元組表示蜜源中的單個解,即[xs, n],其中,xs為當前最優(yōu)解,n表示這個解未更新的次數(shù)。

而生成蜜源的方法則是

import numpy as np
uniform = np.random.uniform
srcs = [[uniform(xL, xR), 0] for _ in range(nSrc)]

其中,xL和xR為蜜源位置的最大值和最小值,nSrc為蜜源個數(shù),蜜源個數(shù),也就意味著雇傭蜂的個數(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)              # 隨機因子
    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實現(xiàn)的是下面這個邏輯

接下來實現(xiàn)跟隨蜂,其行為模式與雇傭蜂高度相似,最大的區(qū)別是在交換信息的時候不用排除自身,因為所有的信息都在雇傭蜂那里。

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

最后是偵察蜂,其行為最容易實現(xiàn)

def spyStep(srcs, maxTrial, xL, xR, i):
    if srcs[i][1] > maxTrial:
        srcs[i] = [uniform(xL, xR), 0]

最后,寫一下ABC算法的主流程,ABC算法就算實現(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 = "當前參數(shù):" + ",".join([f"{x:.5f}" for x in xs])
    msg += f"\n 最佳值{test(xs)}"
    print(msg)
    return srcs[best][0]

測試

又到了激動人心的測試環(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()

結果為

>python ab_c.py 
當前參數(shù):-9.75841,15.18612,-7.31309,-5.40571,43.79218
最佳值-12.342115673734227

以上就是Python實現(xiàn)人工蜂群算法的示例代碼的詳細內容,更多關于Python人工蜂群算法的資料請關注腳本之家其它相關文章!

相關文章

  • python腳本后臺執(zhí)行方式

    python腳本后臺執(zhí)行方式

    今天小編就為大家分享一篇python腳本后臺執(zhí)行方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • Python解決八皇后問題示例

    Python解決八皇后問題示例

    這篇文章主要介紹了Python解決八皇后問題,簡單描述了八皇后問題的原理并結合實例形式分析了Python基于遞歸算法解決八皇后問題的相關操作技巧,需要的朋友可以參考下
    2018-04-04
  • flask上使用websocket的方法示例

    flask上使用websocket的方法示例

    本文主要介紹了flask上使用websocket的方法示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-06-06
  • Flask框架路由和視圖用法實例分析

    Flask框架路由和視圖用法實例分析

    這篇文章主要介紹了Flask框架路由和視圖用法,結合實例形式分析了Flask路由和視圖相關原理、定義與使用方法,需要的朋友可以參考下
    2019-11-11
  • PyMySQL實現(xiàn)增刪查改的簡單使用

    PyMySQL實現(xiàn)增刪查改的簡單使用

    這篇文章主要介紹了PyMySQL實現(xiàn)增刪查改的簡單使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-05-05
  • 關于Python使用turtle庫畫任意圖的問題

    關于Python使用turtle庫畫任意圖的問題

    這篇文章主要介紹了Python turtle庫畫任意圖,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-04-04
  • 學習python的幾條建議分享

    學習python的幾條建議分享

    熟悉python語言,以及學會python的編碼方式。熟悉python庫,遇到開發(fā)任務的時候知道如何去找對應的模塊。知道如何查找和獲取第三方的python庫,以應付開發(fā)任務
    2013-02-02
  • 詳解pytorch中squeeze()和unsqueeze()函數(shù)介紹

    詳解pytorch中squeeze()和unsqueeze()函數(shù)介紹

    這篇文章主要介紹了詳解pytorch中squeeze()和unsqueeze()函數(shù)介紹,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-09-09
  • python實現(xiàn)數(shù)據(jù)預處理之填充缺失值的示例

    python實現(xiàn)數(shù)據(jù)預處理之填充缺失值的示例

    下面小編就為大家分享一篇python實現(xiàn)數(shù)據(jù)預處理之填充缺失值的示例。具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-12-12
  • Python中Namespace()函數(shù)詳解

    Python中Namespace()函數(shù)詳解

    Namespace是argparse模塊提供的一個類,用于創(chuàng)建命名空間對象,它允許通過點操作符訪問數(shù)據(jù),比字典更易讀,在深度學習項目中常用于加載配置、命令行參數(shù)和超參數(shù),本文介紹Python中Namespace()函數(shù),感興趣的朋友跟隨小編一起看看吧
    2025-11-11

最新評論

东莞市| 丹寨县| 鄂尔多斯市| 漳州市| 顺义区| 上栗县| 斗六市| 宁安市| 贵溪市| 樟树市| 陵川县| 成武县| 丰都县| 延边| 平武县| 青神县| 张家界市| 台东市| 长顺县| 阜康市| 区。| 胶南市| 寿阳县| 永丰县| 上饶县| 习水县| 宁武县| 宁阳县| 道孚县| 富川| 海林市| 嘉鱼县| 临漳县| 江达县| 绥德县| 馆陶县| 凌云县| 鲁甸县| 禄丰县| 旬阳县| 巧家县|