8.2.2 遗传算法使用方式
遗传算法工具有两种使用方式: 以命令行方式调用遗传算法函数ga。
使用遗传算法工具,从图形用户界面到遗传算法。 本节对这些方式做一个简要的介绍。
8.2.2.1 在命令行调用函数ga
对于在命令行使用遗传算法,可以用下列语法调用遗传算法函数ga:
[x fval] = ga(@fitnessfun, nvars, options)
其中:@fitnessfun 是适应度函数句柄;nvars 是适应度函数的独立变量的个数;options 是一个包含遗传算法选项参数的结构。如果不传递选项参数,则ga使用它本身的缺省选项值。
函数所给出的结果:fval——适应度函数的最终值;x——最终值到达的点。
我们可以十分方便地把遗传算法工具输出的结果直接返回到MATLAB的workspace(工作空间),或以不同的选项从M文件多次调用函数ga来运行遗传算法。
调用函数ga时,需要提供一个选项结构options。后面的有关章节对于在命令行使用函数ga和创建选项结构options提供了详细的描述。 8.2.2.2 通过GUI使用遗传算法
遗传算法工具有一个图形用户界面GUI,它使我们可以使用遗传算法而不用工作在命令行方式。为了打开遗传算法工具,可键入
gatool
打开的遗传算法工具图形用户界面如图8.2所示。
137
显示参数描述 输入适应度函数 输入适应度函数 的变量数目 开始遗传算法 显示结果
图8.2 遗传算法工具
为了使用遗传算法工具,首先必须输入下列信息: Fitness function(适应度函数)——欲求最小值的目标函数。输入适应度函数的形式为@fitnessfun,其中fitnessfun.m是计算适应度函数的M文件。在前面“编写待优化函数的M文件”一节里已经解释了如何编写这种M文件。符号@产生一个对于函数fitnessfun的函数句柄。
Number of variables(变量个数)——适应度函数输入向量的长度。对于“编写待优化函数的M文件”一节所描述的函数My_fun,这个参数是2。
点击Start按钮,运行遗传算法,将在Status and Results(状态与结果)窗格中显示出相应的运行结果。
在Options窗格中可以改变遗传算法的选项。为了查看窗格中所列出的各类选项,可单击与之相连的符号“+”。
8.2.3 举例:Rastrigin函数
本节介绍一个例子,讲述如何寻找Rastrigin函数的最小值和显示绘制的图形。Rastrigin函数是最常用来测试遗传算法的一个典型函数。Rastrigin函数的可视化图形显示,它具有多个局部最小值和一个全局最小值,遗传算法可以帮助我们确定这种具有多个局部最小值函数的最优解。
8.2.3.1 Rastrigin函数
138
具有两个独立变量的Rastrigin函数定义为
2Ras(x)?20?x12?x2?10(cos2?x1?cos2?x2)
Rastrigin函数的图形如图8.3所示。
工具箱包含一个M文件,即rastriginsfcn.m,是用来计算Rastrigin函数值的。
全局最小点[0,0]
图8.3 Rastrigin函数图形
如图8.3所示,Rastrigin函数有许多局部最小值——在图上显示为“谷底(valleys)”。然而,该函数只有一个全局最小值,出现在x-y 平面上的点[0,0]处,正如图中竖直线指示的那样,函数的值在那里是0。在任何不同于[0,0]的局部最小点处,Rastrigin函数的值均大于0。局部最小处距原点越远,该点处Rastrigin函数的值越大。
Rastrigin函数之所以最常用来测试遗传算法,是因为它有许多局部最小点,使得用标准的、基于梯度的查找全局最小的方法十分困难。
图8.4所示是Rastrigin函数的轮廓线,它显示出最大最小交替变化的情形。
139
局部最小点 局部最小点 全局最小点[0,0] 图8.4 Rastrigin函数的轮廓线
8.2.3.2 寻找Rastrigin函数的最小值
本节解释如何使用遗传算法来寻找Rastrigin函数的最小值。
注意:因为遗传算法使用随机数据来进行它的搜索,所以该算法每一次运行时所返回的结果会稍微有些不同。
为了查找最小值,进行下列步骤:
在命令行键入gatool,打开遗传算法工具。
在遗传算法工具的相应栏目,输入适应度函数和变量个数。在“Fitness function(适应度函数)”文本框中,输入@rastriginsfcn;在“Number of variables(变量个数)”文本框中,输入2,这就是Rastrigin函数独立变量的个数。这一步操作如图8.5所示。
图8.5 输入适应度函数与变量个数
在“Run solver(运行求解器)”窗格中,单击Start按钮,如图8.6所示。
图8.6 单击运行求解器Start按钮
在算法运行的同时,“Current generation(当前代数)”文本框中显示出当前的代数。通过点击“暂停(Pause)”按钮,可以使算法临时暂停一下。当这样做的时候,该按钮的名字变为
140