一、背景知识
粒子群算法(Particle Swarm Optimization,PSO)由Kennedy和Eberhart于1995年提出。该算法的思想来源于对鸟类捕食行为的研究,鸟之间通过集体的协作使得群体能够找到最多的食物,PSO便是通过模拟鸟群飞行觅食的行为,来寻找最优解的算法,这是一种基于群体智能(Swarm Intelligence)的优化方法。
二、算法原理
在粒子群优化算法中,目标空间中的每个解都可以用一只鸟(粒子)表示,问题中的需求解就是鸟群所要寻找的食物源。在寻找最优解的过程中,每个粒子都存在个体行为和群体行为。每个粒子都会学习同伴的飞行经验和借鉴自己的飞行经验去寻找最优解。每个粒子都会向两个值学习,一个值是个体的历史最优值 pbest ;另一个值是群体的历史最优值(全局最优值)gbest 。粒子会根据这两个值来调整自身的速度和位置,而每个位置的优劣都是根据适应度值来确定的。适应度函数是优化的目标函数。
(1)粒子和速度初始化
在一个D维的目标搜索空间中,由N个粒子组成一个粒子群,其中每个粒子都是一个D维向量,其空间位置可以表示为
xi=(xi1,xi2,⋯,xiD),i=1,2,⋯,N
粒子的空间位置是目标优化问题中的一个解,将其代入适应度函数可以计算出适应度值,根据适应度值的大小衡量粒子的优劣。
第i个粒子的飞行速度也是一个D维向量,记为
vi=(vi1,vi2,⋯,viD),i=1,2,⋯,N
粒子的位置和速度均值都在给定的范围内随机生成。
(2)个体历史最优值和全局最优值
第i个粒子经历过的具有最优适应度值的位置称为个体历史最优位置,记为
pbesti=(pbesti1,pbesti2,⋯,pbestiD),i=1,2,⋯,N
整个粒子群经历过的最优位置称为全局历史最优位置,记为
gbesti=(gbesti1,gbesti2,⋯,gbestiD),i=1,2,⋯,N
(3)粒子群的速度和位置更新(包含改进算法)
粒子群的位置更新操作可用速度更新和位置更新表示。
速度更新为
vij(t+1)=vij(t)+c1r1(pbestij(t)−xij(t))+c2r2(gbestj−xij(t))
位置更新为
xij(t+1)=xij(t)+vij(t+1)
其中,下标j表示粒子的第j维,下标i表示第i个粒子,t表示当前迭代次数,c1与c2均加速常量,通常在区间(0,2)内取值,r1与r2为两个相互独立的取值范围在[0,1]的随机数。从上述方程可以看出,c1与c2将粒子向个体学习和向群体学习联合起来,使得粒子能够借鉴体自身的搜索经验和群体的搜索经验。
这里,对位置更新函数进行改进,其位置更新为
xi=(xi+vi)+(0.2*(0.92*(MaxDT-t)/MaxDT))*rand*(Xmax+rand(1,D)*(Xmin-Xmax))
其中,MaxDT表示最大迭代次数,rand为取值范围在[0,1]的随机数,Xmin和Xmax为粒子的边界值
三、算法流程
Step1:初始化算法参数,种群数量,粒子群初始速度,参数c1与c2,设置位置边界范围与速度边界范围。
Step2:根据适应度函数计算适应度值,记录历史最优值pbest与全局最优值gbest。
Step3:利用速度更新公式vij(t+1)=vij(t)+c1r1(pbestij(t)−xij(t))+c2r2(gbestj−xij(t))对粒子群的速度进行更新,并对越界的速度进行约束。
Step4:利用位置更新公式xij(t+1)=xij(t)+vij(t+1)对粒子群的位置进行更新,并对越界的位置进行约束。
Step5:根据适应度函数计算适应度值。
Step6:对于每个粒子,将其适应度值与它的历史最优适应度值相比较,若更好,则将作为历史最优值pbest。
步骤7:对于每个粒子,比较其适应度值和群体所经历的最优位置的适应度值,若更好,将其作为全局最优值 pbest
步骤8:判断是否达到结束条件(达到最大达代次数),若达到,则输出最优位置,否则复步骤3~8。
四、实验结果
PSO函数的全局最优位置为:
【3.116660670268535 -17.820327635215044 16.359500883324721 -6.033198010894432 -20.960219037649068 7.672757538160392 8.352534471072905 -26.160470485536841 -9.346461058941959 19.761073715019752】
最后得到的优化极值为: 0.616863247090951
函数的全局最优位置为:
【0.123848497208123 4.137294110075580 0.252310579667478 -0.039675000950534 6.845668034956812 -0.06209910254485 -16.182595600460719 -9.796536342806320 0.55442529756452 -10.149094625066146】
最后得到的优化极值为: 0.254795814983275