MATLAB(1)基于遗传算法解决最优化问题及相应的MATLAB遗传工具箱使用

来源:互联网 发布:我要开店淘宝网 编辑:程序博客网 时间:2024/04/29 07:46

MATLAB(1)基于遗传算法解决最优化问题及相应的MATLAB遗传工具箱使用


     摘要:本文将简明扼要的介绍一下遗传算法,并以一个简单的二元一次方程组求解为例,演示用MATLAB工具箱快捷地实现遗传算法。

     对于取最小值的最优化问题,遗传算法借鉴生物遗传现象使具有一定数量的候选解的种群向更好的解进化,该方法是通过种群进化,使得适应度函数代入估计参数后达到最值来得到最优解。借鉴生物种群的进化,遗传算法先随机产生一组初始解,作为初始种群,以数值解为例,这些解都是通过二进制代码存储在计算机中,类似于染色体,于是可以进行生物上的交叉、变异、遗传等。通过对第一代个体选择,保留一些个体并让上一代解“组合”、“变异”、“遗传”,由此产生下一代的解。而每一代中都有个体被淘汰,淘汰的指标就是适应度函数。生物法则“适者生存”,通过目标来建立适应度函数,在每一代中挑选适应度函数值大的个体留下来,对比目标的容许误差,达到目标容许误差,或达到预先设定的遗传代数,则停止计算,返回最优解。
      遗传算法的一个很大的特点就是能跳出极值。对于一些多峰的问题,一些算法极其容易陷入局部最优解而得不到全局最优解。而归功于遗传算法中的变异交叉步骤,遗传算法在每一代中都能不受上一代最优解控制的产生新解,由此为跳出局部最优解提供了途径。
     此外,还有一点想要说明的是,笔者在阅读一些相关资料时,发现准则是适应度函数是取最大值,而实际应用中是让适应度函数取最小值,至少在MATLAB中是这样的。我个人还是比较认可第一种的,因为“适者生存”嘛,自然是适应度高的解应当生存下来。对于第二种,我猜想可能是在实际应用中,为了方便,不区分适应度函数和目标函数,二者混用,确实表达的是一个意思。所幸,这一点在运用时并不会产生什么麻烦。
     起初接触遗传算法时,想到要自己设置种群规模,规定交叉变异遗传方式等等就颇为头疼,幸好后面发现MATLAB有自带的遗传工具箱,下面我就举个简单的例子来演示一下如何使用MATLAB的遗传工具箱。
     对于求解方程组:{x-y-3=0;  3x-8y-14=0}
     为近似求解上述方程组,令 f1=x-y-3; f2=3x-8y-14; f=f1^2+f2^2; 则问题转换为求解使得f取最小值的x,y变量值,f即可当做适应度函数。使用MATLAB2015a的遗传工具箱实现求解。
     首先根据对问题的转换,编写m文件如下:
    
   然后在命令窗口输入:  >>optimtool('ga')   通过此命令来打开遗传工具箱,初始界面如下:
 
  可以看到工具箱主要分为两栏,左边主要是求解的函数的基本信息,右边是对遗传算法中参数的设置。在此例中,我们在Fitness function中输入句柄函数格式@ga1,又因为此例中变量的数目为2(x,y),所以在 number of variables中输入2,而对于下面的Constrains(约束), 由于在此例中变量的取值范围为整个实数域,因而没有约束条件,该部分保持空白即可。

     对于右边对遗传算法参数的设置,我一般都只是更改Population size(种群的规模), Generations(遗传算法运行的总代数,可以理解为遗传到多少代时停止),Stall generations(停滞的代数,可以理解为当连续遗传多少代后适应度函数的加权平均值变化小于Function tolerance时停止计算),Function tolerance(适应度函数值偏差),其他的我基本都是用默认设置,不做更改。当然,有时,也会根据实验对其他参数进行调试,如对精英数量,交叉比例等。在此例中,我们设置Population size 为100,Generations和Stall generations均为200,Function tolerance为1e-100. 同时在Plot functions中勾选best fitness 和best individual如下:

       然后点击偏左下方的Start按钮,运行,最后的结果将显示在左下方的final point中。一次运行的结果如下:



      由于此题的方程组非常简单,笔算可得解为x=2,y=-1, 对比遗传算法的结果可以知道解是非常逼近真实值的,而且智能算法的时间复杂度低,运行效率高。当然在使用遗传算法时,由于算法对初始种群的选取是随机的,因而每次计算结果可能不同,读者必须运行多次,分析结果,将离群点排除后取均值是个不错的选择。
0 0
原创粉丝点击