PSO算法——在Matlab上求解多维函数最值问题

136 阅读4分钟

粒子群优化算法(PSO)

思想来源: 粒子群算法的思想来源是生物界现象,例如鸟群觅食现象和鱼群捕食现象,通过群体中的协作寻找到问题的全局最优解。它是1995年由美国学者Eberhart和Kennedy提出的,现在已经广泛应用于各种工程领域的优化问题之中。

基本原理

类比于鸟群觅食现象,鸟群在觅食;

1.鸟群=搜索空间的一组有效解,

2.觅食的范围大小=问题解的搜索界限,

3.鸟的飞行速度=解的速度向量,

4.鸟的位置=解的位置向量,

5.个体认知和群体协作=速度与位置的更新,

6.找到食物=找到全局最优解。

粒子群优化算法流程图:

image.png

具体步骤:

1. 随机初始化每个粒子的速度与位置(种群规模N),并且通过f评估每个粒子的适应值,初始时每个粒子的历史最优位置PBest(P为particle)等于初始化位置,最后选择处粒子群中粒子的最优适应值,并保存全局最优粒子位置Gbest(G为group).

2. 如果没有满足结束条件,则继续迭代,循环3和4步骤。

3. 更新每个粒子的位置与速度,根据如下公式:

image.png

image.png

d是解的维度,ω为惯性权重,c1、c2为加速度系数,r1、r2为在第d维[0,1]范围内独立生成的两个均匀分布随机数。pBest是迄今为止第i个粒子找到的适应度最好的位置,gBest是邻域内的最佳位置。

4. 评估更新后每个粒子的函数适应值,并且更新每个粒子的历史最优位置,和全局最优位置。

5. 结束循环

应用——在Matlab中用PSO求解多维函数最值问题:

求解多维函数最小值:


clear;

clc;

N=50; %种群规模

D=10; %粒子长度

Xmin= -10; %粒子的位置范围

Xmax=10;

Vmax=2; %粒子的速度范围

Vmin=-2;

w= 0.5; %惯性权重

c1=2; %加速度系数

c2=2;

t=1; %初始化迭代次数

T=500; %最大迭代次数

%初始化每代最优适应值

trace=zeros(T,1);

%初始化粒子群X位置

X=rand(N,D)*(Xmax-Xmin)+Xmin;

%初始化粒子群V速度;

V=rand(N,D)*(Vmax-Vmin)+Vmin;

%初始化适应值

fitness=zeros(N,1);

for i=1:N
fitness(i)=sum(X(i,:).^2);%计算函数适应值
end

 

%记录初次全局最优粒子位置
[gbest_fitness,index_best]=min(fitness);
X_gbest=X(index_best,:);%全局最优粒子

%迭代过程
for t=1:T
%第一次迭代pbest初值
if t==1
X_pbest=X;%X_pbest是粒子的历史最佳位置
for i=1:N
fitness_pbest(i)=sum(X_pbest(i,:).^2);%fitness_pbest是粒子历史最佳适应值
end
end

 

%更新每个粒子的速度和位置
for i=1:N

%粒子维度更新
for j=1:D
r1=rand;
r2=rand;
%更新速度
V(i,j)=w*V(i,j)+c1*r1*(X_pbest(i,j)-X(i,j))+c2*r2*(X_gbest(j)-X(i,j));
%更新位置
X(i,j)=X(i,j)+V(i,j);
%更新后限制粒子位置在取值范围内
X(i,j)=max(X(i,j),Xmin);
X(i,j)=min(X(i,j),Xmax);
end

%计算更新后粒子适应值
fitness(i)=sum(X(i,:).^2);


%更新pbest

if fitness_pbest(i)>=fitness(i)%比较粒子历史最佳适应值fitness_pbest与当前fitness大小

X_pbest(i,:)=X(i,:);%更新粒子历史最佳位置

fitness_pbest(i)=fitness(i);%更新粒子历史最佳适应值

end

 

%和全局最优粒子比较是否适应值更大

if fitness(i)<=gbest_fitness

%跟新全局最优适应值

gbest_fitness=fitness(i);

%更新全局粒子位置

X_gbest=X(i,:);

end 
end

trace(t)=gbest_fitness;%记录每代最好的适应值
end

%记录最终的全局最优粒子以及最优适应值
gBest=X_gbest;
fitBest=gbest_fitness;


figure(1);

plot(1:T,trace,'r');

xlabel("迭代次数");

ylabel("最佳适应值");

根据上述代码,依次给出粒子位置更新的情况:

1.初始化后,每个粒子对应的函数适应值: image.png

2.第180代每个粒子对应的函数适应值: image.png 3.第280代每个粒子对应的函数适应值: image.png 4.第380代每个粒子对应的函数适应值: image.png 5.第480代每个粒子对应的函数适应值: image.png 5.第500代每个粒子对应的函数适应值: image.png 6.每一代的最佳粒子的适应值: image.png