溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

粒子群優(yōu)化算法(PSO)python實現

發(fā)布時間:2020-07-25 10:00:03 來源:網絡 閱讀:4361 作者:nineteens 欄目:編程語言

  粒子群算法屬于智慧算法的一類,與該類算法類似的還有蟻群算法,遺傳算法等。大家可以將這幾種算法進行比較。

  粒子群優(yōu)化算法(Particle Swarm Optimization,PSO)屬于進化算法的一種,是通過模擬鳥群捕食行為設計的。從隨機解出發(fā),通過迭代尋找最優(yōu)解,通過適應度來評價解的品質。在這里,我們舉一個例子來深入理解一下該算法:假設有一鳥群,在一座島上某個地方放有食物,但是鳥群并不知道食物在哪,只是知道與食物之間的距離。這時候鳥兒們很聰明,它們在目前距離食物最近的鳥的周圍搜索。

  所有的粒子具有一下兩個屬性:

  位置v

  速度x

  PSO初始化為一群隨機粒子(隨機解),然后通過迭代找到最優(yōu)解。在每一次迭代種,粒子通過跟蹤兩個“極值”來跟新自己。第一個就是粒子本身所找到的最優(yōu)解pbest;另一個極值是整個種群目前找到的最優(yōu)解,及全局極值gbest。粒子通過下面的公式來更新自己速度和位置:

  速度變換公式:

  vi+1=w?vi+c1?rand1?(pbesti?xi)+c2?rand2?(gbesti?xi)v_{i+1}=w*v_i+c_1*rand_1*(pbest_i-x_i)+c_2*rand_2*(gbest_i-x_i)vi+1=w?vi+c1?rand1?(pbesti?xi)+c2?rand2?(gbesti?xi)

  位置變換公式:

  xi=xi+vi+1x_i=x_i+v_{i+1}xi=xi+vi+1

  以上式子中:

  w為慣性因子,一般取1

  c1,c2c_1,c_2c1,c2為學習因子,一般取2

  rand1,rand2rand_1,rand_2rand1,rand2為(0,1)之間的隨機數

  vi和xiv_i和x_ivi和xi分別表示粒子第i維的速度和位置

  pbesti,,gbestipbest_i,,gbest_ipbesti,,gbesti分別表示某個粒子最好位置第i維的值,整個種群最好位置第i維的值

  注意:以上兩式是針對粒子的某一個維度進行跟新的。對粒子的每一維,都要用上述的式子進行更新。

  流程圖如下:

  

粒子群優(yōu)化算法(PSO)python實現


  # coding: utf-8

  import numpy as np

  import random

  import matplotlib.pyplot as plt

  class PSO():

  # PSO參數設置

  def __init__(self, pN, dim, max_iter):

  self.w = 0.8

  self.c1 = 2

  self.c2 = 2

  self.r1 = 0.6

  self.r2 = 0.3

  self.pN = 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)) # 個體經歷的最佳位置和全局最佳位置

  self.gbest = np.zeros((1, self.dim))

  self.p_fit = np.zeros(self.pN) # 每個個體的歷史最佳適應值

  self.fit = 1e10 # 全局最佳適應值

  #目標函數Sphere函數

  def function(self, X):

  return X**4-2*X+3

  #初始化種群

  def init_Population(self):

  for i in range(self.pN):

  for j in range(self.dim):

  self.X[i][j] = random.uniform(0, 1)

  self.V[i][j] = random.uniform(0, 1)

  self.pbest[i] = self.X[i]

  tmp = self.function(self.X[i])

  self.p_fit[i] = tmp

  if tmp < self.fit:

  self.fit = tmp

  self.gbest = self.X[i]

  # 更新粒子位置

  def iterator(self):

  fitness = []無錫×××醫(yī)院 https://yyk.familydoctor.com.cn/20612/

  for t in range(self.max_iter):

  for i in range(self.pN): # 更新gbest\pbest

  temp = self.function(self.X[i])

  if temp < self.p_fit[i]: # 更新個體最優(yōu)

  self.p_fit[i] = temp

  self.pbest[i] = self.X[i]

  if self.p_fit[i] < self.fit: # 更新全局最優(yōu)

  self.gbest = self.X[i]

  self.fit = self.p_fit[i]

  for i in range(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)

  print(self.X[0], end=" ")

  print(self.fit) # 輸出最優(yōu)值

  return fitness

  加入下列代碼驗證結果:

  #程序

  my_pso = PSO(pN=30, dim=1, max_iter=100)

  my_pso.init_Population()

  fitness = my_pso.iterator()

  # 畫圖

  plt.figure(1)

  plt.title("Figure1")

  plt.xlabel("iterators", size=14)

  plt.ylabel("fitness", size=14)

  t = np.array([t for t in range(0, 100)])

  fitness = np.array(fitness)

  plt.plot(t, fitness, color='b', linewidth=3)

  plt.show()

  在上面我們計算X4?2X+3X^4-2X+3X4?2X+3的優(yōu)化函數。

  得出結果:

  1.迭代圖像

  2.迭代最后的結果可以看出來在x取0.1937左右,X4?2X+3X^4-2X+3X4?2X+3取得較優(yōu)值


向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI