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

Python實現(xiàn)粒子群算法詳解

 更新時間:2023年07月27日 10:31:01   作者:微小冷  
這篇文章主要介紹了Python實現(xiàn)粒子群算法詳解,粒子群算法,縮寫為PSO(Particle Swarm Optimization),是一種非線性尋優(yōu)算法,其特點是實現(xiàn)簡單、收斂速度快,對多元函數(shù)的局部最優(yōu)有較好的克服能力,需要的朋友可以參考下

算法原理

粒子群算法,縮寫為PSO(Particle Swarm Optimization),是一種非線性尋優(yōu)算法,其特點是實現(xiàn)簡單、收斂速度快,對多元函數(shù)的局部最優(yōu)有較好的克服能力。

Python實現(xiàn)

首先,需要創(chuàng)建一個類或者字典來表示粒子,這里用類來實現(xiàn)

import numpy as np
uniRand = np.random.uniform
class Particle:
    def __init__(self, N, xRange, vRange):
        # 生成(N)維參數(shù)
        self.x = uniRand(*xRange, (N,))
        self.v = uniRand(*vRange, (N,))
        self.best = np.inf
        self.xBest = np.zeros((N,))

接下來實現(xiàn)粒子群,粒子群無非是多個粒子,所以要有一個存放粒子的列表。故其初始化函數(shù)如下,其中bestxBest分別存放全局最優(yōu)解和全局最優(yōu)參數(shù)。

from copy import deepcopy
rand = np.random.rand
class Swarm:
    # pNum 粒子個數(shù),N粒子維度,即參數(shù)個數(shù)
    # wRange 最大最小權(quán)重
    def __init__(self, pNum, N, xRange, vRange, wRange, c):
        self.ps = [Particle(N, xRange, vRange) for _ in range(pNum)]
        self.bestPs = deepcopy(self.ps)
        self.best = np.inf  #全局最優(yōu)值
        self.xBest = np.zeros((N,)) #全局最優(yōu)參數(shù)
        self.wRange = wRange
        self.c0, self.c1 = c
        self.N = N

然后將參數(shù)更新的規(guī)則封入一個函數(shù)中,這里包括三個內(nèi)容的更新,

首先是從當(dāng)前計算結(jié)果中,挑選出最優(yōu)結(jié)果,作為新的全局最優(yōu)值;

然后針對單個粒子,更新粒子的歷史最優(yōu)值;

最后,也是最復(fù)雜的一步,即更新每個粒子的速度和位置。

在寫好單步更新函數(shù)之后,將其寫入循環(huán)中,就是粒子群算法的主干了,代碼如下。

# 下面的函數(shù)寫在class Swarm中
# 為了書寫方便,這里頂個寫,注意在Swarm中的縮進
    # 參數(shù)更新 func為待優(yōu)化函數(shù)
def oneStep(self, func, w=1):
    for p in self.ps:
        y = func(p.x)
        # 更新歷史最優(yōu)值
        if y < p.best:
            p.best = y
            p.xBest = deepcopy(p.x)
        # 更新粒子群最優(yōu)情況
        if y < self.best:
            self.best = y
            self.xBest = deepcopy(p.x)
            self.bestPs = deepcopy(self.ps)
    for p in self.ps:
        iw = uniRand(*self.wRange, 1)[0]
        us = self.c0 * rand(self.N) * (p.xBest - p.x)
        vs = self.c1 * rand(self.N) * (self.xBest - p.x)
        p.v = iw * p.v + us + vs
        p.x = p.x + p.v
    return self.best
# nMsg為輸出提示的周期
# iter為迭代次數(shù)
def optimize(self, func, nMsg, iter):
    for i in range(iter):
        best = self.oneStep()
        if i % nMsg == 0:
            print(f"第{i}次迭代最小值為{best}")

得益于pyhton的函數(shù)式特性,可以方便地將函數(shù)作為參數(shù)傳入,從而在優(yōu)化函數(shù)optimize中,直接把被優(yōu)化的函數(shù)func用作輸入?yún)?shù)。

算法測試

最后,代碼寫好之后,可以測試一下,假設(shè)現(xiàn)有一個比較復(fù)雜的多元函數(shù),其中 Xi為不同維度的參數(shù),令 i = 1..10 i=1..10 i=1..10,即下面是一個10元函數(shù)。

測試代碼寫為

def test(xs):
    s = 0.0
    for i in range(len(xs)):
        s += np.cos(i*xs[i]/5)*(i+1)
    return s
if __name__ == "__main__":
    xRange = (-3,3)
    vRange = (-1,1)
    wRange = (0.5,1)
    C = (1.5, 1.5)
    s = Swarm(20, 10, xRange, vRange, wRange, C)
    s.optimize(test, 20, 200)
    print("最佳位置在:\n", s.xBest)

測試結(jié)果為

第1次迭代最小值為-29.665606552469008
第21次迭代最小值為-36.351923008184464
第41次迭代最小值為-47.14461157300818
第61次迭代最小值為-52.25291216470125
第81次迭代最小值為-52.964363058825406
第101次迭代最小值為-52.99124052250346
第121次迭代最小值為-52.99966161164592
第141次迭代最小值為-52.99990804268494
第161次迭代最小值為-52.99997494166753
第181次迭代最小值為-52.9999871143357
最佳位置在:
[ 28.01165182 -15.70858655   7.85375734   5.23563916  -3.92708994
  -3.14138732  -2.61760754   2.24427198   5.89048506  -1.74515961]

可見其收斂速度還是很快的。

到此這篇關(guān)于Python實現(xiàn)粒子群算法詳解的文章就介紹到這了,更多相關(guān)Python粒子群算法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python入門教程之Python的安裝下載配置

    Python入門教程之Python的安裝下載配置

    這篇文章主要介紹了Python入門教程之Python的安裝下載配置,Python是一門非常強大好用的語言,也有著易上手的特性,本文為入門教程,需要的朋友可以參考下
    2023-04-04
  • Python正則表達(dá)中re模塊的使用

    Python正則表達(dá)中re模塊的使用

    這篇文章主要介紹了Python正則表達(dá)中re模塊的使用,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的朋友可以參考一下
    2022-09-09
  • python套接字流重定向?qū)嵗齾R總

    python套接字流重定向?qū)嵗齾R總

    套接字是一種具有之前所說的“通信端點”概念的計算網(wǎng)絡(luò)數(shù)據(jù)結(jié)構(gòu)。相當(dāng)于電話插口,沒它無法通信,這個比喻非常形象。今天我們就來匯總一下套接字流重定向的實例
    2016-03-03
  • python for和else語句趣談

    python for和else語句趣談

    這篇文章主要介紹了python for和else語句趣談,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-07-07
  • wxpython學(xué)習(xí)筆記(推薦查看)

    wxpython學(xué)習(xí)筆記(推薦查看)

    wxPython是Python編程語言的一個GUI工具箱。他使得Python程序員能夠輕松的創(chuàng)建具有健壯、功能強大的圖形用戶界面的程序
    2014-06-06
  • Python同時迭代多個序列的方法

    Python同時迭代多個序列的方法

    這篇文章主要介紹了Python同時迭代多個序列的方法,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • python寫日志封裝類實例

    python寫日志封裝類實例

    這篇文章主要介紹了python寫日志封裝類,實例分析了Python操作日志的相關(guān)技巧,需要的朋友可以參考下
    2015-06-06
  • 使用Python和Prometheus跟蹤天氣的使用方法

    使用Python和Prometheus跟蹤天氣的使用方法

    這篇文章主要介紹了使用Python和Prometheus跟蹤天氣的使用方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-05-05
  • 用pycharm開發(fā)django項目示例代碼

    用pycharm開發(fā)django項目示例代碼

    這篇文章主要介紹了用pycharm開發(fā)django項目示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • Python實現(xiàn)視頻下載功能

    Python實現(xiàn)視頻下載功能

    最近一兩年短視頻業(yè)務(wù)風(fēng)生水起,各個視頻網(wǎng)站都有各自特色的短視頻內(nèi)容。如果有一個程序可以把各大視頻網(wǎng)站的熱門用戶最新發(fā)布的視頻下載下來,不僅方便了觀看,還可以將沒有版權(quán)的視頻發(fā)布在個人社交網(wǎng)站上,增加自己的人氣,多好呀
    2017-03-03

最新評論

堆龙德庆县| 镇平县| 马山县| 阿荣旗| 盐津县| 广饶县| 合水县| 鄢陵县| 宜兰县| 通许县| 明星| 岳池县| 凌海市| 大新县| 花莲市| 新丰县| 张掖市| 韶山市| 伊金霍洛旗| 韩城市| 图们市| 泾源县| 霍山县| 遵义市| 元阳县| 巴林右旗| 镇平县| 仁寿县| 郁南县| 邻水| 民丰县| 临洮县| 鄯善县| 镇安县| 娱乐| 民和| 乌兰察布市| 淳安县| 保康县| 永定县| 余江县|