粒子群算法

 

粒子群算法是基于鸟群觅食的行为提出来的,每一个单一个体鸟视为搜索空间的一个粒子,都被视为问题的可能解,每个粒子都有一个由待优化函数决定的适应度函数,通过适应度值迭代更新粒子的位置和速度

粒子速度和位置的维度由问题的未知量决定,例如,求sin(∑i=1 to kxi-4)的最小值,如果k=2,那么速度V和位置X就是二维的,如果k=20,那么V和X都是20维的

设粒子i的历史最优位置为p,种群粒子的历史最优位置为pg,粒子按照下式来更新位置和速度:

v=w*v+c1r1(p-x)+c2r2(pg-x) c1和c2是加速常数,r1和r2是[0,1]之间的随机数

x=x+v

w*x表示粒子有维持自身速度的趋势,c1r1(p-x)表示粒子有向粒子历史最优位置移动的趋势,c2r2(pg-x)表示粒子有想群体最优位置逼近的趋势

算法流程:

1,初始化粒子群体,包括粒子种群数,每个粒子的速度和位置

2,计算各个粒子的适应度值

3,对于每个粒子,用它的适应度值与个体极值比较,如果fit>p,就p=fit

4,比较p和pg如果,p>pg,那么pg=p

5,根据上面的两式更新x和v

6,直到满足条件,否则返回2

下面的例子是由matlab实现的

function pso()
c1=2;
N=50;
D=30;
M=500;
c2=2;
w=0.7;
xx=zeros(1,D);
F=fitnessfunction(xx);
[x,y]=tso(@fitnessfunction,c1,c2,w,N,D,M);
end
%适应度函数
function F=fitnessfunction(x)
F=0;
for i=1:30
    F=F+x(i)^2+x(i)-6;
end
end

function [x,y]=tso(fitness,c1,c2,w,N,D,M)
%初始化位置和速度 for i=1:N for j=1:D x(i,j)=randn; v(i,j)=randn; end end
%计算粒子的适应度值 for i=1:N p(i)=fitness(x(i,:)); y(i,:)=x(i,:); end
%找出当前种群最优位置 pg=x(N,:) for i=1:(N-1) if fitness(x(i,:))<fitness(pg) pg=x(i,:); end end
%更新速度和位置,相应地,随着迭代的进行,个体极值和全局极致也在变化 for i=1:M for j=1:N v(j,:)=w*v(j,:)+c1*rand*(y(j,:)-x(j,:))+c2*rand*(pg-x(j,:)); x(j,:)=x(j,:)+v(j,:); if fitness(x(j,:))<p(j) p(j)=fitness(x(j,:)); y(j,:)=x(j,:); end if p(j)<fitness(pg) pg=y(j,:) end end end disp('the position is:') x=pg' disp('the value is') y=fitness(pg) end
原文地址:https://www.cnblogs.com/semen/p/6886283.html