目录
前言
Q1:惯性权重ω如何设置比较好?学习因子C1和C2如何设置?
Q2:迭代速度边界设定一定能够遍历(/覆盖)整个PID参数二维空间范围吗?还是说需要与迭代次数相关?迭代次数越高,范围越大?
Q3:PID位置边界是一致比较方便寻优吗?如果我设置Kp范围为[0,100],而Ki和Kd的范围为[0,1],这样子的设置对寻优有很大影响吗?
Q4:如果PID位置边界我都设置为[0,10],速度边界怎么设置更好?[-1,1],[-5,5],[-10,10],速度边界的设置与迭代找到最优解的计算机求解速度有关联吗?
尾声
前言
当我再一次想要认认真真研究一下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比较好)
典型线性递减惯性权重
线性微分递减惯性权重
随机变化惯性权重
非线性动态惯性权重
(k取3比较好)
基于正切函数的惯性权重
(k取0.6比较好)
基于反切函数的惯性权重
(k取0.4比较好)
学习因子:
固定学习因子
(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:
首先,速度边界的设定,Vmax和Vmin为大小相等的相反数;
其次,速度边界的设定没有固定就是某一个值的说法,速度边界设定与位置边界设定有关,如果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程序的时间。
尾声
希望我这些天的困惑解答会对同为研究相关问题的你有帮助!!!👍
不明白清楚的也可以在评论区积极探讨呀!😊