最近研究了智能算法,略有收获,下面说一下我的收获,如有错误,请大家批评指正,不胜感激。
因目前主流麻雀算法主要以matlab进行展示,但为了理解更加深入,我以C#重新进行书写并展示。
目的:以麻雀算法计算一个最优PID参数,用来控制一个函数模型,使输出波形与输入波形一致。如下图所示:
当输入波形是一个正弦函数时,受不同PID参数的影响,输出波形也截然不同。如下图,这是我随意设置的一个函数模型,随便整了个PID参数进行控制后的结果:
输入波形 :Finput(x)= 100*sin(x);
PID控制器参数:kp:0.052,ki:0.043,kd:0.048
函数模型:
输出波形 即:
底层框架就是这些,以人工经验,多次调整PID参数后,应该可以得出一个优解,但今天主题是麻雀算法,所以在这些底层函数上,需要以麻雀算法计算出一个最优解。
根据网上大多数人对麻雀算法的拆分,可以将麻雀算法分为四个部分:
发现者、追随者、报警者、以及适应度函数
主要逻辑就是随机生成100(种群数量)个PID参数组,然后带入适应度函数计算出最优适应度,然后根据发现者、追随者、报警者三个公式计算更新PID参数,然后不断排列取优,在经过多次迭代后,取出最优解。
前三者网上都有固定的公式,只要将其套入使用,基本没有什么差别。公式详情可以百度,可以参考下面的连接,至于用C#如何实现可以看我的代码。
(46条消息) 基于麻雀算法求解函数最优解_小小初心的博客-CSDN博客
主要是适应度函数,如何在PID控制器中成立,这里我借鉴了下面这位大哥的文章:
(46条消息) 智能优化算法应用:基于麻雀搜索算法PID参数优化 - 附代码_智能算法研学社(Jack旭)的博客-CSDN博客_pid优化算法
实现方法也很简单粗暴,如下描述:
将PID参数带入底层模型运行10个周期,即可计算出适应度Fout大小。
完工后,对C#的窗体进行操作,再加个定时器就可以看到麻雀算法迭代时的PID参数对曲线的影响了:如下
这是麻雀算法第一次迭代生成的PID参数组,对函数模型的影响,可以看出完全没有正弦的样子,适应度Fout也达到了七百多万。
(下列红框中,2代表迭代次数,Fout:代表当前最优解的适应度大小,适应度越小代表曲线越近似正弦,后续三个参数分别是PID参数中的Kp、Ki、Kd。)
但是在经过100次迭代后,可以看到PID参数对曲线的影响,很快就取到了一个相对优秀的解。适应度由七百多万降低到了十八万左右(186818)。
接下来我们看一千多次迭代后的PID参数组,可以看出此时的麻雀算法,已经算出了一个比较优秀的解,PID控制下的输出曲线也近似完美的正弦。适应度更是由十八万降低到俩万以下(19969)
再次迭代一千次后,如下图,适应度仅降低至19703,比一千次迭代前仅降低了266,说明整个麻雀算法已经收敛,目前输出已经近似最优解了,再迭代下去也影响不大。
如下图,我们迭代至五千次后,输出基本没有什么改变,适应度也仅降低至19701,整个麻雀算法已经完全收敛,再迭代下去也没有任何意义。当前PID参数组就是最适合目前函数模型的最优解。
下面我们来看一组动态图,看看麻雀算法迭代过程中的曲线变化趋势:
代码如下: