基于PSO算法优化PID参数的一些问题

前言

当我再一次想要认认真真研究一下PSO粒子群算法优化PID参数的时候,准备去matlab中文论坛发帖子讨论,没想到这个论坛已经停止运营了...

下面我将提出四个非常重要的问题,并对这四个问题做出回答。这是我在做研究的时候想找寻“所以然”的一个结果。

在开始之前首先非常推荐一本书,有条件的可以去图书馆借来看看:《粒子群优化算法》李丽、牛奔,相信这本书可以解决你绝大部分疑惑。


PSO粒子群算法两个分常重要的公式:

 速度公式:

位置公式:


Q1:惯性权重ω如何设置比较好?学习因子C1和C2如何设置?

A1:在我的那篇呈现线性递减惯性权重的PSO-PID代码的文章中(🚪👉线性递减权重的PSO-PID算法),可以知道设置的惯性权重ω是从0.9随着迭代此时而线性递减到0.4的,而个人学习因子C1和社会学习因子C2设置的为一个定值,等于2。

其实,为了让粒子前期尽可能地搜索整个空间,后期更好地收敛到某一个点,加快仿真时间,我们可以设置惯性权重前期大后期小,这样前期惯性大主要还是靠自己的飞行速度,而后期惯性小就利于收敛;同理,对于个人学习因子C1,前期要大,后期要小;对于社会学习因子则反之。ω范围0.4~0.9(不一定是这个数),C1和C2的范围0.1~2

下面我分别给出常见的惯性权重和学习因子设置的公式:

惯性权重:

以下的ωstart都为0.9,ωend都为0.4

固定惯性权重

(C在0.4~0.9区间,这里取0.68比较好)

典型线性递减惯性权重

线性微分递减惯性权重

随机变化惯性权重1

随机变化惯性权重2

[1]黄训爱,杨光永,樊康生,等.基于改进粒子群算法的PID控制参数优化[J].组合机床与自动化加工技术,2024,(02):89-92+98.

[2]张继荣,张天.基于改进粒子群算法的PID控制参数优化[J].计算机工程与设计,2020,41(04):1035-1040.

非线性动态惯性权重

(k取3比较好)

基于正切函数的惯性权重

(k取0.6比较好)

基于反正切函数的惯性权重

(k取0.4比较好)

自适应惯性权重1

f 为粒子的适应度,f max 为其最大值,f avg 为其平均值

[1]孙超,郭乃宇,严明蝶,等.改进自适应粒子群算法的PID参数优化[J].中国工程机械学报,2023,21(05):377-382.

自适应惯性权重2(对于求解最大值问题)

自适应惯性权重3(对于求解最小值问题)

[1]张豪,王贤琳.自适应惯性权重优化的粒子群算法[J].智能计算机与应用,2023,13(09):5-8.


学习因子:

固定学习因子

(C1和C2在1~2.5区间)

线性变换学习因子

C_1start=2.5,C_1end=0.5

C_2start=0.5,C_2end=2.5

对称反余弦学习因子

C_1start=2.5,C_1end=0.5

C_2start=0.5,C_2end=2.5

非对称反余弦学习因子

C_1start=2.75,C_1end=1.25

C_2start=0.5,C_2end=2.25


以及不用惯性权重而用收缩因子,收缩因子K比起惯性权重,更能有效地控制约束粒子飞行速度,增强了算法局部搜索能力。

那么原来速度公式要变为:

其中

Q2:迭代速度边界设定一定能够遍历(/覆盖)整个PID参数二维空间范围吗?还是说需要与迭代次数相关?迭代次数越高,范围越大?

A2:

首先,速度边界的设定,VmaxVmin大小相等的相反数

其次,速度边界的设定没有固定就是某一个值的说法,速度边界设定与位置边界设定有关,如果Vmax过大,粒子可能飞过较好解;反之,如果Vmax过小,则粒子可能无法探测完整个解空间,所以要设置一个合适的速度边界

最后,迭代次数肯定和覆盖整个二维空间有关,迭代次数越高,覆盖完整的几率更高,但是你得考虑自己电脑的算力和计算时间的问题。

Q3:PID位置边界是一致比较方便寻优吗?如果我设置Kp范围为[0,100],而Ki和Kd的范围为[0,1],这样子的设置对寻优有很大影响吗?

A3:

我认为按照实际情况来设置不同的寻优范围就可以了,Kp、Ki和Kd可以设置不同的寻优范围,没有必要三个范围一致。比如本来实际Kd的数值就比较小,你让PSO算法在10~100的范围里面去寻找Kd的最优解,是无效的。

Q4:如果PID位置边界我都设置为[0,10],速度边界怎么设置更好?[-1,1],[-5,5],[-10,10],速度边界的设置与迭代找到最优解的计算机求解速度有关联吗?

A4:

在我另外一篇文章里面(🚪👉:PSO-PID算法迭代的PID值为什么变化范围那么小?)我也尝试过,只改变速度边界的大小进行对照试验,发现对于求解的结果是没有什么影响的,计算机求解速度的话每一次都会有些许差别,这个我当时仿真的时候没有进行计算。

其实速度边界和位置边界是有相关对于关系的:

根据这篇文章,Optimal choice of parameters for particle swarm optimization浙江大学学报,γ最佳范围在0.01~1,对于寻优目标函数为多峰函数(multimodel function),γ取0.5最好,对于单峰函数(unimodel function),γ取0.05最好。也就是说若取γ=0.1,当Xmax=10时,则Vmax=1。

同样是在这一篇文章中,也指出粒子群的粒子个数,最大不要超过50个粒子,不管是对于多峰函数问题还是单峰函数问题。

"While when it is larger than 50, PSO is not sensitive to the population size."

“当PSO大于50时,PSO对种群大小不敏感。”

这是原文,就算你超过了50个粒子,也对其不敏感,只是增加你matlab程序的时间。


尾声

希望我这些天的困惑解答会对同为研究相关问题的你有帮助!!!👍

不明白清楚的也可以在评论区积极探讨呀!😊


2024.07.31更新

关于对称/非对称反余弦学习因子的问题

对称/非对称反余弦学习因子的公式是在文章开头的那本由李丽、牛奔写的书当中得来的,书上也显示他们的个人学习因子C1是前期小后期大,社会学习因子C2则反之,但是实际情况应该正好相反,于是我对他们给出的公式产生了怀疑。我找来了他们两引用的原文章看(陈水利,蔡国榕,郭文忠,等.PSO算法加速因子的非线性策略研究[J].长江大学学报(自科版)理工卷,2007,(04):1-4+16+172.)果然,文章中画出来的图是和我想象中的一样,C1前期大后期小,C2则反之,与书中的图产生了矛盾,如下图:

那么文章中的关于公式是如何表示的呢?论文截图如下:

其中C1max=0.5,C2max=2.5;C1min=2.5,C2min=0.5(对于对称反余弦加速因子)

乍看公式和书上的确实不同,但是结合公式下面的那一段文字,发现其实李丽、牛奔书上写错的地方就是社会学习因子减号书中写成了加号。我放上他们两书上给出的对称反余弦学习因子公式好对比:

C_1start=2.5,C_1end=0.5

C_2start=0.5,C_2end=2.5

如果按照上面这个公式进行绘图,则学习因子随迭代次数的动态变化如下图所示:

从上面两张图像可以看出,李丽牛奔按照论文作者的思想给出的公式和作者文中画出来学习因子变化因子的变化趋势是相反的,于是我有理由相信,不仅是李丽牛奔没有想到,竟然是原论文作者解释的时候解释错了。原论文中的max应该是我们的start,min是我们的end,于是我按照这个思想重新编写公式(社会因子C2公式的减号改回来了)并进行绘图: 

C_1start=2.5,C_1end=0.5

C_2start=0.5,C_2end=2.5

 可以看出C1的图像已经是正确的了,但是C2的图像起始点还是有点不对。最后改一下就能达到效果了,在不断的试错和纠正中,终于找到正确的表达式了,最后正确的C1、C2公式如下:

上文第一个问题Q1给出的就是修正过后的正确的学习因子公式。

没想到书和论文的作者还给我整这种幺蛾子,科研人就是要有这种打破沙锅问到底的精神!!!😊


其他惯性权重/学习因子

随着看的论文越多,发现上文中的书里面的公式还很局限,我把新的好的放在下面。

正弦余弦学习因子

C_1start=2,C_1end=1

[1]吴素珍,郑群雄,毕建平.自适应粒子群算法汽车传动系统参数优化匹配[J/OL].机械设计与制造,1-6.

“借助正弦函数令学习因子C1在探索中期达到最大,且持续时间也较长,即让粒子的多样性达到最大并提供充足的时间促进粒子去搜寻最优解,而在搜索的前后期适当降低C1的值,保持种群粒子的多样性,避免粒子陷入最优解 无法跳出。对于学习因子C2,借助余弦函数令其随迭代次数的增加而增加,使粒子进行信息共享的能力逐渐增强,鼓励粒子在搜索后期达到收敛。”

改正后的基于正切函数的惯性权重

又发现书里面的一个错误了,关于基于正切函数的惯性权重,原来的公式如下:

绘制出来的图像如下图的洋红色曲线。 

 书中写能够保证w惯性权重介于0.4到0.9之间,当T=1时,w(t)=0.9,当T=Tmax时,w(t)=0.4。但是明显从上图看是不对的。于是我按图索骥,总觉得跟tanX=1时候,这个X值有关,还真是45°的弧度值为0.785398rad,应该是作者不小心把这个写错了。于是有下面这个正确公式和图像:

### 使用PSO算法在Simulink中优化PID控制器参数 #### 粒子群优化PSO)简介 粒子群优化是一种基于群体智能的全局随机搜索算法,模拟鸟群觅食行为来寻找最优解。该算法通过个体之间的协作和信息共享实现复杂问题求解[^1]。 #### Simulink环境下的PSO-PID联合设计流程 为了利用PSO算法优化PID控制器中的比例(P)、积分(I)、微分(D)三个增益系数,在MATLAB/Simulink环境中具体实施步骤如下: - **构建仿真模型** 首先建立被控对象及其对应的闭环控制系统框图,并加入待调参的PID模块作为控制器部分。 - **定义适应度函数** 设计合理的评价体系用于衡量每次迭代产生的候选方案优劣程度。通常情况下会选择综合考虑调节时间、超调量、稳定精度等多个方面表现情况的目标函数形式。例如最小化加权后的平方误差累积值: \[ J=\int_{0}^{T}(e(t))^2dt+\alpha\cdot(\text{overshoot})^2+\beta\cdot t_r \] 其中\( e(t)\)表示跟踪偏差;\(\alpha,\beta\)分别为权重因子;\( T\)为整个仿真的持续时间段长度。 - **编写M文件实现PSO核心逻辑** 下面给出一段简单的Matlab代码片段展示如何创建并运行一个基本版本的PSO程序去自动搜寻最佳KP,KI,KD组合: ```matlab function [bestPosition,bestFitness]=pso_pid_optimization() % 初始化种群规模,最大迭代次数等配置项... for iter=1:maxIterNum fitnessValues=zeros(popSize,1); parfor i=1:popSize currentPos=pops{i}.position; set_param('YourModel/PID Controller','P',num2str(currentPos(1))); set_param('YourModel/PID Controller','I',num2str(currentPos(2))); set_param('YourModel/PID Controller','D',num2str(currentPos(3))); sim('YourModel');% 运行一次完整的动态过程 fitnessValues(i)=calculate_fitness();% 计算当前个体适应度得分 end updatePopulation(fitnessValues);% 更新速度位置向量及历史极值记录 end end ``` 上述伪代码展示了怎样借助`set_param()`命令修改指定路径下组件属性的方法改变各个时刻对应于不同粒子的位置坐标即一组可能成为最终答案的Kp Ki Kd数值集合作为输入变量传递给内部集成好的S-function或者Stateflow图表完成一轮新的计算循环直至达到预设终止条件为止。 - **执行优化过程并与传统手动调试效果对比分析** 经过多轮次演化运算之后能够获得一组相对理想的控制规律参数设置建议供工程师参考采纳进而提高整体自动化水平降低人为因素干扰风险提升产品质量稳定性加快项目开发进度减少成本开支创造更大经济效益和社会价值[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Hipipi39

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

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

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

打赏作者

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

抵扣说明:

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

余额充值