PSA算法:PID搜索优化算法(PID-based search algorithm, PSA)|经典控制方法:PID控制

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)+Ki0te(τ)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)+Ki0te(τ)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=(ujlj)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(t1)x(t1)
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)=Kpr2[ek(t)ek1(t)]+Kir3ek(t)+Kdr4[ek(t)2ek1(t)+ek2(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(1t/T)+λr5L)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(Tt+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=v1/β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 个随机数的矩阵.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

算法小狂人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值