粒子群PSO算法的基本原理
PSO原理
先看两个概述:
1.
2.
好了,进入主题:
PSO算法是基于群体智能理论的优化算法,群体中的粒子在每次迭代搜索的过程中,通过跟踪群体2个极值:粒子本身所找到的最优解Pbest和群体找到的最优解Gbest来动态调整自己位置和速度[5, 6],完成对问题寻优,对于如下的函数优化问题
maxf(x1,x2,…,xn)
s. t R1j≤xj≤R2j, j=1,2,…,n(1)
其计算步骤如下[1]:
(1)对粒子群中粒子的位置和速度进行随机初始化。设定群体的规模为N,则随机生成如下矩阵
x11x12…x1nv11v12…v1n
x21x22…x2nv21v22…v2n
… … … … … … … …
xN1xN2…xNnvN1vN2…vNn
, (2)
其中{xij, i=1,2,…,N, j=1,2,…,n}表示群体中i粒子的位置为j,vij是对应它的速度,二者均为区间[R1j,R2j]上均匀分布的随机数。
(2)计算每个粒子的适应度(目标函数值)。
(3)计算粒子所经历的最好位置pbesti(t)=(xi1,xi2,…,xim),也就是粒子所经历过的具有最好适应度的位置,由下面两个式子确定
pbesti(t+1)= pbesti(t) 如果f(x1(t+1),x2(t+1),…,xn(t+1))<pbesti(t)),
pbesti(t+1)= xi(t+1) 如果f(x1(t+1),x2(t+1),…,xn(t+1))≥pbesti(t)). (3)
计算群体中所有粒子经历过最好位置,即全局最好位置
Gbesti(t)=maxf(Pbest1(t)), f(Pbest2(t)),…, f(PbestN(t)) , (4)
(4)依据下式对粒子的速度和位置进行进化
vij(t+1)=vij+c1r1(Pbesti(t)-xij(t))+c2r2(Gbesti(t)-xij(t)), (5)
其中c1,2为加速度常数(学习速率), r1,2为[0,1]均匀分布的随机数。
(5)判断结束条件,目标函数的适应度达到足够好或者进化到预先设定的代数,否则返回步骤(2),继续进行。
3用MATLAB实现粒子群算法
MATLAB是MathWorks公司的产品,是一个功能强大的科学与工程计算软件,集成了计算、可视化和程序编制等功能,其使用直观、简洁并符合人们思维习惯的代码给用户提供了一个友好的开发环境[9, 10],利用MATLAB矩阵运算的强大功能编写粒子群算法程序有很好的优势。
3. 1粒子群的初始化
initpop函数的功能是实现群体的初始化, popsize表示群体的大小, dimsize表示粒子维数,它由变量的维数决定, xmin是变量的下限, xmax是变量的上限。
function pop=initpop(popsize, dimsize)
pop=unifrnd(xmin, xmax, popsize, 2* dimSize);
3. 2计算粒子的适应度和确定群体的Pbest和Gbest
Calobjvalue函数的功能是计算目标函数的适应度,其公式是采用本文的示例仿真,用户可以根据不同的优化问题予以修改。
function objvalue=calobjvalue(pop)
for i=1: popsize
obfuct1=sin(sqrt(pop(,i 1) ^2+pop(,i 2) ^2)) ^2-0. 5;
obfuct2=(1. 0+0. 001* (sqrt(x(,i 1) ^2+x(,i 2) ^2)) ^2);
objvalue(,i 1)=0. 5+obfuct1/obfuct2;
end
Pbest=pop(:, 1: dimsize);
[ggBest, xindex]=max(objvalue);
xtemp=pop(xindex, 1: dimsize);
Gbest=xtemp;
3. 3粒子速度和位置的更新
粒子速度和位置的更新是基于式(5)与(6),并生成新的粒子群体.
function pop2=renew(pop)
for t=1: popsize
for dimIndex=1: dimsize
w=wcmax-(wcmax-wcmin)* (generation/maxgeneration);
sub1=Pbest(t, dimIndex)-pop(t, dimIndex);
sub2=Gbest(1, dimIndex)-pop(t, dimIndex);
tempV=w* pop(t, dimszie+dimIndex)+c1* unifrnd(0, 1)* sub1+c2* unifrnd(0, 1)* sub2;
if tempV>speedmax
pop(t, dimszie+dimIndex)=speedmax;
elseif tempV<(-speedmax)
pop(t, dimsize+dimIndex)=-speedmax;
else
pop(t, dimszie+dimIndex)=tempV;
end
tempposition=pop(t, dimIndex)+pop(t, dimsize+dimIndex);
if tempposition>xmax
pop(t, dimIndex)=xmax;
elseif tempposition<xmin
pop(t, dimIndex)=xmin;
else
pop(t, dimIndex)=tempposition;
end
end
3. 4粒子Pbest和Gbest的更新
粒子在进化过程中依据其适应度,调节个体最好位置Pbest和群体最好位置Gbest
function [Pbest,Gbest]=regulate(pop)
for i=1: popsize
obfuct1=sin(sqrt(x(,i 1) ^2+x(,i 2) ^2)) ^2-0. 5;
obfuct2=(1. 0+0. 001* (sqrt(x(,i 1) ^2+x(,i 2) ^2)) ^2);
objvalue(,i 1)=0. 5+obfuct1/obfuct2;
obfuct3=sin(sqrt(pBest(,i 1) ^2+pBest(,i 2) ^2)) ^2-0. 5;
obfuct4=(1. 0+0. 001* (sqrt(pBest(,i 1) ^2+pBest(,i 2) ^2)) ^2);
pvaluer(,i 1)=0. 5+obfuct3/obfuct4;
end
obfuct1=sin(sqrt(gBest(1) ^2+gBest(2) ^2)) ^2-0. 5;
obfuct2=(1. 0+0. 001* (sqrt(gBest(1) ^2+gBest(2) ^2)) ^2);
objvaluetemp=0. 5+obfuct1/obfuct2;
for i=1: popsize
if objvaluer(,i 1)<pvaluer(,i 1)
PBest(,i 1: dimszie)=pop(,i 1: dimszie);
end
if objvaluer(,i 1)<objvaluertemp
GBest=pop(,i 1: dimszie);
xtemp=pop(,i 1: dimsize);
end
end