PSOアルゴリズムは何ですか
粒子群最適化、また、PSOや鳥の採餌アルゴリズム(粒子群最適化、PSO)として知られています。1995年にJ.ケネディとRCエバーハートらによって提示。、だけでなく、ランダムなソリューションから、反復を通じて進化的アルゴリズムの1つに属することは、トレーニングを通して溶液の品質を評価することである最適解を見つけます。
このアルゴリズムは、その簡単な実装、高精度で、高速コンバージェンスの利点は、学術的注目を集め、かつ実用的な問題を解決するには、その優位性を実証しました。
解決プロセス
最適解は、獲物の行動シミュレーションの鳥によって完成されたストライキPSO。
鳥の群れがスペースに食べ物をキャッチすると仮定すると。この領域では、食品の唯一の部分は、(最適解に対応します)。すべての鳥が食べ物を知りません。彼らは、食品自体(距離が適合値最適解により決定される)からのおおよその距離を決定してもよいです。最も簡単で効果的な方法は、最寄りの鳥から現在の食品の周りの領域を探索することです。
PSOは、問題の各ソリューションは、の探索空間である「鳥。」私たちは、「粒子。」それを呼び出します 全ての粒子は、適応機能が最適化される(適合値)によって決定される値、位置自体が完成し、それ自身の最適条件は、人口の位置に収容することができる決定された最も高い粒子を更新します。
つまり、PSOはランダム粒子群を初期化します。反復は、最適解を見つけます。各反復において、粒子の更新は、二つの位置を追跡することによって実現される「極端な」。
1、粒子自体、pbestのpbestのにより見出さ最適解。
2は、最適解の全体の人口は、これまでに世界の極端なgbestのを見つけました。
各粒子は、スピードと呼ばれる重要な属性があり、このプロパティはまた、更新され、更新の距離と方向を決定します。
解空間における現在の最適な粒子探索に従います粒子。
次のように粒子群の擬似コードを解きます。
PSOが初期化されます
ながら反復または最小損失の最大数に達していません。
PSOでeach_p用:
計算フィットネス
粒子は、最適なフィットネスフィットネス履歴(pbestの)よりも高い場合
この値は、新しいpbestのよう設定されています
粒子として全粒子のベストフィット値を選択しgbestの
PSOでeach_p用:
粒子速度は、式(A)に従って計算されます。
式に従って更新粒子の位置(B)
前記式(a)は次のとおりです。
式(b)は次のように:
慣性重量(局所最適解を助けるために)、現在[i]は、pbestの[i]は第i番目の粒子の現在位置であるwの式において、V [i]は、i番目の粒子速度であります履歴最良I粒子、gbestの大域的最適解、RAND()が(1,0)の間の乱数です。C1、C2は、通常、C1 = C2 = 2の学習係数です。
の観点から式(a)の場合:
最適なソリューションを使用して粒子自体の代わりに、彼らのスピードを更新することが判明。
全人口を代表して、現在彼らのスピードを更新するために見つけることが最適な解決策を使用しています。
実装コード無錫婦人科病院http://www.ytsgfk120.com/
これは、2 + 20 * X + 10の最大値の一例である= -x ^ Yの線形方程式を得ます。
NPとしてnumpyのインポート
クラスPSO():
デフ__init __(自己、PN、薄暗い、max_iter、FUNC):
慣性係数self.w = 0.8#
self.c1 = 2#認知因子自体
self.c2 = 2#社会的認知率
self.r1 = 0.6#自分の認知学習率
self.r2 = 0.3#社会的な認知学習率
粒子のPN#のself.pN =数
self.dim = DIM#検索寸法
繰り返しself.max_iter = max_iter#最大数
self.X = np.zeros((self.pN、self.dim))#初期位置及び粒子の速度
self.V = np.zeros((self.pN、self.dim))
self.pbest = np.zeros((self.pN、self.dim)、DTYPE =フロート)#粒子最良のロケーション履歴
self.gbest = np.zeros((1、self.dim)、DTYPE =フロート)#グローバル最適位置
self.p_bestfit = np.zeros(self.pN)#最高の各個人の歴史的価値をフィット
self.fit = -1e15#グローバル最適なフィットネス
self.func = FUNC
デフ機能(自己、X):
リターンself.func(X)
デフ(自己)init_pop:#初期集団を
私の範囲内(self.pN)のために:
#初期位置と各粒子の速度
self.X [I] = np.random.uniform(0,5、[1、self.dim])
self.V [I] = np.random.uniform(0,5、[1、self.dim])
self.pbest [I] = self.X [I]#初期化の歴史最適な位置
self.p_bestfit [I] = self.function得られた(self.X [I])#フィット対応する値
(self.p_bestfit [I]> self.fit)の場合:
self.fit = self.p_bestfit [I]
self.gbest = self.X [I]#グローバル最適を求めます
デフ更新(自己):
フィットネス= []
範囲(self.max_iter)で_について:
iの範囲(self.pN)で:#更新gbestの\ pbestの
TEMP = self.function(self.X [I])#フィットネス値は、現在位置を取得します
最高#更新個人:(TEMP> self.p_bestfit [I])の場合
self.p_bestfit [I] = TEMP
self.pbest [I] = self.X [I]
もし(self.p_bestfit [I]> self.fit):#更新グローバル最適
self.gbest = self.X [I]
self.fit = self.p_bestfit [I]
#更新重み:範囲内のI(self.pN)用
self.V [I] = self.w * self.V [I] + self.c1 * self.r1 *(self.pbest [I] - self.X [i])と+ \
self.c2 * self.r2 *(self.gbest - self.X [I])
self.X [I] = self.X [I] + self.V [I]
fitness.append(self.fit)
リターンself.gbest、self.fit
デフcount_func(X):
Y = -x ** 2 + 20 * X + 10
Yを返します
pso_example = PSO(PN = 50、DIM = 1、max_iter = 300、FUNC = count_func)
pso_example.init_pop()
x_best、fit_best = pso_example.update()
印刷(x_best、fit_best)