粒子群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


  • 3
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值