1. 粒子群算法简介
假设在一个
D
D
D维的目标搜索空间中,有
N
N
N个例子组成的一个群落,其中第
i
i
i个粒子表示为一个
D
D
D维度的向量:
X
i
=
[
x
i
1
,
x
i
1
,
⋯
,
x
i
D
]
,
i
=
1
,
2
,
⋯
,
N
(1)
\mathbf{X}_i = [x_{i1},x_{i1},\cdots,x_{iD}], i=1,2,\cdots, N\tag{1}
Xi=[xi1,xi1,⋯,xiD],i=1,2,⋯,N(1)
第
i
i
i个粒子的“飞行”速度也是一个
D
D
D维向量,记为
V
i
=
[
V
i
1
,
V
i
2
,
,
⋯
,
V
i
D
]
,
i
=
1
,
2
,
⋯
,
N
(2)
\mathbf{V}_i = [V_{i1}, V_{i2,}, \cdots,V_{iD}], i=1,2,\cdots, N\tag{2}
Vi=[Vi1,Vi2,,⋯,ViD],i=1,2,⋯,N(2)
第
i
i
i个粒子迄今为止搜索到的最优位置称为个体极值,记作
p
best
=
[
p
i
1
,
p
i
2
,
⋯
,
p
i
D
]
,
i
=
1
,
2
,
⋯
,
N
(3)
\mathbf{p}_{\text{best}}=[p_{i1},p_{i2},\cdots,p_{iD}],i=1,2,\cdots, N\tag{3}
pbest=[pi1,pi2,⋯,piD],i=1,2,⋯,N(3)
整个粒子群搜索到的最优位置为全局极值,记为
g
best
=
[
g
1
,
g
2
,
⋯
,
g
D
]
\mathbf{g}_{\text{best}} = [g_1,g_2,\cdots,g_D]
gbest=[g1,g2,⋯,gD]
在找到这两个最优值时,粒子根据下式来更新自己的速度和位置:
{
v
i
j
(
t
+
1
)
=
v
i
j
(
t
)
+
c
1
r
1
(
t
)
[
p
i
j
(
t
)
−
x
i
j
(
t
)
]
+
c
2
r
2
(
t
)
[
g
j
(
t
)
−
x
i
j
(
t
)
]
x
i
j
(
t
+
1
)
=
x
i
j
(
t
)
+
v
i
j
(
t
+
1
)
\left\lbrace\begin{array}{l} v_{ij}(t+1) = v_{ij}(t) + c_1r_1(t)[p_{ij}(t)-x_{ij}(t)] +c_2r_2(t)[g_{j}(t)-x_{ij}(t)] \\ x_{ij}(t+1) = x_{ij}(t) + v_{ij}(t+1)\end{array}\right.
{vij(t+1)=vij(t)+c1r1(t)[pij(t)−xij(t)]+c2r2(t)[gj(t)−xij(t)]xij(t+1)=xij(t)+vij(t+1)式中:
i
=
1
,
2
,
⋯
,
N
i=1,2,\cdots,N
i=1,2,⋯,N,
j
=
1
,
2
,
⋯
,
D
j = 1,2,\cdots,D
j=1,2,⋯,D,
c
1
c_1
c1和
c
2
c_2
c2为学习因子,也称加速常数;
r
1
r_1
r1和
r
2
r_2
r2为
[
0
,
1
]
[0,1]
[0,1]范围内的均匀随机数,
v
i
j
v_{ij}
vij是第
i
i
i个粒子第
j
j
j维度的速度分量,
v
i
j
∈
[
−
v
max
,
v
max
]
v_{ij}\in[-v_{\max},v_{\max}]
vij∈[−vmax,vmax],v_{\max}是常数,由用户设定来限制粒子的速度。
速度更新方程右三个部分组成:
- “惯性”或“动量”部分:分赢了粒子的运动习惯,代表粒子有维持自己先前速度的趋势;
- “认知”部分:反映了粒子对自身历史经验的记忆或回忆,代表粒子有向自身历史最佳位置逼近的趋势;
- “社会”部分:反映了粒子间协同合作与知识共享的群体历史经验,代表粒子有向群体或邻域历史最佳位置逼近的趋势。
2. 粒子群算法内容
2.1 粒子群算法流程
2.2 参数说明
3. 粒子群算法代码实现
3.1 Matlab
3.1.1 PSO求解函数极值
求 f ( x ) = x − 10 sin ( 5 x ) + 7 cos ( 4 x ) f(x)=x-10\sin(5x)+7\cos(4x) f(x)=x−10sin(5x)+7cos(4x)的最大值,其中 x x x的范围为 x ∈ [ 0 , 10 ] x\in[0,10] x∈[0,10]。
% 粒子群优化算法求解函数最值
% 系统初始化
close all
clear
clc
% 参数设置
N = 100; % 粒子数
D = 1; % 维度
T = 100; % 最大迭代次数
c1 = 1.5; % 学习因子1
c2 = 1.5; % 学习因子2
w = 0.8; % 惯性权重
% 变量范围
Xmax = 0; % 自变量范围
Xmin = 10; % 自变量范围
Vmax = 2; % 速度范围
Vmin = -2; % 速度范围
% 初始化粒子位置与速度
x = rand(N,D) * (Xmax-Xmin) + Xmin;
v = rand(N,D) * (Vmax-Vmin) + Vmin;
% 初始化个体最优位置和最优值
p = x;
pbest = ones(N,1);
for i = 1:N
pbest(i) = f(x(i,:));
end
% 初始化全局最优位置和最优值
g = ones(1,D);
gbest = -inf;
for i = 1:N
if(pbest(i) > gbest)
g = p(i,:);
gbest = pbest(i);
end
end
% 记录迭代过程
gb = ones(1,T);
% 开始迭代
for i = 1:T
for j = 1:N
% 更新个体最优位置和最优值
if (f(x(j,:)) > pbest(j))
p(j,:) = x(j,:);
pbest(j) = f(x(j,:));
end
% 更新全局最优位置和最优值
if pbest(j) > gbest
g = p(j,:);
gbest = pbest(j);
end
% 更新位置和速度
v(j,:) = w * v(j,:) + c1 * rand * (p(j,:) - x(j,:)) + c2 * rand * (g - x(j,:));
x(j,:) = x(j,:) + v(j,:);
% 范围检测
for ii = 1:D
if (v(j,ii) > Vmax) || (v(j,ii) < Vmin)
v(j,ii) = rand * (Vmax-Vmin) + Vmin;
end
if (x(j,ii) > Xmax) || (x(j,ii) < Xmin)
x(j,ii) = rand * (Xmax-Xmin) + Xmin;
end
end
end
gb(i) = gbest;
end % 结束迭代
% 绘图
figure('name','迭代曲线','color','w')
plot(gb,'b','linewidth',1);
grid on
set(gca,'FontName','Times New Roman','FontSize',12);
xlabel('迭代次数','FontName','宋体');
ylabel('最优解','FontName','宋体');
xlim([1,T])
X = linspace(Xmin,Xmax,1000);
Y = f(X);
figure('name','函数图像','color','w');
plot(X,Y,'b','linewidth',1);
grid on
hold on
set(gca,'FontName','Times New Roman','FontSize',12);
xlabel('$x$','interpreter','Latex');
ylabel('$f(x)$','interpreter','Latex');
title('$f(x)=x - 10\sin(5x) + 7\cos(4x)$','interpreter','Latex');
ylim([-20,30])
[ymax,xindex] = max(Y);
line1 = plot(X(xindex),ymax,'go');
line2 = plot(g,f(g),'r*');
hold off
legend([line1,line2],{'Max','PSO Result'},'Location','southeast');
% 函数
function y = f(x)
y = x + 10*sin(5*x) + 7 * cos(4*x);
end