<form id="dlljd"></form>
        <address id="dlljd"><address id="dlljd"><listing id="dlljd"></listing></address></address>

        <em id="dlljd"><form id="dlljd"></form></em>

          <address id="dlljd"></address>
            <noframes id="dlljd">

              聯系我們 - 廣告服務 - 聯系電話:
              您的當前位置: > 關注 > > 正文

              粒子群算法原理 基于numpy6.2的粒子群算法詳解

              來源:CSDN 時間:2023-02-09 07:53:10

              目錄

              1粒子群算法簡介2算法原理3迭代公式4算法流程5實例計算6代碼實現6.1 基于numpy6.2 基于sko.pso


              (資料圖片)

              1粒子群算法簡介

              粒子群算法(Particle Swarm Optimization,簡稱PSO)是1995年Eberhart博士和Kennedy博士一起提出的。粒子群算法是通過模擬鳥群捕食行為設計的一種群智能算法。區域內有大大小小不同的食物源,鳥群的任務是找到最大的食物源(全局最優解),鳥群的任務是找到這個食物源。鳥群在整個搜尋的過程中,通過相互傳遞各自位置的信息,讓其他的鳥知道食物源的位置最終,整個鳥群都能聚集在食物源周圍,即我們所說的找到了最優解,問題收斂。學者受自然界的啟發開發了諸多類似智能算法,如蟻群算法、布谷鳥搜索算法、魚群算法、捕獵算法等等。

              2算法原理

              這是一個根據鳥群覓食行為衍生出啟發式的算法,現在有一群鳥,他們一起出發覓食,目標就是找到可行域食物最豐富的位置。小鳥們在同一個微信群聊中,可以不斷共享自己找到的事物最豐富的地方。策略如下:

              1. 每只鳥隨機找一個地方,按照一個隨機的方向出發。

              2. 每飛一分鐘后, 每只鳥將自己找到的最優地點以及事物存量共享到群里,然后計算出群體找到的最優位置。

              3. 每只鳥回顧自己的路徑,綜合考慮自己走過的最優的位置和群體最優位置決定下一步的方向。

              4. 如果大家都到了同一個地方附近,就停止尋找,否則重復2 ,3 步。

              整個群體的位置更新如下圖,每一個紅點即一個粒子: (圖片來自 scikit-opt)

              而某一只鳥(其中一個粒子)的位置更新方法如下圖:

              3迭代公式

              迭代公式非常簡單明了 每一次的速度更新公式: 位置更新公式: c1,c2-加速常數,調節學習最大步長 r1,r2-兩個隨機函數,取值范圍[0,1],以增加搜索隨機性 w-慣性權重,非負數,調節對解空間的搜索范圍。 那怎么判斷一個位置的優劣呢? 需要求解的最小化目標函數稱為適應度函數, 將粒子的位置帶入適應度函數,結果越小越優。

              4算法流程

              5實例計算

              現在我們舉一個簡單的例子, 求解一維優化問題計算的目標函數 y = x 2 y=x^2 y=x2的最小值點。 初始化兩個粒子,位置分別是 x = ? 3 , x = 2 x = -3, x =2 x=?3,x=2, 初始速度為 v = 1 , v = ? 1 v=1 , v=-1 v=1,v=?1 ,為了計算簡便 w , c 1 , r 1 , c 2 , r 2 w,c_1,r_1,c_2,r_2 w,c1,r1,c2,r2參數值取1.

              6代碼實現

              6.1 基于numpy

              import numpy as np import random # pso  def suit(x):    x1, x2=x    return -(x1-10) ** 2 + -(x2 - 3) ** 2  # + -x3 ** 2def best_p(current_p,person_best): #      x = np.zeros_like(current_p)     n,d = current_p.shape    for i in range(n):# 每個粒子比較一次        a = current_p[i]        b = person_best[i]        if suit(b)>suit(a):            x[i] = b        else: x[i]= a    return x         def global_b(person_best): # n*d     n,d= person_best.shape     s = []    for j in range(n):        s.append(suit(person_best[j]))            i = np.array(s).argmax()    x = np.array(person_best[i])    return x         # init  n = 40 # 粒子個數d = 2current_v =  np.array([[random.randint(1, 100) for i in range(n)]]).reshape(-1,d)current_p = np.array([[random.randint(1, 100) for i in range(n)]]).reshape(-1,d)person_best = current_pglobal_best = global_b(person_best)  T = 0   w=1   while  T<100000:            # if  all([current_p[i][0]==current_p[0][0] for i in range(len(current_p))]):    #     print(T,current_p)    #     break    if sum(person_best.std(axis=0))<.1:        break            else:            w = w*0.99996;r1 = random.random(); r2 = random.random()        current_v = w*current_v + r1*(person_best-current_p)+ r1*(global_best - current_p)        #  w = w*0.999        # current_v = w*current_v +(person_best-current_p)+(global_best - current_p)        current_p = current_p + current_v        person_best =  best_p(current_p, person_best)        global_best = global_b(person_best)         #current_v = current_v + 2* (person_best- current_p)+2*(global_best- current_p)        T+=1 print(T, person_best)

              6.2 基于sko.pso

              python sko庫中包含了常用的啟發式算法, 也包含粒子群算法PSO,可以直接調用,非??旖莘奖?。

              from sko.PSO import PSOdef demo_func(x):    x1, x2, x3 = x    return (x1-5) ** 2 + (x2 - 2) ** 2 + (x3-19) ** 2pso = PSO(func=demo_func, dim=3)fitness = pso.fit()print("best_x is ", pso.gbest_x, "best_y is", pso.gbest_y) >>>best_x is  [ 4.99981675  2.00044853 18.99955148] best_y is [4.35931123e-07]

              責任編輯:

              標簽:

              相關推薦:

              精彩放送:

              新聞聚焦
              Top 中文字幕在线观看亚洲日韩