标准粒子群优化算法
算法原理
PSO算法思想来源于仿生学的社会认知理论,体现了群智能的特性–即简单的智能个体通过合作产生出复杂的智能行为。目前,PSO算法可以归纳为三个过程,即评价、比较和学习。
- 评价过程~对粒子当前所处的阶段进行评价,通常是按照特定的适应度函数来评价自身适应度的好坏。类比自然界中有机生命的行为,就是有机生命通过评估周围各种环境激励对自身产生的影响完成对周围环境的学习。
- 比较过程~指粒子群中的粒子与其他的粒子进行适应度值的比较,以确定学习的方向和动机。
- 学习过程~粒子通过对自身的评价以及同周围其他粒子的比较产生出模拟其他粒子的行为。
通过这三个过程的有机结合,粒子群优化算法可以适应各种复杂多变的环境,用以解决一些困难的优化问题。
数学模型
在连续空间中,PSO算法的具体描述如下所示:
设 M 是粒子群的种群规模,决策空间有n维,那么粒子 i 在时刻t在坐标中的位置就可以表示为 Xti=(xti1,xti2,⋯,xtim),i=1,2,⋯,M ,粒子 i 的速度就是每次迭代过程中的位移,用Vti=(vti1,vti2,⋯,vtim)来表示,粒子 i 在时刻t的第 d(d=1,2,3⋯) 维空间中的速度和位置按照如下公式更新:
vtid=wvt−1id+c1r1(pid−xt−1id)+c2r2(gd−xt−1id)xtid=xt−1id+vtidvtid={vmax−vmaxvtid>vmaxvtid<−vmax
- w 是惯性权值,用来表示粒子对原来速度的保持程度。
- c1是加速因子,用来表示粒子跟踪自身历史最优值的系数。
- c2 也是加速因子,用来表示当前粒子对全局最优的粒子学习程度的系数。
- r1 , r2 是在 [0,1] 范围内的两个随机数。
- p 是当前粒子的历史最优值。
- g是全局粒子的历史最优值。
其中 vt−1id 为粒子带第 t−1 次迭代的速度,也就是上一次迭代后的速度。 W 是惯性权值,惯性权值的设置是为了影响粒子的局部搜索能力与全局搜索能力的均衡。主要表示上一代的速度对这一代的速度产生的影响,惯性权值w越大,那么表示上一代的速度对当前影响较大,粒子将很大程度的沿着自身上一代的速度移动。如果惯性权值很小,那么表明粒子受上一代的影响很小,粒子将很大程度的沿着自身学习的速度移动。第二部分 (ptid−xidt) 是粒子对自身的认识,也叫做“认知”部分,可以引导粒子向自身的历史最佳位置移动。所以说这个模型可以不断地促使粒子减小误差。第三部分 (ptg−xtid) 称为“社会知识”,也简称做“社会”部分。“社会”部分是粒子群中的个体相互合作的提现,每个粒子通过共享信息来引导群体中的所有粒子都像全局最优解靠近。
适应度函数
为了评价当前状态的优越性需要构造一个适应度函数 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=
c1=
c2=
r1=
r2=
for i in range(birds):
pos.append([])
speed.append([])
bestpos.append([])
def GenerateRandVec(list):
for i in range(xcount):
list.append(random.randrange(,))
def CalDis(list):
dis=
for i in list:
dis+=i**
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[])
index=
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():
#print birdsbestpos
#print (CalDis(birdsbestpos))
print (birdsbestpos)
UpdateSpeed()
UpdatePos()
input()
算法的优缺点
标准粒子群优化算法具有的优点:
- 初始化时限制较少,对问题信息几乎没有什么依赖。
- 算法的记忆能力,存储最优解的能力较强。
- 算法的原理简单,实现起来比较容易。
- 有着很强的群智能算法的特性,粒子群的个体间之共享信息,有利于搜索的进行。
标准粒子群优化算法具有的缺点:
- 算法的收敛速度过快,导致局部搜索能力不强,直接导致搜索精度不高。
- 无法保证做到全局搜索,经常在某个局部最优收敛。
- 参数的选择对算法的性能影响较大,很难调整到最适宜的参数。
通过大量的研究与实验证明,标准粒子群算法存在的主要问题就是容易陷入局部最优。所以实际使用中标准粒子群优化算法很少单独出现,通常是与其他智能算法混合改进以后才使用的。