标准粒子群优化算法
算法原理
PSO算法思想来源于仿生学的社会认知理论,体现了群智能的特性–即简单的智能个体通过合作产生出复杂的智能行为。目前,PSO算法可以归纳为三个过程,即评价、比较和学习。
评价过程~对粒子当前所处的阶段进行评价,通常是按照特定的适应度函数来评价自身适应度的好坏。类比自然界中有机生命的行为,就是有机生命通过评估周围各种环境激励对自身产生的影响完成对周围环境的学习。
比较过程~指粒子群中的粒子与其他的粒子进行适应度值的比较,以确定学习的方向和动机。
学习过程~粒子通过对自身的评价以及同周围其他粒子的比较产生出模拟其他粒子的行为。
通过这三个过程的有机结合,粒子群优化算法可以适应各种复杂多变的环境,用以解决一些困难的优化问题。
数学模型
在连续空间中,PSO算法的具体描述如下所示:
设
M
是粒子群的种群规模,决策空间有
w 是惯性权值,用来表示粒子对原来速度的保持程度。
c1 是加速因子,用来表示粒子跟踪自身历史最优值的系数。c2 也是加速因子,用来表示当前粒子对全局最优的粒子学习程度的系数。
r1 , r2 是在 [0,1] 范围内的两个随机数。
p 是当前粒子的历史最优值。
g 是全局粒子的历史最优值。
其中
vt−1id
为粒子带第
t−1
次迭代的速度,也就是上一次迭代后的速度。
W
是惯性权值,惯性权值的设置是为了影响粒子的局部搜索能力与全局搜索能力的均衡。主要表示上一代的速度对这一代的速度产生的影响,惯性权值
适应度函数
为了评价当前状态的优越性需要构造一个适应度函数 f(x) , f(x) 用来表示当前状态的好坏。
算法的实现
import random
import copy
birds=int(input('Enter count of bird: '))
xcount=int(input('Enter count of x: '))
pos=[]
speed=[]
bestpos=[]
birdsbestpos=[]
w=0.8
c1=2
c2=2
r1=0.6
r2=0.3
for i in range(birds):
pos.append([])
speed.append([])
bestpos.append([])
def GenerateRandVec(list):
for i in range(xcount):
list.append(random.randrange(1,100))
def CalDis(list):
dis=0.0
for i in list:
dis+=i**2
return dis
for i in range(birds): #initial all birds' pos,speed
GenerateRandVec(pos[i])
GenerateRandVec(speed[i])
bestpos[i]=copy.deepcopy(pos[i])
def FindBirdsMostPos():
best=CalDis(bestpos[0])
index=0
for i in range(birds):
temp=CalDis(bestpos[i])
if temp<best:
best=temp
index=i
return bestpos[index]
birdsbestpos=FindBirdsMostPos() #initial birdsbestpos
def NumMulVec(num,list): #result is in list
for i in range(len(list)):
list[i]*=num
return list
def VecSubVec(list1,list2): #result is in list1
for i in range(len(list1)):
list1[i]-=list2[i]
return list1
def VecAddVec(list1,list2): #result is in list1
for i in range(len(list1)):
list1[i]+=list2[i]
return list1
def UpdateSpeed():
#global speed
for i in range(birds):
temp1=NumMulVec(w,speed[i][:])
temp2=VecSubVec(bestpos[i][:],pos[i])
temp2=NumMulVec(c1*r1,temp2[:])
temp1=VecAddVec(temp1[:],temp2)
temp2=VecSubVec(birdsbestpos[:],pos[i])
temp2=NumMulVec(c2*r2,temp2[:])
speed[i]=VecAddVec(temp1,temp2)
def UpdatePos():
global bestpos,birdsbestpos
for i in range(birds):
VecAddVec(pos[i],speed[i])
if CalDis(pos[i])<CalDis(bestpos[i]):
bestpos[i]=copy.deepcopy(pos[i])
birdsbestpos=FindBirdsMostPos()
for i in range(100):
#print birdsbestpos
#print (CalDis(birdsbestpos))
print (birdsbestpos)
UpdateSpeed()
UpdatePos()
input()
算法的优缺点
标准粒子群优化算法具有的优点:
初始化时限制较少,对问题信息几乎没有什么依赖。
算法的记忆能力,存储最优解的能力较强。
算法的原理简单,实现起来比较容易。
有着很强的群智能算法的特性,粒子群的个体间之共享信息,有利于搜索的进行。
标准粒子群优化算法具有的缺点:
算法的收敛速度过快,导致局部搜索能力不强,直接导致搜索精度不高。
无法保证做到全局搜索,经常在某个局部最优收敛。
参数的选择对算法的性能影响较大,很难调整到最适宜的参数。
通过大量的研究与实验证明,标准粒子群算法存在的主要问题就是容易陷入局部最优。所以实际使用中标准粒子群优化算法很少单独出现,通常是与其他智能算法混合改进以后才使用的。