粒子群算法
粒子群优化算法(PSO)是一种进化计算技术(evolutionary computation),1995 年由Eberhart 博士和kennedy 博士提出,源于对鸟群捕食的行为研究 。该算法最初是受到飞鸟集群活动的规律性启发,进而利用群体智能建立的一个简化模型。粒子群算法在对动物集群活动行为观察基础上,利用群体中的个体对信息的共享使整个群体的运动在问题求解空间中产生从无序到有序的演化过程,从而获得最优解。 ------摘自【百度百科】
迭代公式:
参数 | 描述 | 功能 |
---|---|---|
k | 迭代次数 | ~ |
id | 粒子标号 | 描述为第几个粒子 |
w | 惯性权重 | 继承前一次迭代移动的程度 |
r1,r2 | 随机数范围(0,1) | ~ |
c1,c2 | 自定参数 | ~ |
pbest | 粒子历史最优 | 某粒子目前为止取到的历史最优值 |
gbest | 粒子全局最优 | 所有粒子目前为止取到的全局最优值 |
x | 粒子坐标 | ~ |
v | 粒子速度 | 包括方向与步长 |
matlab源码:
clear
clc
figure(1);
subplot(1,2,1)
[X,Y]=meshgrid(-12:0.05:12,-12:0.05:12);
img=fun(X,Y);
mesh(X,Y,img);
hold on;
n=60; %粒子数目
D=2; %维度
nmax=100000000000000; %最大迭代次数
v=zeros(n,D); %粒子速度
pbest=zeros(n,1); %个体最优
xypbest=zeros(n,D); %个体最优坐标
gbest=0; %种群最优
xygbest=zeros(1,D); %种群最优坐标
%%定义参数
c1=1;
c2=1;
r1=rand(1);
r2=rand(1);
w=0.5;
j=0;
a=unifrnd(-12,12,[n,D]); %随机生成范围内粒子群
for i=[1:n]
img=fun(a(i,1),a(i,2));
if img>pbest(i)
pbest(i)=img;
xypbest(i,:)=a(i,:);
end
if img>gbest
gbest=img;
xygbest=a(i,:);
end
plot3(a(i,1),a(i,2),img,'+')
end
v(1)=1;
record=sum(img)/n;
while (j<nmax)&&(sum(sum(abs(v))')>0.001)
r1=rand(1);
r2=rand(1);
v=w*v+r1*c1*(xypbest-a)+c2*r2*(xygbest-a);
temp=(v>0.2);
v=(~temp).*v+0.2*temp;
temp=(v<-0.2);
v=(~temp).*v-0.2*temp;
a=a+v;
temp=(a>12);
a=(~temp).*a+temp*12;
temp=(a<-12);
a=(~temp).*a-temp*12;
for i=[1:n]
img=fun(a(i,1),a(i,2));
if img>pbest(i)
pbest(i)=img;
xypbest=a(i,:);
end
if img>gbest
gbest=img;
xygbest=a(i,:);
end
end
j=j+1;
img=fun(a(:,1),a(:,2));
record=[record;sum(img)/n];
end
subplot(1,2,2)
xlabel('x')
ylabel('y')
zlabel('img')
img=fun(X,Y);
mesh(X,Y,img);
hold on;
for i=[1:n]
img=fun(a(i,1),a(i,2));
plot3(a(i,1),a(i,2),img,'r*')
hold on
end
disp(j)
figure(2);
axis([0 900 -inf inf]);
plot([0:j],record)
测试函数:
function [ z ] = fun( x,y )
z=0.5+((sin(sqrt(x.^2+y.^2))).^2-0.5)./(1+0.001*(x.*x+y.*y)).^2;
end
原创文章,未经允许,禁止转载