粒子群优化算法的实现


介绍

粒子群优化算法 (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 次浏览

开启你的职业生涯

完成课程获得认证

开始学习
广告