粒子群アルゴリズムの原理

1粒子群アルゴリズムの概要

粒子群最適化(PSO)は、1995年にEberhart博士とKennedy博士によって提案されました。粒子群アルゴリズムは、鳥の群れの捕食行動をシミュレートすることによって設計された群知能アルゴリズムです。この地域にはさまざまな食料源があります。鳥の群れの仕事は最大の食料源を見つけることであり(グローバルな最適解)、鳥の群れの仕事はこの食料源を見つけることです。検索プロセス全体を通して、鳥の群れはそれぞれの位置情報を相互に通信して、他の鳥に食料源の場所を知らせます。最終的に、鳥の群れ全体が食料源の周りに集まることができます。最適な解決策問題は収束します。自然に触発されて、学者はアリコロニーアルゴリズム、カッコウ探索アルゴリズム、魚群アルゴリズム、狩猟アルゴリズムなど、多くの同様のインテリジェントアルゴリズムを開発しました。

2アルゴリズムの原理

これは、鳥の群れの採餌行動から派生したヒューリスティックアルゴリズムです。現在、鳥の群れがあり、一緒に採餌しようとしています。目標は、実行可能領域で最も豊富な食物を見つけることです。同じWeChatグループチャットで、鳥は見つけた最も豊かな場所を常に共有できます。戦略は次のとおりです:
  1。各鳥はランダムに場所を見つけ、ランダムな方向に始まります。
  2.2。毎分飛行した後、各鳥はグループ内で見つけたものの最適な場所と在庫を共有し、グループが見つけた最適な位置を計算します。
  3.3。各鳥は自分の進路を見直し、移動した最良の位置とグループの最良の位置を包括的に考慮して、次の方向を決定します。
  4.4。全員が同じ場所の近くにいる場合は検索を停止し、そうでない場合は手順2と3を繰り返します。

次の図に示すように、グループ全体の位置が更新され、各赤い点は粒子です:( scikit-optからの画像)

ここに画像の説明を挿入
特定の鳥(パーティクルの1つ)の位置更新方法は次のとおりです。
ここに画像の説明を挿入

3反復式

反復式は非常に単純で明確
です。毎回の速度更新式:
ここに画像の説明を挿入
位置更新式:
ここに画像の説明を挿入
c1、c2-加速定数、最大学習ステップ長
r1、r2を調整します-2つのランダム関数、値の範囲[0,1] 、検索のランダム性を高めるために
w-慣性の重み、非負の数は、解空間の検索範囲を調整します。
場所の長所と短所を判断する方法は?解く必要のある最小化された目的関数は適応度関数と呼ばれ、粒子の位置が適応度関数に取り込まれます。結果が小さいほど良いです。

4アルゴリズムフロー

ここに画像の説明を挿入

5計算例

ここで、簡単な例を示します。1次元の最適化問題を解くための目的関数y = x 2 y = x ^ 2そして=バツ2最小ポイント。
2つのパーティクルを初期化します。位置はx = − 3、x = 2 x = -3、x = 2です。バツ=3 バツ=2、初速度はv = 1、v = − 1 v = 1、v = -1v=1 v=1、計算の便宜上w、c 1、r 1、c 2、r 2 w、c_1、r_1、c_2、r_2w c1r1c2r2パラメータ値は1です。
ここに画像の説明を挿入

6コードの実装

6.1numpyに基づく
import numpy as np 
import random 

# pso  
def suit(x):
    x1, x2=x
    return -(x1-10) ** 2 + -(x2 - 3) ** 2  # + -x3 ** 2

def 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 = 2
current_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_p
global_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.2sko.psoに基づく

python skoライブラリには、一般的に使用されるヒューリスティックアルゴリズムと、直接呼び出すことができる粒子群最適化PSOが含まれています。これは、非常に高速で便利です。

from sko.PSO import PSO
def demo_func(x):
    x1, x2, x3 = x
    return (x1-5) ** 2 + (x2 - 2) ** 2 + (x3-19) ** 2
pso = 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]

支配基準:
[1] J。ケネディとRCエバーハート。「粒子群最適化。」IEEE International Conference on Neural Networks、volume 4、IEEE Press、1995、pp。1942–1948。
[2] scikit_opt

おすすめ

転載: blog.csdn.net/weixin_43705953/article/details/111510906