PID搜索算法(PID-based search algorithm, PSA)是一种基于PID算法的新型元启发式优化算法。
1、PID简介与控制原理
(1)PID控制简介
PID控制是一种经典的控制算法,广泛应用于各种工业控制系统中。它通过比例(Proportional)、积分(Integral)、微分(Derivative)三个环节来调节控制量,以达到控制目标。以下是PID控制的基本原理和实现方式:
比例§:比例控制是最基本的控制方式,其控制量与偏差成正比。比例系数越大,系统响应越快,但过大的比例系数会导致系统超调和振荡。
积分(I):积分控制用于消除稳态误差,通过累积偏差来调整控制量。积分作用可以提高系统的稳定性,但过大的积分系数会导致系统响应变慢。
微分(D):微分控制利用偏差的变化率来预测未来的偏差变化,从而提前调整控制量。微分作用可以提高系统的抗干扰能力,但过大的微分系数会使系统对噪声敏感。
由此可见:合理调整PID参数,可以实现系统的快速响应和稳定控制。
2、PSA算法原理
(1)算法简介
PID搜索算法(PID-based search algorithm, PSA)是一种基于PID算法的新型元启发式优化算法,PID算法通过将偏差的比例P、积分I和微分D通过线性组合构成控制量,用以控制被控对象。在PID搜索算法中,这种控制量用于调整种群的搜索方向和步长,从而实现优化。
(2)算法原理
PSA基于增量PID算法,通过不断调整系统偏差将整个群体收敛到最优状态。算法通过数学建模和实现,能够在广泛的搜索空间中进行优化。增量式PID控制使当前时刻的控制量与前一刻的控制量之差,这个差就是新的控制量,这是一种递归算法。研究将总体的历史最佳个体抽象为目标值,将每个个体抽象为真值,然后本文提出的PSA就是模拟PID的调节过程来修正每个个体相对于最佳个体的偏差,使整个总体达到较好的状态。
2.1 控制公式
PID控制的输出可以通过以下公式计算:
u
(
t
)
=
K
p
e
(
t
)
+
K
i
∫
0
t
e
(
τ
)
d
τ
+
K
d
d
e
(
t
)
d
t
u(t)=K_pe(t)+K_i\int_0^te(\tau)d\tau+K_d\frac{de(t)}{dt}
u(t)=Kpe(t)+Ki∫0te(τ)dτ+Kddtde(t)
其中:·
u
(
t
)
u(t)
u(t)是控制量
·
e
(
t
)
e(t)
e(t)是偏差,即期望值与实际值之差
⋅
\cdot
⋅
K
p
K_p
Kp是比例系数
⋅
\cdot
⋅
K
i
K_i
Ki是积分系数
⋅
\cdot
⋅
K
d
K_d
Kd是微分系数
(2)PID控制公式
PID控制的输出可以通过以下公式计算:
u
(
t
)
=
K
p
e
(
t
)
+
K
i
∫
0
t
e
(
τ
)
d
τ
+
K
d
d
e
(
t
)
d
t
u(t)=K_pe(t)+K_i\int_0^te(\tau)d\tau+K_d\frac{de(t)}{dt}
u(t)=Kpe(t)+Ki∫0te(τ)dτ+Kddtde(t)
其中:
u
(
t
)
u(t)
u(t)是控制量; e(t)是偏差,即期望值与实际值之差
K
p
K_p
Kp是比例系数;
K
i
K_i
Ki是积分系数;
K
d
K_d
Kd是微分系数
看一个具体的例子,使用PID控制来室内温度。希望将其温度控制在25摄氏度,下面将给出完整的MATLAB代码。
% 设定目标值
desired_value = 25; % 期望的系统输出值
% PID 控制器参数
Kp = 0.5; % 比例增益
Ki = 0.2; % 积分增益
Kd = 0.1; % 微分增益
% 初始化PID控制器
previous_error = 0;
integral = 0;
% 模拟控制过程,例如,这里简单模拟10个时间步的过程
for t = 1:10
% 获取当前系统反馈值(这里用随机数模拟)
current_value = desired_value + (rand() - 0.5) * 10;
% 计算误差
error = desired_value - current_value;
% 计算积分项
integral = integral + error;
% 计算微分项
derivative = error - previous_error;
% 计算PID输出
output = Kp * error + Ki * integral + Kd * derivative;
% 更新上一个误差值
previous_error = error;
% 打印输出
fprintf('时间步 %d, 输出值: %.2f, PID输出: %.2f\n', t, current_value, output);
end
(3)增量PID控制
增量PID控制器的算法与标准PID有所不同,主要在于输出的计算方式。增量PID的输出是基于误差的增量变化而不是绝对误差。增量式PID控制是一种改进的PID控制方式,其控制量是当前时刻与前一时刻控制量之差。这使得系统更容易实现递归计算,减少计算量。增量式PID控制的公式为:
Δ
u
(
t
)
=
K
p
Δ
e
(
t
)
+
K
i
Δ
∫
0
t
e
(
τ
)
d
τ
+
K
d
Δ
d
e
(
t
)
d
t
\Delta u(t)=K_p\Delta e(t)+K_i\Delta\int_0^te(\tau)d\tau+K_d\Delta\frac{de(t)}{dt}
Δu(t)=KpΔe(t)+KiΔ∫0te(τ)dτ+KdΔdtde(t)
Δ
u
(
t
)
\Delta u(t)
Δu(t)是控制量的增量的;
e
(
t
)
e(t)
e(t)是偏差的增量,下面给出完整的MATLAB代码:
% 设定目标值
desired_value = 25; % 期望的系统输出值
% 增量PID控制器参数
Kp = 0.5; % 比例增益
Ki = 0.2; % 积分增益
Kd = 0.1; % 微分增益
% 初始化增量PID控制器
previous_error = 0;
previous_previous_error = 0;
previous_output = 0;
% 模拟控制过程,例如,这里简单模拟10个时间步的过程
for t = 1:10
% 获取当前系统反馈值(这里用随机数模拟)
current_value = desired_value + (rand() - 0.5) * 10;
% 计算当前误差
error = desired_value - current_value;
% 计算增量PID输出
delta_output = Kp * (error - previous_error) + Ki * error + Kd * (error - 2 * previous_error + previous_previous_error);
% 当前输出 = 前一输出 + 增量
output = previous_output + delta_output;
% 更新历史值
previous_previous_error = previous_error;
previous_error = error;
previous_output = output;
% 打印输出
fprintf('时间步 %d, 输出值: %.2f, 增量PID输出: %.2f\n', t, current_value, output);
end
3、PSA数学模型
优化问题由一组决策变量、约束条件和一个目标函数组成。可以假设该组中的决策变量数为 d,变量的上限和下限分别为 u 和 l。PSA 的控制参数包括最大迭代次数 T 和群体大小 n。那么初始种群可以表示为
(1)种群初始化
x
i
j
=
(
u
j
−
l
j
)
⋅
r
1
+
l
j
,
i
=
1
,
2
,
⋯
,
n
;
j
=
1
,
2
,
⋯
,
d
\mathbf{x}_{ij}=\begin{pmatrix}\mathbf{u}_j-\mathbf{l}_j\end{pmatrix}\cdot r_1+\mathbf{l}_j,i=1,2,\cdots,n;j=1,2,\cdots,d
xij=(uj−lj)⋅r1+lj,i=1,2,⋯,n;j=1,2,⋯,d
(2)计算系统偏差
e
k
(
t
)
=
x
∗
(
t
−
1
)
−
x
(
t
−
1
)
\mathbf e_k(t)=\mathbf x^*(t-1)-\mathbf x(t-1)
ek(t)=x∗(t−1)−x(t−1)
x
∗
(
t
)
x^*(t)
x∗(t)是对应于总体历史最小值的个体,
e
k
(
t
)
\mathbf{e}_k(t)
ek(t)为总体偏差
在PID调节在第t次迭代的输出值
Δ
u
(
t
)
\Delta u(t)
Δu(t)为:
Δ
u
(
t
)
=
K
p
⋅
r
2
⋅
[
e
k
(
t
)
−
e
k
−
1
(
t
)
]
+
K
i
⋅
r
3
⋅
e
k
(
t
)
+
K
d
⋅
r
4
⋅
[
e
k
(
t
)
−
2
e
k
−
1
(
t
)
+
e
k
−
2
(
t
)
]
\begin{aligned}\Delta\mathbf{u}(t)&=K_{p}\cdot\mathbf{r}_{2}\cdot[\mathbf{e}_{k}(t)-\mathbf{e}_{k-1}(t) ]+K_{i}\cdot\mathbf{r}_{3}\cdot\mathbf{e}_{k}(t)+K_{d}\cdot\mathbf{r}_{4}\cdot[\mathbf{e}_{k}(t)-2\mathbf{e}_{k-1}(t)+\mathbf{e}_{k-2}(t) ]\end{aligned}
Δu(t)=Kp⋅r2⋅[ek(t)−ek−1(t)]+Ki⋅r3⋅ek(t)+Kd⋅r4⋅[ek(t)−2ek−1(t)+ek−2(t)]
其中 r2、r3 和 r4 是[0,1]的随机数向量;Kp、Ki和Kd分别分别设置为1. 0.5和1.2,为了防止算法过早陷入局部最优,文章引入了零输出的调节因子。
o
(
t
)
=
(
cos
(
1
−
t
/
T
)
+
λ
r
5
⋅
L
)
⋅
e
k
(
t
)
\mathbf{o}(t)=(\cos(1-t/T)+\lambda\mathbf{r}_5\cdot\mathbf{L})\cdot\mathbf{e}_k(t)
o(t)=(cos(1−t/T)+λr5⋅L)⋅ek(t)
r
5
r_5
r5是一个[0,1]之间的随机数,其中的
λ
\lambda
λ根据下列的式子更新:
λ
=
[
ln
(
T
−
t
+
2
)
/
ln
(
T
)
]
2
\lambda=\left[\ln(T-t+2)/\ln(T)\right]^2
λ=[ln(T−t+2)/ln(T)]2
L表示是传说中的Levy飞行,Levy飞行是由Levy提出,Benoist-Madelbro 进行描述的一种稳定分布。大体上说,Levy飞行是一种模拟自然界中动物觅食的一个随机游走过程。
L
=
u
σ
∣
v
∣
1
/
β
;
σ
=
[
Γ
(
1
+
β
)
×
sin
(
π
β
/
2
)
Γ
(
(
1
+
β
)
/
2
)
×
β
×
2
(
β
−
1
)
/
2
]
1
/
β
\mathbf{L}=\frac{\mathbf{u}\sigma}{|\mathbf{v}|^{1/\beta}};\sigma=\left[\frac{\Gamma(1+\beta)\times\sin(\pi\beta/2)}{\Gamma((1+\beta)/2)\times\beta\times2^{(\beta-1)/2}}\right]^{1/\beta}
L=∣v∣1/βuσ;σ=[Γ((1+β)/2)×β×2(β−1)/2Γ(1+β)×sin(πβ/2)]1/β
其中 u 和 v 分别是服从标准正态分布的 n 行和 d 列的随机数矩阵;β 是设
置为 1.5 的因子。所有个体的更新都与 Δu(t)和o(t)有关。种群的更新
公式定义为
x
(
t
+
1
)
=
x
(
t
)
+
η
⋅
Δ
u
(
t
)
+
(
1
−
η
)
⋅
o
(
t
)
\mathbf{x}(t+1)=\mathbf{x}(t)+\eta\cdotp\Delta\mathbf{u}(t)+(1-\eta)\cdotp\mathbf{o}(t)
x(t+1)=x(t)+η⋅Δu(t)+(1−η)⋅o(t)
(12),其中η是n行1列的矩阵,表示为
η
=
r
6
c
o
s
(
t
/
T
)
\eta=r_6cos(t/T)
η=r6cos(t/T) ,其
r
6
r_{6}
r6是行 1 列中 0 到 1 个随机数的矩阵.