粒子群最佳化演算法的實現


介紹

粒子群最佳化演算法 (PSO) 是一種受自然啟發的演算法,基於鳥群或魚群的社會行為,是一種基於種群的搜尋演算法。它模擬了鳥類飛航模式、隊形和群體行為。

粒子群最佳化演算法

在 PSO 演算法中,每個個體都被視為高維搜尋空間中的一個粒子。受人們社會和心理行為的啟發,人們傾向於模仿他人的成功,在特定的搜尋空間中對粒子進行類似的改變。特定粒子在一個特定群體中的變化方式,取決於粒子從其鄰居那裡獲得的知識。換句話說,我們可以說粒子在搜尋空間中的行為受群體中其他粒子的活動影響。因此,PSO 是一種共生行為。因此,由於這種社會傾向和行為,粒子會在機率上傾向於返回到先前成功的搜尋空間。

示例

讓我們看看下面粒子群最佳化演算法的實現。

## Particle Swarm
from __future__ import division
import random
import math
def cost_func(y):
   tot=0
   for i in range(len(y)):
      tot+=y[i]**2
   return tot
class Part:
   def __init__(self,x0):
      self.pos_i=[]
      self.vel_i=[]
      self.position_best_i=[]
      self.error_best_i=-1
      self.error_i=-1
      
      for i in range(0,n_dim):
      self.vel_i.append(random.uniform(-1,1))
      self.pos_i.append(x0[i])
      
   def eval(self,cFunction):
      self.error_i=cFunction(self.pos_i)
      
      if self.error_i < self.error_best_i or self.error_best_i==-1:
         self.position_best_i=self.pos_i
         self.error_best_i=self.error_i
   def upd_vel(self,position_best_g):
      w=0.5
      c1=1
      c2=2
      for i in range(0,n_dim):
         r1=random.random()
         r2=random.random()
         vel_cognitive=c1*r1*(self.position_best_i[i]-self.pos_i[i])
         vel_social=c2*r2*(position_best_g[i]-self.pos_i[i])
         self.vel_i[i]=w*self.vel_i[i]+vel_cognitive+vel_social
   def upd_pos(self,bnds):
      for i in range(0,n_dim):
         self.pos_i[i]=self.pos_i[i]+self.vel_i[i]
         
         if self.pos_i[i]>bnds[i][1]:
            self.pos_i[i]=bnds[i][1]
         if self.pos_i[i] < bnds[i][0]:
            self.pos_i[i]=bnds[i][0]
            
class ParticleSwarmOpt():
   def __init__(self,cFunction,x0,bnds,number_particles,maxiter):
   global n_dim
   n_dim=len(x0)
   err_best_g=-1
   position_best_g=[]
   
   swm=[]
   for i in range(0,number_particles):
      swm.append(Part(x0))
   i=0
   while i < maxiter:
   for j in range(0,number_particles):
      swm[j].eval(cFunction)
      if swm[j].error_i < err_best_g or err_best_g == -1:
         position_best_g=list(swm[j].pos_i)
         err_best_g=float(swm[j].error_i)
   for j in range(0,number_particles):
      swm[j].upd_vel(position_best_g)
      swm[j].upd_pos(bnds)
   i+=1
   
   print('Result:')
   print("Best g : " ,position_best_g)
   print("Best error g: ", err_best_g)
   
init=[5,5]
b =[(-1,10),(-20,20)]
ParticleSwarmOpt(cost_func,init,b,number_particles=15,maxiter=50)

輸出

Result:
Best g: [-7.414272934827646e-06, 3.1121531435141664e-06]
Best error g: 6.465694034080286e-11

結論

粒子群是一種基於鳥類和魚類在社會環境中自然行為的最佳化演算法。

更新於:2023年3月23日

621 次瀏覽

開啟你的職業生涯

完成課程獲得認證

開始學習
廣告