最新发布的MATLAB 7.0 Release 14已经包含了一个专门设计的遗传算法与直接搜索工具箱(Genetic Algorithm and Direct Search Toolbox,GADS)。使用遗传算法与直接搜索工具箱,可以扩展MATLAB及其优化工具箱在处理优化问题方面的能力,可以处理传统的优化技术难以解决的问题,包括那些难以定义或不便于数学建模的问题,可以解决目标函数较复杂的问题,比如目标函数不连续、或具有高度非线性、随机性以及目标函数没有导数的情况。
本章8.1节首先介绍这个遗传算法与直接搜索工具箱,其余各节分别介绍该工具箱中的遗传算法工具及其使用方法。
8.1 遗传算法与直接搜索工具箱概述
本节介绍MATLAB的GADS(遗传算法与直接搜索)工具箱的特点、图形用户界面及运行要求,解释如何编写待优化函数的M文件,且通过举例加以阐明。
8.1.1 工具箱的特点
GADS工具箱是一系列函数的集合,它们扩展了优化工具箱和MATLAB数值计算环境的性能。遗传算法与直接搜索工具箱包含了要使用遗传算法和直接搜索算法来求解优化问题的一些例程。这些算法使我们能够求解那些标准优化工具箱范围之外的各种优化问题。所有工具箱函数都是MATLAB的M文件,这些文件由实现特定优化算法的MATLAB语句所写成。
使用语句
type function_name
就可以看到这些函数的MATLAB代码。我们也可以通过编写自己的M文件来实现来扩展遗传算法和直接搜索工具箱的性能,也可以将该工具箱与MATLAB的其他工具箱或Simulink结合使用,来求解优化问题。
工具箱函数可以通过图形界面或MATLAB命令行来访问,它们是用MATLAB语言编写的,对用户开放,因此可以查看算法、修改源代码或生成用户函数。
遗传算法与直接搜索工具箱可以帮助我们求解那些不易用传统方法解决的问题,譬如表查找问题等。
遗传算法与直接搜索工具箱有一个精心设计的图形用户界面,可以帮助我们直观、方便、快速地求解最优化问题。 8.1.1.1 功能特点
遗传算法与直接搜索工具箱的功能特点如下:
(1) 图形用户界面和命令行函数可用来快速地描述问题、设置算法选项以及监控进程。 (2) 具有多个选项的遗传算法工具可用于问题创建、适应度计算、选择、交叉和变异。 (3) 直接搜索工具实现了一种模式搜索方法,其选项可用于定义网格尺寸、表决方法和搜索方法。
(4) 遗传算法与直接搜索工具箱函数可与MATLAB的优化工具箱或其他的MATLAB程序结合使用。
(5) 支持自动的M代码生成。 8.1.1.2 图形用户界面和命令行函数
133
遗传算法工具函数可以通过命令行和图形用户界面来使用遗传算法。直接搜索工具函数也可以通过命令行和图形用户界面来进行访问。图形用户界面可用来快速地定义问题、设置算法选项、对优化问题进行详细定义。
遗传算法与直接搜索工具箱还同时提供了用于优化管理、性能监控及终止准则定义的工具,同时还提供大量标准算法选项。
在优化运行的过程中,可以通过修改选项来细化最优解,更新性能结果。用户也可以提供自己的算法选项来定制工具箱。 8.1.1.3 使用其他函数和求解器
遗传算法与直接搜索工具箱与MATLAB及优化工具箱是紧密结合在一起的。用户可以用遗传算法或直接搜索算法来寻找最佳起始点,然后利用优化工具箱或用MATLAB程序来进一步寻找最优解。通过结合不同的算法,可以充分地发挥 MATLAB 和工具箱的功能以提高求解的质量。对于某些特定问题,使用这种方法还可以得到全局(最优)解。 8.1.1.4 显示、监控和输出结果
遗传算法与直接搜索工具箱还包括一系列绘图函数用来可视化优化结果。这些可视化功能直观地显示了优化的过程,并且允许在执行过程中进行修改。
工具箱还包括一系列绘图函数用来可视化优化结果。这些可视化功能直观地显示了优化的过程,并且允许在执行过程中进行修改。该工具箱还提供了一些特殊绘图函数,它们不仅适用于遗传算法,还适用于直接搜索算法。适用于遗传算法的函数包括函数值、适应度值和函数估计。适用于直接搜索算法的函数包括函数值、分值直方图、系谱、适应度值、网格尺寸和函数估计。这些函数可以将多个绘图一并显示,可直观方便地选取最优曲线。另外,用户也可以添加自己的绘图函数。
使用输出函数可以将结果写入文件,产生用户自己的终止准则,也可以写入用户自己的图形界面来运行工具箱求解器。除此之外,还可以将问题的算法选项导出,以便日后再将它们导入到图形界面中去。 8.1.1.5 所需的产品支持
遗传算法与直接搜索工具箱作为其他优化方法的补充,可以用来寻找最佳起始点,然后可以再通过使用传统的优化技术来进一步寻找最优解。
工具箱需要如下产品支持:(1) MATLAB。(2) 优化工具箱。 8.1.1.6 相关产品
与遗传算法与直接搜索工具箱相关的产品有: (1) 统计工具箱——应用统计算法和概率模式。 (2) 神经网络工具箱——设计和仿真神经网络。
(3) 模糊逻辑工具箱——设计和仿真基于模糊逻辑的系统。 (4) 金融工具箱——分析金融数据和开发金融算法。 8.1.1.7 所需的系统及平台
遗传算法和直接搜索工具箱对于对于运行环境、支持平台和系统的需求,可随时通过访问网站http://www.mathworks.com/products/gads了解最新发布的信息。
这里介绍的MATLAB 7.0 Release 14所需的最低配置是:Windows系列操作系统,Pentium III 500 CPU、64MB RAM,空闲硬盘空间600MB以上。
8.1.2 编写待优化函数的M文件
134
为了使用遗传算法和直接搜索工具箱,首先必须编写一个M文件,来确定想要优化的函数。这个M文件应该接受一个行向量,并且返回一个标量。行向量的长度就是目标函数中独立变量的个数。本节将通过实例解释如何编写这种M文件。 8.1.2.1 编写M文件举例
下面的例子展示了如何为一个想要优化的函数编写M文件。假定我们想要计算下面函数的最小值:
2f(x1,x2)x122x1x26x1x26x2
M文件确定这个函数必须接受一个长度为2的行向量X,分别与变量x1和x2相对应,并且
返回一个标量X,其值等于该函数的值。为了编写这个M文件,执行如下步骤:
(1) 在MATLAB的File菜单中选择New菜单项。
(2) 选择M-File,将在编辑器中打开一个新的M文件。 (3) 在该M文件中,输入下面两行代码:
function z = my_fun(x)
z = x(1)^2 - 2*x(1)*x(2) + 6*x(1) + x(2)^2 - 6*x(2); (4) 在MATLAB路径指定的目录中保存该M文件。 为了查看该M文件是否返回正确的值,可键入
my_fun([2 3]) ans = -5 注意:在运行遗传算法工具或模式搜索工具时,不要使用编辑器或调试器来调试目标函数的M文件,否则会导致在命令窗口出现Java异常消息,并且使调试更加困难。 8.1.2.2 最大化与最小化
遗传算法和直接搜索工具箱中的优化函数总是使目标函数或适应度函数最小化。也就是说,它们求解如下形式的问题:
minimizef(x)
x如果我们想要求出函数f(x)的最大值,可以转而求取函数g(x)=-f(x)的最小值,因为函数g(x)最小值出现的地方与函数f(x)最大值出现的地方相同。
2例如,假定想要求前面所描述的函数f(x1,x2)x122x1x26x1x26x2的最大值,这时,
我们应当编写一个M文件来计算,求函数
2g(x)f(x1,x2)(x122x1x26x1x26x2)
的最小值。
8.1.2.3 自动代码生成
遗传算法与直接搜索工具箱提供了自动代码生成特性,可以自动生成求解优化问题所需
要的M文件。例如,图8.1所示的就是使用遗传算法工具的自动代码生成特性所产生的M文件。
另外,图形用户界面所输出的优化结果可以作为对来自命令行调用代码的一种解释,这些代码还用于使例程和保护工作自动化。
135
图8.1 遗传算法M文件代码的自动生成
8.2 使用遗传算法工具初步
遗传算法与直接搜索工具箱包含遗传算法工具和直接搜索工具。从本节至章末,将主要介绍其中的遗传算法工具及其使用方法。
本节主要介绍遗传算法工具使用的初步知识,内容包括:遗传算法使用规则,遗传算法工具的使用方式,举例说明如何使用遗传算法来求解一个优化问题,解释遗传算法的一些基本术语,最后阐述遗传算法的工作原理与工作过程。
8.2.1 遗传算法使用规则
遗传算法是一种基于自然选择、生物进化过程来求解问题的方法。遗传算法反复修改对于个体解决方案的种群。在每一步,遗传算法随机地从当前种群中选择若干个体作为父辈,并且使用它们产生下一代的子种群。在连续若干代之后,种群朝着优化解的方向进化。我们可以用遗传算法来求解各种不适宜于用标准优化算法求解的优化问题,包括目标函数不连续、不可微、随机或高度非线性的问题。
遗传算法在每一步使用下列三类规则从当前种群来创建下一代: (1) 选择规则(Selection rules),选择对下一代种群有贡献的个体,称为父辈。 (2) 交叉规则(Crossover rules),将两个父辈结合起来构成下一代的子辈种群。 (3) 变异规则(Mutation rules),施加随机变化给父辈个体来构成子辈。
遗传算法与标准优化算法主要在两个方面有所不同,它们的比较情况归纳于表8.1中。
表8.1 遗传算法与标准优化算法比较
标准算法 每次迭代产生一个单点,点的序列逼近一个优化解 通过确定性的计算在该序列中选择下一个点 遗传算法 每次迭代产生一个种群,种群逼近一个优化解 通过随机进化选择计算来选择下一代种群 136
8.2.2 遗传算法使用方式
遗传算法工具有两种使用方式:
(1) 以命令行方式调用遗传算法函数ga。
(2) 使用遗传算法工具,从图形用户界面到遗传算法。 本节对这些方式做一个简要的介绍。 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 遗传算法工具
为了使用遗传算法工具,首先必须输入下列信息:
(1) Fitness function(适应度函数)——欲求最小值的目标函数。输入适应度函数的形式为@fitnessfun,其中fitnessfun.m是计算适应度函数的M文件。在前面“编写待优化函数的M文件”一节里已经解释了如何编写这种M文件。符号@产生一个对于函数fitnessfun的函数句柄。
(2) 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)20x12x210(cos2x1cos2x2)
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函数的最小值。
注意:因为遗传算法使用随机数据来进行它的搜索,所以该算法每一次运行时所返回的结果会稍微有些不同。
为了查找最小值,进行下列步骤:
(1) 在命令行键入gatool,打开遗传算法工具。
(2) 在遗传算法工具的相应栏目,输入适应度函数和变量个数。在“Fitness function(适应度函数)”文本框中,输入@rastriginsfcn;在“Number of variables(变量个数)”文本框中,输入2,这就是Rastrigin函数独立变量的个数。这一步操作如图8.5所示。
图8.5 输入适应度函数与变量个数
(3) 在“Run solver(运行求解器)”窗格中,单击Start按钮,如图8.6所示。
图8.6 单击运行求解器Start按钮
在算法运行的同时,“Current generation(当前代数)”文本框中显示出当前的代数。通过点击“暂停(Pause)”按钮,可以使算法临时暂停一下。当这样做的时候,该按钮的名字变为
140
“Resume(恢复)”。为了从暂停处恢复算法的运行,可单击这个“Resume”按钮。
当算法完成时,“Status and results”窗格出现如图8.7所示的情形。
最终点的适应度函数值 最终点
图8.7 状态与结果显示
“Status and results”窗格显示下列信息: (1) 算法终止时适应度函数的最终值:
Fitness function value: 0.0067749206244585025
注意:所显示的值非常接近于Rastrigin函数的实际最小值0。“遗传算法举例”一节描述了一些方法,可以用来得到更接近实际最小值的结果。
(2) 算法终止的原因:
Optimization terminated:
maximum number of generations exceeded.
即退出的原因是:超过最大代数而导致优化终止。
在本例中,算法在100代后结束,这是 “Generations(代数)” 选项的缺省值,此选项规定了算法计算的最大代数。
(3) 最终点,在本例中是[0.00274 -0.00516]。 8.2.3.3 从命令行查找最小值
为了从命令行查找Rastrigin函数的最小值,可键入
[x fval reason] = ga(@rastriginsfcn, 2)
这将返回
x =
0.0027 -0.0052 fval =
0.0068 reason =
Optimization terminated:
maximum number of generations exceeded.
其中:x是算法返回的最终点;fval是该最终点处适应度函数的值;reason是算法结束的原因。 8.2.3.4 显示绘制图形
“Plots(绘图)”窗格可以显示遗传算法运行时所提供的有关信息的各种图形。这些信息可以帮助我们改变算法的选项,改进算法的性能。例如,为了绘制每一代适应度函数的最佳值和平均值,选中复选框“Best fitness(最佳适应度)”,如图8.8所示。
141
图8.8 绘图对话框
当点击Start按钮时,遗传算法工具显示每一代适应度函数的最佳值和平均值的绘制图形。当算法停止时,所出现的图形如图8.9所示。
最佳值 0.0067796 平均值 0.014788
图8.9 各代适应度函数的最佳值和平均值
在每一代中,图的底部的点表示最佳适应度值,而其上的点表示平均适应度值。图的顶部还显示出当前一代的最佳值0.0067796和平均值0.014788。
为了得到最佳适应度值减少到多少为更好的直观图形,我们可以将图中y轴的刻度改变为对数刻度。为此,需进行如下操作:
(1) 从绘图窗格的Edit(编辑)菜单中选择“Axes Properties(坐标轴属性)”,打开属性编辑器,如图8.10所示。
142
单击Y表项 选择对数刻度
图8.10 绘图属性编辑器
(2) 点击Y表项。
(3) 在“Scale(刻度)”窗格,选择“Log (对数)”。 绘制的图形如图8.11所示。
最佳值0.0067796 平均值0.014788 143
图8.11 每一代适应度函数最佳值和平均值的对数图形
典型情况下,在早期各代中,当个体离理想值较远时,最佳值会迅速得到改进。在后来各代中,种群越接近最佳点,最佳值改进得越慢。
8.2.4 遗传算法的一些术语
本节解释遗传算法的一些基本术语,主要包括: (1) 适应度函数(Fitness Functions)。 (2) 个体(Individuals)。
(3) 种群(Populations)和代(Generations)。
(4) 适应度值(Fitness Values)和最佳适应度值(Best Fitness Values); (5) 父辈和子辈(Parents and Children)。 8.2.4.1 适应度函数
所谓适应度函数就是想要优化的函数。对于标准优化算法而言,这个函数称为目标函数。该工具箱总是试图寻找适应度函数的最小值。
我们可以将适应度函数编写为一个M文件,作为输入参数传递给遗传算法函数。 8.2.4.2 个体
一个个体是可以施加适应度函数的任意一点。一个个体的适应度函数值就是它的得分或评价。例如,如果适应度函数是
f(x1,x2,x3)(2x11)2(3x24)2(x32)2
则向量(2, -3, 1)就是一个个体,向量的长度就是问题中变量的个数。个体(2, -3, 1)的得分是f(2, -3, 1) = 51。
个体有时又称为基因组或染色体组(genome),个体的向量项称为基因(genes)。 8.2.4.3 种群与代
所谓种群是指由个体组成的一个数组或矩阵。例如,如果个体的长度是100,适应度函数中变量的个数为3,我们就可以将这个种群表示为一个100×3的矩阵。相同的个体在种群中可以出现不止一次。例如,个体(2, -3, 1)就可以在数组的行中出现多次。
每一次迭代,遗传算法都对当前种群执行一系列的计算,产生一个新的种群。每一个后继的种群称为新的一代。 8.2.4.4 多样性
多样性或差异(Diversity)涉及一个种群的各个个体之间的平均距离。若平均距离大,则种群具有高的多样性;否则,其多样性低。在图8.12中,左面的种群具有高的多样性,亦即差异大;而右面的种群多样性低,亦即差异小。
144
图8.12 种群多样性比较
多样性是遗传算法必不可少的本质属性,这是因为它能使遗传算法搜索一个比较大的解的空间区域。
8.2.4.5 适应度值和最佳适应度值
个体的适应度值就是该个体的适应度函数的值。由于该工具箱总是查找适应度函数的最小值,所以一个种群的最佳适应度值就是该种群中任何个体的最小适应度值。 8.2.4.6 父辈和子辈
为了生成下一代,遗传算法在当前种群中选择某些个体,称为父辈,并且使用它们来生成下一代中的个体,称为子辈。典型情况下,该算法更可能选择那些具有较佳适应度值的父辈。
8.2.5 遗传算法如何工作
本节简要介绍遗传算法的工作原理或工作过程,内容包括:算法要点;初始种群;生成下一代;后一代的绘图;算法的停止条件。 8.2.5.1 算法要点
下面的要点总结了遗传算法是如何工作的: (1) 首先,算法创建一个随机种群。
(2) 接着,算法生成一个新的种群序列,即新的一代。在每一步,该算法都使用当前一代中的个体来生成下一代。为了生成新一代,算法执行下列步骤:
(a) 通过计算其适应度值,给当前种群的每一个成员打分。
(b) 确定原来的适应度值的比例尺度,将其转换为更便于使用的范围内的值。 (c) 根据它们的适应度选择父辈。
(d) 由父辈产生子辈。子辈的产生可以通过随机改变一个单个父辈,亦即变异(mutation)来进行,也可以通过组合一对父辈的向量项,亦即交叉(crossover)来进行。
(e) 用子辈替换当前种群,形成下一代。
(3) 最后,若停止准则之一得到满足,则该算法停止。关于停止准则,可参见“8.2.5.7 算法的停止条件”一节。
145
8.2.5.2 初始种群
遗传算法总是以产生一个随机的初始种群开始,如图8.13所示。
图8.13 初始种群
在本例中,初始种群包含20个个体,这恰好是“Population(种群)”选项中的“Population size(种群尺度)”的缺省值。
注意:初始种群中的所有个体均处于图上右上角的那个象限,也就是说,它们的坐标处于0和1之间,这是因为“Population”选项中的“Initial range(初始范围)”的缺省值是[0; 1]。
如果已知函数的最小点大约位于何处,就可以设置一个适当的“Initial range”,以便使该点处于那个范围的中间附近。例如,如果确信Rastrigin函数的最小值在点[0,0]附近,那么就可以直接设置“Initial range”为[-1;1]。然而,正如本例所显示的那样,即使没有给“Initial range”设置一个理想的值,遗传算法也还是能够找到那个最小值。 8.2.5.3 产生下一代
在每一步,遗传算法使用当前种群来产生子辈,即获得下一代。算法在当前种群中选择一组个体,称为父辈,这些个父辈将其genes——亦即其向量中的项——贡献给它们的子辈。遗传算法通常选择那些具有较好适应度值的个体作为父辈。我们可以在“Selection(选择)”选项的“Selection function(选择函数)”文本框中指定遗传算法用来选择父辈的函数。
遗传算法对于下一代产生三类子辈: (1) 优良子辈(Elite children),是在当前代中具有最佳适应度值的那些个体。这些个体子辈存活到下一代。
(2) 交叉子辈(Crossover children),是由一对父辈向量组合产生的。 (3) 变异子辈(Mutation children),是对一个单个父辈引入随机改变即变异产生的。 图8.14表示了这三个类型的子辈。
146
优良子辈 交叉子辈 变异子辈 图8.14 三类子辈
在“8.3.3.5变异与交叉”一节解释如何指定遗传算法产生的每一类子辈的数目,以及用来执行完成交叉和变异的函数。 8.2.5.4 交叉子辈
算法通过组合当前种群中的父辈对(Pair)来产生交叉子辈。在子辈向量的每一个相同位置处,缺省的交叉函数在两个父辈之一的相同位置处随机选择一项,即基因,并将它指派给其子辈。 8.2.5.5 变异子辈
算法通过随机改变个体父辈中的基因而产生变异子辈。按照缺省,算法给父辈增加一个高斯分布的随机向量。
图8.15表示出初始种群的子辈,也即第二代种群,并且指出它们是否为优良子辈、交叉子辈或变异子辈。
147
图8.15 初始种群的子辈
后代图形绘制
图8.16展示出在迭代60次, 80次, 95次, 100次时的种群的图形。 148
8.2.5.6
图8.16 在迭代60, 80, 95, 100次时的种群
随着代数的增加,种群中的个体靠近在一起,且逼近最小值点[0,0]。 8.2.5.7 算法的停止条件
遗传算法使用下列5个条件来确定何时停止:
(1) Generations(代数)——当产生的代的数目达到规定的代数的值时,算法停止。 (2) Time limit(时限)——在运行时间的秒数等于时限时,算法停止。 (3) Fitness limit(适应度限)——当适应度函数的值对于当前种群的最佳点小于或等于适
149
应度限时,算法停止。
(4) Stall generations(停滞代数)——在连续繁殖的时间序列中,若长时间不繁殖新代,亦即目标函数无改进,到达停滞代数规定的代数时,则算法停止。
(5) Stall time limit(停滞时限)——在秒数等于停滞时限的时间间隔期间,若目标函数无改进,则算法停止。
若这5个条件中任何一个条件一旦满足,则该算法停止。我们可以在遗传算法工具的“Stopping criteria(停止标准)”选项中指定这些标准的值。它们的缺省值如图8.17所示。
图8.17 停止标准的缺省值
当运行遗传算法时,“Status(状态)”面板显示这些导致算法停止的标准。
“Time limit(时限)”选项与“Stall time limit”选项可以用来防止算法运行过长的时间。如果算法由于这两个条件之一而停止,则可以通过相应增加“Time limit”或“Stall time limit”的值来改善运行的结果。
8.3 使用遗传算法工具求解问题
本节首先概括使用遗传算法工具GUI的一般步骤,然后介绍如何从命令行使用遗传算法工具,最后通过例子,详细说明如何使用遗传算法工具来求解优化问题。
8.3.1 使用遗传算法GUI
在前面一章,已经介绍了使用遗传算法工具的初步知识。本节将简要归纳使用遗传算法工具GUI来求解优化问题的一般步骤,内容包括:打开遗传算法工具;在遗传算法工具中定义问题;运行遗传算法;暂停和停止运算;图形显示;创建用户图形函数;复现运行结果;设置选项参数;输入输出参数及问题;从最后种群继续运行遗传算法。 8.3.1.1 打开遗传算法工具
在MATLAB窗口中输入gatool,打开、进入遗传算法工具,初启时的界面显示如图8.18所示。
150
图8.18 遗传算法工具初启时的界面
8.3.1.2 在遗传算法工具中定义问题
在下列两个文本框中定义所要解决的问题:
(1) 适应度函数——求解的问题是求目标函数的最小值。输入一个计算适应度函数的M文件函数的句柄。
(2) 变量个数——适应度函数的独立变量个数。
注意:当运行遗传算法工具时不要用“Editor/Debugger(编辑/调试)”功能来调试目标函数的M文件,而要从命令行直接调用目标函数或把M文件输入到遗传算法函数ga。为了方便调试,可以在遗传算法工具中把问题输出到MATLAB工作窗中。
如图8.19所示,输入前面章节所介绍的Rastrigin函数或my_fun函数作为适配度函数,它们的变量个数为2。
图8.19 输入适应度函数与变量个数
8.3.1.3 运行遗传算法
151
要运行遗传算法,在“ Run solver(运行求解器)”中单击Start按纽,如图8.20所示。
图8.20 单击Start按钮
这时,在“Current generation(当前代)”文本框中显示当前代的数目,在Status and results”窗格显示“GA running”等信息,如图8.23所示。
图8.21 当前代数和状态与结果窗格
当遗传算法停止时,“Status and results”窗格显示: (1) “GA terminated(GA终止)”信息。 (2) 最后一代最佳个体的适应度函数值。 (3) 算法停止的原因。 (4) 最终点的坐标。
图8.22显示当运行例子“Rastrigin 函数”遗传算法停止时的信息。
图8.22 Rastrigin函数的遗传算法运行结果
在遗传算法工具中,当遗传算法运行时可以更改多个参数设置。所做的改变将被应用到下一代,即在下一代将按照新设置的参数运行。在下一代开始但尚未应用改变的参数之前,在“Status and results”窗格显示信息“Changes pending”。而在下一代开始且应用了改变的参数时,在“Status and results”窗格显示信息“Changes applied”。这样在遗传算法运行时更改了参数
152
设置产生的输出信息如图8.23所示。
图8.23 遗传算法运行时更改了参数设置
8.3.1.4 暂停和停止运算
遗传算法的暂停和停止运行,可以通过下面操作继续运行: (1) 单击按钮“Pause(暂停)”,算法暂停运行。该按钮上的文字变为“Resume(恢复)”。单击这个“Resume” 按钮,即恢复遗传算法继续运行。
(2) 单击按钮“Stop”,算法停止运行。“Status and results”窗口显示停止运行时当前代最佳点的适应度函数值。
注意:如果单击按钮“Stop”,然后通过单击按钮“Start”再次运行时,遗传算法将以新的随机初始种群或在“Initial population(初始种群)”文本框中专门指定的种群运行。如果需要在算法停止后能再次恢复运行,则可以通过交替地单击按钮“Pause”和“Resume”来控制算法暂停或继续运行。
遗传算法的停止运行常常是通过设置算法停止准则来进行控制的。使用停止准则,设置停止准则参数,可以解决遗传算法在何时停止运行的控制问题。这样,也就不用通过单击“Stop” 按钮来人为地控制算法运行的停止。遗传算法有五个停止准则或条件,其中任何一个条件满足,算法即停止运行。这些停止准则是:
(1) 代数——算法运行到规定的代数。 (2) 时限——算法运行到规定的时间。
(3) 适应度限——当前代的最佳适应度值小于或等于规定的值。 (4) 停滞代数——适应度函数值在运行规定的代数后没有改进。 (5) 停滞时限——适应度函数值在运行规定时间后没有改进。
如果想使算法一直运行到按下按钮“Pause”或“Stop”时才停下来,可以改变这些停止准则的参数值:
(1) 设置“Generations(代数)”为 Inf。 (2) 设置“Time”为 Inf。
(3) 设置“Fitness limit”为 –Inf。 (4) 设置“Stall generations”为 Inf。 (5) 设置“Stall time limit”为 Inf。 图8.24显示了这些更改后的设置。
153
图8.24 改变停止准则参数
注意:在命令行中调用遗传算法函数ga时,并不使用这些参数设置,就好像是不按下 “Ctrl + C”键,函数就会永远运行而不会停止。其实相反,可以设置“Generations”或者“Time”做为限值来控制算法停止运行。 8.3.1.5 图形显示
图8.25为“Plots(绘图)”窗格,可以用来控制显示遗传算法运行结果变化的图形。
图8.25 在绘图窗格选择输出项
选择所要显示的图形参数的复选框。例如,如果选择“Best Fitness(最佳适应度)”和“Best individual(最佳个体)”,运行例子“Rastrigin 函数”,其显示输出如图8.26所示。
154
图8.26 Rastrigin函数最佳适应度与最佳个体
图8.28上部离散点为每一代的最佳适应度值和平均适应度值,下部柱型图表示当前代最佳适应度值对应的点的坐标。
注意:当要想显示两个以上参数项的图形时,可选择相应参数项的复选框,单独打开一个较大的图形窗口即可。
8.3.1.6 举例——创建用户绘图函数
如果工具箱中没有符合想要输出图形的绘图函数,用户可以编写自己的绘图函数。遗传算法在每次运行时调用这个函数,画出图形。这里举例说明怎样创建一个用户绘图函数来显示从前一代到当前代最佳适应度值的变化情形,内容包括:创建绘图函数,使用绘图函数,绘图函数如何作用。
(1)创建绘图函数
为了创建绘图函数,在MATLAB编辑器中复制、粘贴下列代码到一个新的M文件。
Function state = gaplotchange(options, state, flag)
% GAPLOTCHANGE Plots the change in the best score from the % previous generation.
persistent last_best % Best score in the previous generation if (strcmp(flag,'init')) % Set up the plot
set(gca,'xlim',[1, options.Generations],'Yscale','log'); hold on;
xlabel Generation
title('Change in Best Fitness Value') end
best = min(state.Score); % Best score in the current generation if state.Generation == 0 % Set last_best to best。
155
last_best = best; else
change = last_best - best;% Change in best score last_best = best;
plot(state.Generation,change,'.r'); title(['Change in Best Fitness Value'])
end
然后在MATLAB 路径下将其存为M文件gaplotchange.m。 (2)使用绘图函数
为了使用用户绘图函数,在”绘图(Plots)”窗格中选择“Custom function(定制函数)”,并且在其右边的文本框中输入函数名@gaplotchange。为了对用户绘图函数输出的最佳适应度值图形进行比较,在这里也选择“Best Fitness”。现在,如果运行例子函数Rastrigin,显示出来的图形如图8.27所示。
最佳值 0.0021904 平均值 0.49832 最佳适应度值的变化
图8.27 用户绘图函数输出的Rastrigin函数运行结果
注意:因为图中下半部的y-轴为对数刻度,所以图形中的离散点仅仅显示大于零的点。对数刻度能显示适应度函数的微小变化,而上面的图形则不能显示出微小变化。
(3)绘图函数如何作用
绘图函数使用包含在下面结构体中的信息,它们由遗传算法传递给绘图函数作为输入参数:
① options(参数)— 当前参数设置。 ② state(状态)— 关于当前代的信息。
③ flag(曲线标志)— 曲线表示为对数等的当前状态。 绘图函数的主要作用可以描述如下:
persistent last_best
生成永久变量last_best ——即前一代的最佳值。永久变量保存着多种图形函数调用类型。
156
set(gca, 'xlim',[1,options.Generations], 'Yscale', 'log');
在遗传算法运行前建立图形。options.Generation为代数的最大值。
best = min(state.Score)
state.Score包含当前代中所有个体的得分值,变量best是其中最小的得分值。结构体状态文本框的完整描述可参见“8.4.1.1 图形参数”一节。
change = last_best - best
变量change是前一代的最佳值减去当前代的最佳值。
plot(state.Generation,change,'.r')
画出当前代的变化曲线,变量维数包含在state.Generation中。
函数gaplotchange的代码包含了函数gaplotbestf代码中许多相同成分,函数gaplotbestf生成最佳适应度图形。 8.3.1.7 复现运行结果
为了复现遗传算法前一次的运行结果,选择“Use random states from previous run(使用前一次运行的随机状态)”复选框。这样就把遗传算法所用的随机数发生器的状态重新设置为前一次的值。如果没有改变遗传算法工具中的所有设置,那么遗传算法下一次运行时返回的结果与前一次运行的结果一致。
正常情况下,不要选择“Use random states from previous run”这个复选框,可以充分利用遗传算法随机搜索的优点。如果想要分析特定的运行结果或者显示相对个体的精确结果,可以选择“Use random states from previous run”复选框。 8.3.1.8 设置选项参数
设置遗传算法工具使用时的选项参数有两种方法:一种是在遗传算法工具GUI的“Options”窗格中直接进行设置,另一种是在MATLAB工作窗口中通过命令行方式进行设置。
在参数“Options”窗格中设置遗传算法的各种运行参数,如图8.28所示。每一类参数对应有一个窗格,单击该类参数时,对应窗格展开。例如,点击“Population”参数选项,种群窗格展开来,可以逐一设置其中的参数项,如Population type(种群类型)、Population size(种群尺度)、Creation function(创建函数)、Initial population、Initial score(初始得分)、Initial range(初始范围)等。
此外,其他选项参数类还有:Fitness scaling(适应度测量)、selection、Reproduction、Mutation、Crossover、Migration(迁移)、Hybrid function(混合函数)、Stopping criteria、Output function(输出函数)、Display to command window(显示到命令窗口)、Vectorize(向量化)等。这些参数类各自对应一个参数窗格,点击后相应窗格随即展开,可以进行参数项的设置。
所有变量参数的含义及详细描述可参见“8.4.1 遗传算法参数”一节。
157
图8.28 选项参数窗口
在MATLAB工作窗口中,可以将遗传算法的运行参数设置为变量。
对于数值参数的设置,可以直接在相应编辑框中输入该参数的值,或者在包含该参数值的MATLAB工作窗口中输入相应变量的名字,就可以完成设置。例如,可以利用下面两种方法之一设置“Initial point(初始点)”为[2.1 1.7]:
(1) 在“Initial point”文本框输入[2.1 1.7]。
(2) 在MATLAB工作区输入变量x0 = [2.1 1.7],然后在“Initial point” 文本框输入变量的名字x0。
因为选项参数是比较大的矩阵或向量,所以在MATLAB工作窗口中把参数的值定义为变量一般是比较方便的,也就是说,如果需要,很容易改变矩阵或向量的项。 8.3.1.9 输入输出参数及问题
参数和问题结构可以从遗传算法工具被输出到MATLAB的工作窗口,也可以在以后的某个时间再反过来把它们从MATLAB的工作窗口输入给遗传算法工具。这样就可以保存对问题的当前设置,并可以在以后恢复这些设置。参数结构也可以被输出到MATLAB工作窗口,并
158
且可以再把它们用于命令行方式的遗传算法函数ga。
输入和输出信息通常包含下列各项:
① 问题定义,包括“Fitness function”和“Number of variables(变量个数)”。 ② 当前指定的选项参数。 ③ 算法运行的结果。
下面解释如何输入和输出这些信息。 (1)输出参数和问题
参数和问题可以被输出到MATLAB工作空间,以便以后在遗传算法工具中应用它们。也可以以命令行方式,在函数ga中应用这些参数和问题。
为了输出参数和问题,单击“Export to Workspace(输出到工作空间)”按钮或从File菜单中选择“Export to Workspace”菜单项,这将打开如图8.29所示的对话框。
图8.29 输出对话框
对话框提供下列参数:
① 为了保存问题的定义和当前参数的设置,选择“Export problem and options to a MATLAB structure named(输出问题与参数到已命名的MATLAB结构)”,并为这个结构体输入一个名字。单击OK按钮,即把这个信息保存到MATLAB工作空间的一个结构体。如果以后要把这个结构体输入到遗传算法工具,那么当输出这个结构时,所设置的“Fitness function”和“Number of variables”,以及所有的参数设置都被恢复到原来值。
注意:输出问题之前,如果在“Run solver(运行求解器)” 窗格选中“Use random states from previous run(使用前一次运行的随机状态)”选项,则遗传算法工具将保存上一次运行开始时随机数产生函数rand和randn的状态。然后,在选择了“Use random states from previous run”选项的情况下,输入问题且运行遗传算法,那么输出问题之前的运行结果就被准确地复现了。
② 如果想要遗传算法在输出问题之前从上一次运行的最后种群恢复运行,可选择“Include information needed to resume this run(包括所需信息以恢复本次运行)”。然后,当输入问题结构体并单击Start按钮,算法就从前次运行的最后种群继续运行。为了恢复遗传算法产生随机初始种群的缺省行为,可删除在“Initial population”字段所设置的种群,并用代之以空的中括号‘[ ]’。
注意:当选择了“Include information needed to resume this run”选项,则选择“Use random states from previous run”选项对于输入问题和运行遗传算法时创建的初始种群将不再有任何作用。后者的选项只是指定从新的一次运行开始时再一次复现结果,而不是为了恢复算法的继续运行。
③ 如果只是为了保存参数设置,可选择“Export options to a MATLAB structure named(输出参数到已命名的MATLAB结构)”,并为这个参数结构体输入一个名字。
④ 为了保存遗传算法最近一次运行的结果,可选择“Export results to a MATLAB structure named”,并为这个结果结构体输入一个名字。
159
(2)举例——用输出问题运行函数ga
输出一个问题可参见“8.2.3 举例:Rastrigin函数”一节,在命令行运行遗传算法函数ga,其步骤如下:
① 单击“Export to Workspace”按钮,打开相应对话框。
② 在“Export To Workspace”对话框中的“Export problem and options to a MATLAB structure named”右面的文本框,输入问题结构体的名称,假设为my_gaproblem。
③ 在MATLAB窗口,以my_gaproblem为参数调用函数ga:
[x fval] = ga(my_gaproblem)
则返回结果:
x =
0.0027 -0.0052 fval =
0.0068
调用函数ga可参见 “8.3.2 从命令行使用遗传算法” 一节。 (3)输入参数
为了从MATLAB工作窗中输入一个参数结构体,可从“File”菜单选择“Import Options(输入参数)”菜单项。在MATLAB工作窗中打开一个对话框,列出遗传算法参数结构体的一系列选项。当选择参数结构体并单击“Import(输入)”按钮,在遗传算法工具中的参数域就被更新,且显示所输入参数的值。
创建参数结构体有两种方法:
① 调用函数gaoptimset,以参数结构options作为输出。
② 在遗传算法工具中,从“Export to Workspace(输出到工作空间)”对话框保存当前参数。
(4)输入问题
为了从遗传算法工具输入一个以前输出的问题,可从“File”菜单选择“Import Problem(输入问题)”菜单项。在MATLAB工作窗中,打开一个对话框,显示遗传算法问题结构体的一个列表。当选择了问题结构体并单击OK按钮,遗传算法工具中的下列文本框被更新:
① 适应度函数。 ② 变量个数。 ③ 参数域。 8.3.1.10 举例——从最后种群中继续遗传算法
下面的例子显示如何输出一个问题,以便当输入问题并按下Start按钮时,遗传算法能从该输出问题所保存的最后种群继续运行。现在运行一个例子,在遗传算法工具中输入下面的信息:
① 设置适应度函数为@ackleyfcn,它是计算函数Ackley,是工具箱提供的一个测试函数。 ② 设置“Number of variables”为 10。 ③ 在“Plots”窗格选择“Best fitness”。 ④ 单击按钮“Start”。 显示的结果如图8.30所示。
160
图8.30 函数ackleyfcn的最佳适应度
假定想要实验利用其它的参数运行遗传算法,接着利用当前参数设置,此后再从最后种群重新运行算法。为此,进行以下步骤:
① 单击“Export to Workspace”按钮。 ② 在出现的对话框中:
选择“Export problem and options to a MATLAB structure named”。 在文本框中输入问题和参数的名称,例如ackley_uniform。
选择“Include information needed to resume this run(包括所需信息以恢复本次运行)”。
做了这些选择后的对话框如图8.31所示。
图8.31 在输出窗口对话框中做适当选择
③ 单击OK按钮。
问题和参数被输出到MATLAB工作空间的一个结构体中。在MATLAB命令窗口输入下面的信息就可以观察这个结构体:
161
ackley_uniform ackley_uniform =
fitnessfcn: @ackleyfcn genomelength: 10 options: [1x1 struct]
利用不同的参数设置,甚至是不同的适应度函数,在运行遗传算法之后,都能够按照如下步骤来恢复问题:
① 从“File”菜单,选择“Import Problem ”菜单项。打开的对话框如图8.32所示。
图8.32 GA问题输入窗口
② 选择ackley_uniform。 ③ 单击按钮“Import”。
这样就把“Population”选项中的“Initial population”字段设置成输出问题之前运行的最后种群。在运行期间,所有其它参数恢复它们的设置。当单击Start按钮时,遗传算法从被保存的最后种群重新运行。图8.33所示为初始运行和重新运行的最佳适应度图形。
第一次运行 从这里继续运行
图8.33 初始运行和重新运行的最佳适应度
162
注意:如果在利用所导入问题运行遗传算法之后,想要恢复遗传算法生成一个随机初始种群的缺省行为,可删除“Initial population”字段中设置的种群,而代之以空的中括号‘[ ]’。 8.3.1.11 生成M文件
在遗传算法工具中,要利用特定的适应度函数和参数生成运行遗传算法的M文件,可从“File”菜单选择“Generate M-File(生成M文件)”菜单项,并把生成的M文件保存到MATLAB路径的一个目录。
在命令行调用这个M文件时,返回的结果与利用在遗传算法工具中生成M文件时的适应度函数和参数所得到的结果一致。
8.3.2 从命令行使用遗传算法
使用遗传算法,也可以从命令行运行遗传算法函数ga。这方面的内容主要包括:利用缺省参数运行ga;在命令行设置ga的参数;使用遗传算法工具的参数和问题结构;复现运行结果;以前一次运行的最后种群重新调用函数ga;从M文件运行ga。 8.3.2.1 利用缺省参数运行ga
利用缺省参数运行遗传算法,以下面语句调用ga
[x fval] = ga(@fitnessfun,nvars)
其中:
@fitnessfun — 计算适应度函数值的M文件的函数句柄。 nvars —适应度函数中独立变量的个数。 x — 返回的最终点。
fval — 返回的适应度函数在x点的值。 例如,运行例子Rastrigin函数,从命令行输入
[x fval] = ga(@rastriginsfcn,2)
这将返回
x =
0.0027 -0.0052 fval =
0.0068
为了得到遗传算法更多的输出结果,可以用下面语句调用ga
[x fval reason output population scores] = ga(@fitnessfcn, nvars) 除了输出变量x和fval之外,增加了以下输出变量 (1) “reason(原因)”— 算法停止的原因。
(2) “output(输出)”— 包含关于算法在每一代性能的结构体。 (3) “population(种群)”— 最后种群。 (4) “scores(得分)”— 最终得分值。 8.3.2.2 在命令行设置ga的参数
遗传算法工具中的参数可以指定为任何有效的参数值,设置参数使用下面语句:
[x fval] = ga(@fitnessfun,nvars,options) 使用函数gaoptimset生成一个参数结构体。
options = gaoptimset
返回带有缺省值的参数结构体:
options =
163
PopulationType: 'doubleVector' PopInitRange: [2x1 double] PopulationSize: 20 EliteCount: 2
CrossoverFraction: 0.8000 MigrationDirection: 'forward' MigrationInterval: 20 MigrationFraction: 0.2000
Generations: 100 TimeLimit: Inf fitnessLimit: -Inf StallLimitG: 50 StallLimitS: 20 InitialPopulation: [ ] InitialScores: [ ] PlotInterval: 1
CreationFcn: @gacreationuniform fitnessScalingFcn: @fitscalingrank
SelectionFcn: @selectionstochunif CrossoverFcn: @crossoverscattered MutationFcn: @mutationgaussian HybridFcn: [ ] Display: 'final' PlotFcns: [ ] OutputFcns: [ ] Vectorized: 'off'
如果没有给某一参数项输入新的值,则函数ga使用其缺省值。
每一个参数的值都存放在参数结构体中,例如options.PopulationSize。可以通过输入参数的名称显示参数的值。例如,显示遗传算法种群的大小,可输入
options.PopulationSize ans =
20
改变参数结构体中成员值,例如,设置PopulationSize值等于100,代替它的缺省值20,可输入
options = gaoptimset('PopulationSize',100)
参数结构体中,PopulationSize为100,其它值都为缺省值或当前值。
这时,再输入
ga(@fitnessfun,nvars,options)
函数ga将以种群中个体为100运行遗传算法。
如果想接着改变参数结构体其它成员的值,例如设置PlotFcns为@gaplotbestf,画出每一代最佳适应度函数值图形,则可用下面语句调用函数gaoptimset
options = gaoptimset(options,'PlotFcns',@plotbestf)
这里保持了参数的所有当前值,除PlotFcns之外,它改变为@plotbestf。注意,如果省略输入自变量参数options,那么函数gaoptimset重新置PopulationSize为它的缺省值20。
也可以利用一个语句来同时设置两个参数PopulationSize和PlotFcns:
options = gaoptimset('PopulationSize',100,'PlotFcns',@plotbestf)
164
8.3.2.3 使用遗传算法工具的参数和问题结构
利用函数gaoptimset创建一个参数结构体,在遗传算法工具中设置参数的值,然后在MATLAB工作窗中输出参数给结构体。如果想在遗传算法工具中输出缺省值,则导出的结构体的参数与由命令行得到的缺省结构体的参数一致。
options = gaoptimset
如果想从遗传算法工具输出一个问题结构体ga_problem,可用下面的语句调用函数ga
[x fval] = ga(ga_problem)
问题结构体包含:
(1) fitnessfcn — 适应度函数。 (2) nvars — 问题的变量数。 (3) options — 参数结构体。 8.3.2.4 复现运行结果
因为遗传算法是随机性方法,也就是说,产生随机机率,即每次运行遗传算法得到的结果都会略有不同。算法利用MATLAB随机数产生器函数rand和randn,在每一次迭代中,产生随机机率。每一次函数ga调用rand和randn,它们的状态都可能发生改变,以便下一次再被调用时,它们返回不同的随机数。这就是为什么每次运行后ga输出的结果会略有不同。
如果需要准确复现运行结果,可以在调用函数ga时包含rand和randn的当前状态。在又一次运行ga之前,重新设置这些值的状态。例如,要复现Rastrigin函数的ga的输出,可以利用下面的语句调用ga
[x fval reason output] = ga(@rastriginsfcn,2);
假设某次运行的返回结果为
x =
0.0027 -0.0052 fval =
0.0068
则随机函数rand和randn两者的状态被保存在output结构中。
output =
randstate: [35x1 double] randnstate: [2x1 double] generations: 100 funccount: 2000
message: [1x64 char]
然后,重新设置状态,输入
rand('state',output.randstate); randn('state',output.randnstate);
如果现在再次运行ga,就会得到相同的结果。
注意:如果没有必要复现运行结果,最好不要设置rand和randn的状态,以便能够得到遗传算法随机搜索的益处。
8.3.2.5 以前一次运行的最后种群重新调用函数ga
缺省情况下,每次运行ga时都生成一个初始种群。然而,可以将前一次运行得到的最后种群作为下一次运行的初始种群,这样做能够得到更好的结果。这可以利用下面语句实现:
[x,fval,reason,output,final_pop] = ga(@fitnessfcn,nvars);
最后一个输出变量final_pop返回的就是本次运行得到的最后种群。将final_pop再作为初始种群运行ga,语句为:
165
options = gaoptimset('InitialPop',final_pop);
[x,fval,reason,output,final_pop2] = ga(@fitnessfcn,nvars);
还可以将第二次运行ga得到的最后种群final_pop2作为第三次运行ga的初始种群。 8.3.2.6 从M文件运行ga
利用命令行可以运行遗传算法。使用M文件可以有不同的参数设置。例如,可以设置不同的交叉概率来运行遗传算法,观察、比较每次运行的结果。下面的代码是运行ga函数21次,变量options.CrossoverFraction从0到1,间隔为0.05,所记录的运行结果。
options = gaoptimset('Generations',300);
rand('state',71); % These two commands are only included to randn('state',59); % make the results reproducible. record=[ ]; for n=0 : .05 : 1
options = gaoptimset(options,'CrossoverFraction',n); [x fval]=ga(@rastriginsfcn,10,options); record = [record;fval]; end
可以利用下列语句,以不同概率画出fval值的曲线图形:
plot(0 : .05 : 1,record);
xlabel('Crossover Fraction'); ylabel('fval')
显示结果参见图8.34所示。
图8.34 从M文件运行遗传算法时fval值的曲线图形
从图形显示可以看出,options.CrossoverFraction的值为0.6~ 0.95时,可得到最好结果。 取每次运行得到的fval的平均值,就可以画出fval的光滑曲线,如图8.35所示。
166
图8.35 从M文件运行遗传算法时fval平均值的曲线图形
曲线最凹的部分对应options.CrossoverFraction的值为0.7~ 0.9。
8.3.3 遗传算法举例
为了得到遗传算法的最好结果,一般需要以不同的参数实验。通过不断实验,选择针对问题的最佳参数。有效参数的完整描述可参见 “8.4.1 遗传算法参数”一节。
本节介绍几种能够提高运算效果的参数改变方法,内容包括:种群多样性;适应度测量;选择;复制参数;变异与交叉;设置变异大小;设置交叉概率;相对于全局的局部最小值;使用混合函数;设置最大代数;向量化适应度函数。 8.3.3.1 种群的多样性
决定遗传算法的一个重要性能是种群的多样性。个体之间的距离越大,则多样性越高;反之,个体之间的距离越小,则多样性越低。由试验得到种群的适当多样性。如果多样性过高或者过低,遗传算法都可能运行不好。这里介绍如何设置种群的初始范围来控制种群的多样性,并介绍如何设置种群尺度。
(1) 举例——设置初始范围
遗传算法工具在默认情况下利用生成函数随机生成一个初始种群。使用者可以在“Population”的“Initial range”文本框中指定初始种群的向量范围。
注意:初始范围仅仅限制在初始种群中的点的范围。后续各代包含的点可以不在初始种群的范围之内。
如果知道问题解的大概范围,计算时就可以指定包含问题解的初始范围。但是,假设种群具有足够的多样性,遗传算法就可以找到不在初始范围的解。下面的例子显示初始范围对遗传算法性能的影响。这个例子利用Rastrigin函数,函数在原点取得最小值为0。运行之前在遗传算法工具中设置下列参数:
① 设置适应度函数为 @Rastriginsfcn。
167
② 设置“Number of variables”为 2。
③ 在“Plots”窗格选择“Best fitness(最佳适应度)”。 ④ 在“Plots”窗格选择“Range”。 ⑤ 设置“Initial range”为 [1;1.1]。
然后,单击Start按钮。遗传算法返回最佳适应度值为2,其显示图形如图8.36所示。
图8.36 初始范围为[1; 1.1]时最佳适应度值和平均距离
图8.38上面为每代最佳适应度值变化图,下面为每代个体之间平均距离图,它可以很好地用来衡量种群的多样性。对于初始范围的设置,由于多样性太小,算法进展很小。
第二次,尝试设置“Initial range”为 [1; 100] ,运行算法,得到最佳适应度值大约为3.9,如图图8.37所示。
168
图8.37 初始范围为[1; 100]时最佳适应度值和平均距离
这次,算法进展较快。但是,由于个体之间的平均距离太大,最佳个体远离最优解。 第三次,设置“Initial range”为 [1; 2] ,运行算法。得到最佳适应度值大约为0.012,如图8.38所示。
169
图8.38 初始范围为[1; 2]时最佳适应度值和平均距离
这次由于多样性比较适合这个问题,所以算法得到的结果比前两次都好。 (2)设置种群尺度
在“种群(Population)”参数域中“Size”决定每代种群的大小。增加种群的大小,遗传算法能够搜索更多的点,因此,能够得到较好结果。但是,种群越大,遗传算法每代运行时间越长。
注意:至少应该设置“尺度(Size)”的值为“Number of variables”,以便在每一种群中使个体超出搜索范围。
进行实验时,可以设置不同的种群尺度,不限制运行时间,以期得到最好结果。 8.3.3.2 适应度测量
适应度测量把适应度函数返回的原始适应度得分值转换为适合选择函数的范围内的值。选择函数根据适应度值的大小,选择下一代的父体。选择函数分配大选择概率给适应度值大的个体。适应度测量值的范围影响遗传算法的性能。如果测量值变化范围太大,则具有高测量值的个体复制的速度很快,取代种群基因池的速度很快,防碍了遗传算法搜索解空间的其它区域。相反,如果测量值变化太小,所有个体复制机会基本相同,则搜索过程进展缓慢。
缺省的适应度尺度变换函数为Rank(排序),根据每个个体的顺序而不是它的得分值来变换原始得分值。个体的顺序是它在分类后的位置。最适应的个体的序号为1,次之为2,依次类推。排序尺度变换函数分配尺度值有下列目的:
(1) 个体的尺度值与n成正比。
(2) 整个种群的尺度值的和等于要求生成下一代父体的数目。 排序适应度尺度变换函数避免了初始值的界限的影响。
图8.39所示为具有20个个体的一个典型种群的初始得分值,按升序排序。
170
图8.39 具有20个个体的一个典型种群的初始得分值
图8.40所示为使用尺度变换函数的初始尺度值。
图8.40 使用尺度变换函数的初始尺度值
因为算法按适应度函数的最小化处理,所以低的初始值具有高的尺度值。又因为排序尺度变换只根据个体的顺序分配值的大小,对于一个大小为20、父辈数等于32的群体,显示的
171
尺度值可以是相同的。
可以把排序尺度变换(Rank scaling)与顶级尺度变换(Top scaling)进行比较。为了观察尺度变换的效果,可以把遗传算法利用排序尺度变换得到的结果与利用其它函数(如顶级变换)得到的结果相比较。默认情况下,顶级尺度变换分配4个最佳适应度个体相同的尺度值,等于父辈数除以4,而分配其它个体的尺度值为0。利用默认的选择函数,只有4个最佳适应度个体能被选为父辈。图8.41为比较排序尺度变换与顶级尺度变换得到的尺度值,种群尺度为20,父辈数为32。
图8.41 比较排序尺度变换与顶级尺度变换得到的尺度值
因为Top scaling限制父辈为最佳适应度个体,它产生的种群类型比Rank scaling产生的种群类型少。图8.42所示为每一代Rank scaling与Top scaling得到的个体之间的距离变化的比较。
172
图8.42 排序与顶级尺度变换各代个体之间距离变化之比较
8.3.3.3 选择
选择函数根据个体由适应度尺度变换函数得到的尺度值,为下一代选择父辈。当一个个体为多个子辈贡献它的基因时,它就可能多次被选做父辈。默认的选择函数为Stochastic uniform(随机均匀函数)——在每一父辈画出一条与选择线对应的直线,长度与它的尺度值成比例。算法以等步长在线上移动。在每一步,算法从落入线上的部分分配父辈。
一个比较确定的选择函数是Remainder,由下列两步运行:
首先,函数按照尺度值的整数部分为每个个体选择父辈。例如,假设一个个体的尺度值是2.3,函数选择这个个体两次作为父辈。
其次,在随机均匀选择时,选择函数利用尺度值的小数部分选择剩余的父辈。函数落入选择线内,即长度与个体尺度值的小数部分成比例,在线上按等步长移动来选择父辈。注意,如果尺度值的小数部分都等于0,就象顶级尺度变换一样,选择是完全确定的。 8.3.3.4 复制参数
复制参数控制遗传算法怎样生成下一代。这些参数有:
elite count(优良计数)— 在当前种群中,具有最佳适应度值的个体遗传到下一代的个体数。这些个体称为优良子辈(elite children)。elite count的默认值为2。
当优良计数至少为1时,最佳适应度值可能从一代到下一代减少。这是人们希望的,因为遗传算法使适应度函数最小化。设置elite count为一个大数,可以使得最适应个体控制种群,但可能减小搜索的有效性。
Crossover fraction(交叉概率)— 下一代个体的一小部分,它不是elite children(优良子辈),而是由交叉产生的部分。参见“8.3.3.7 设置交叉概率”一节。 8.3.3.5 变异与交叉
遗传算法运用当前代的个体生成子代个体,构成下一代。除了elite children外,算法还生成下列子代个体:
173
(1) 从当前代中选择两个个体,交换两个个体的某个或某些位(基因),结合后形成交叉子个体。
(2) 随机改变当前代的单个个体形成变异子个体。
这两个过程是遗传算法的主要过程。交叉能够使遗传算法从不同的个体中提取更好的基因,结合到具有优势的子个体中。变异增加了种群的多样性,因而增大了算法生成更高适应度值的个体的可能性。没有变异,算法只能产生由初始种群结合基因的子集构成的个体。
算法生成的子个体类型如下:
(1) Elite count,在“Reproduction”文本框,指定elite children的数目。
(2) Crossover fraction,在Reproduction文本框,指定种群中交叉子个体的概率,它不同于elite children。例如,假设Population size(种群尺度)为20, Elite count为 2,Crossover fraction为 0.8,则下一代子个体类型如下:
① 有2个优良子辈。
② 除优良子辈以外,还有18个个体。所以计算 0.8*18 = 14.4取整得14,得到14个交叉子
个体。
③ 还有4个个体,它们不是elite children,而是变异子个体。 8.3.3.6 设置变异大小
遗传算法应用变异函数(Mutation function)字段中指定的函数进行变异操作。默认的变异函数为高斯函数Gaussian,它把一个从高斯分布选择的随机数,即mutation,加到父辈向量的每一个项上。典型情况下,与分布的标准差成比例的变异大小,在每一后代中都是减小的。通过参数尺度(Scale)和压缩(Shrink),可以控制每一代变异的平均数量。
Scale控制第一代变异的标准差。标准差是Scale乘以初始种群的范围——该范围是使用者由Initial range参数指定的。
压缩(Shrink)控制变异的平均数量的减少率。标准差线性减小,以便标准差等于1 – Shrink乘以它在第一代的值。例如,假设Shrink缺省值为1,则变异数在最后一步减小到0。通过选择绘图函数Distance(距离)和Range能够观察到变异的效果。Rastrigin函数的遗传算法的运行结果如图8.43所示。
图8.43 压缩值为1时Rastrigin函数的距离和范围
图8.45的上部图形显示每一代各点之间的平均距离。当变异数减小时,个体之间的平均距离也减小,在最后一代大约减小到0。图8.45下部图形中的垂直线表示每一代适应度值由最小
174
到最大的范围以及适应度值的平均值。当变异数减小时,适应度值的范围也减小。这些图形显示减少变异数,也就减小了子辈的多样性。
作为比较,图8.44显示当Shrink取为0.5时的Distance和Range的图形。
图8.44 压缩值为0.5时Rastrigin函数的距离与范围
当Shrink设置为0.5时,最后一代的平均变异数减小了一半。同样,个体之间的平均距离也大约减小了一半。 8.3.3.7 设置交叉概率
在Reproduction选项中,由Crossover fraction文本框指定每一种群的一部分,它们不是elite children,而是组成的交叉子个体。取交叉概率等于1,意味着所有子个体都是交叉子个体;取交叉概率等于0,意味着所有子个体都是变异子个体。下面的例子说明,这两个极端设置,都不是有效的函数优化策略。
在这个例子中,定义适应度函数为:
f(x1,x2,,xn)x1x2xn
即点的适应度函数值为所有点的坐标的绝对值之和。
通过设置Fitness function 为@(x) sum(abs(x)),就可以定义为一个无名函数。 运行这个例子时,有关参数设置如下:
① 设置Fitness function为 @(x) sum(abs(x))。 ② 设置Number of variables为10。 ③ 设置Initial range为[-1; 1]。
④ 在Plots窗格,选择Best fitness和Distance。 首先设置Crossover fraction为缺省值0.8,运行算法,得到最佳适应度值大约为0.2,如图8.45所示。
175
图8.45 交叉概率为0.8时函数的适应度值与平均距离
(1)无变异的交叉
为了观察没有变异时遗传算法怎样运行,设置Crossover fraction为1.0,并单击Start按钮,得到的最佳适应度值约等于1.3,如图8.46所示。
最佳个体在第8代产生 所有个体都是相同的
图8.46 无变异的交叉下函数的适应度值与平均距离
在这种情况下,算法选择初始种群中的个体基因,并把它们重新结合起来。因为没有变
176
异,所以算法不能产生任何新的基因。算法利用这些第8代的基因来产生最好的个体,这时最佳适应度图形呈现为水平。此后,它从紧接着的一代选择最佳个体,产生新的最佳个体的副本。到了第17代,种群中的所有个体都相同,也就是说,都变成了最佳个体。当这种情形出现时,个体之间的平均距离为0。由于算法在第8代之后不能改善最佳适应度值,它在50代过后就陷于停滞,因为Stall generations(停滞代数)设置为50。
(2)无交叉的变异
为了查看遗传算法在没有交叉的情形下是如何工作的,设置Crossover fraction为0,并单击Start按钮,得到的最佳适应度值约等于3.5,如图8.47所示。
图8.47 无交叉的变异下函数的适应度值与平均距离
在这种情况下,算法应用的随机变化没有改善第一代最佳个体的适应度函数值。但是,它改善了其它个体的个体基因,可以由图8.49中的上部图形看到适应度函数的平均值逐渐减少,这些改善的基因没有和最佳个体基因结合,因为没有交叉。结果,最佳适应度图形是水平的,并且算法在50代停滞。
(3)比较遗传算法取不同交叉概率时的运行结果
在工具箱有一个演示函数deterministicstudy.m,Crossover fraction分别设置为0、0.2、0.4、0.6、0.8、1,把遗传算法应用到Rastrigin函数,比较不同的运行结果。遗传算法运行10代。对于交叉概率的每一个值,画出每一代之前的所有代的最佳适应度值的均值和标准差。在MATLAB 命令窗口,输入deterministicstudy,当演示结束时,画出图形,如图8.48所示。
177
图8.48 不同交叉概率下最佳适应度值的均值和标准差
图8.48中下面的图形显示10代不同的交叉概率下最佳适应度值的均值和标准差,上边图形的颜色显示每一代的最佳适应度值。对于这个适应度函数,当Crossover fraction等于0.8时得到最好结果。但是,对于其它适应度函数,交叉概率可能取另外的值,才能得到最好结果。 8.3.3.8 举例——相对于全局的局部最小值
有时,优化的目的是要找到函数的全局最小值或最大值——一个点的函数值比搜索空间中其他任何点上的函数值都要小或都要大。但是,最优化算法有时得到的是局部最小值——该点的函数值比它的附近点的函数值小,但是可能比搜索空间的其它点的函数值大。为了克服这个不足,遗传算法的参数必须设置适当。例如,考虑下面的函数
x2当x20 exp[()],f(x)20exp(1)(x20)(x22),当x20函数f (x)的图形如图8.49所示。
178
局部最小值
图8.49 函数f (x)的图形
这个函数有两个局部最小值,当x = 0时,函数值f (x)=-1;当x = 21时,函数值f (x)为
f (x)=-(1+1/e)≈-1.36787944117144
所以,全局最小值是当x = 21时的函数值。
以下列步骤运行遗传算法:
(1) 用MATLAB编辑器将下面的代码复制、粘贴到一个新M文件。
function y = two_min(x) if x<20
y = -exp(-(x/20).^2); else
y = -exp(-1)+(x-20)*(x-22); end
(2) 用MATLAB将这个文件保存为two_min.m。 (3) 在遗传算法工具中,进行如下设置:
设置Fitness function为@two_min。 设置Number of variables等于1。 (4) 单击Start按钮。
遗传算法返回的值,接近局部最小值点x = 0,如图8.50所示。
179
图8.50 函数f (x)的局部最优解
图8.51说明为什么算法得到的是局部最小值,而不是全局最小值。该图画出了每代个体的范围以及最优个体。
最佳值 0.00028487
图8.51 初始范围为[0; 1]时每代个体的范围及最优个体
注意:所有个体的范围为-2~2.5。由于变异,这个范围比缺省Initial range [0;1]大,但是没有大到搜索全局最小值点x = 21的附近。
使遗传算法搜索更大范围的点的一个方法是增加种群的多样性,即增大Initial range。初始范围不一定包含点x = 21,但是它必须足够大,以便算法能产生x = 21附近的个体。设置Initial range为[0;15] ,如图8.52所示。
180
图8.52 设置初始范围为[0; 15]
设置初始范围为[0; 15] 然后,单击Start按钮。遗传算法返回的值非常接近于x=21时的函数值,如图8.53所示。
图8.53 函数f (x)的全部最优解
这一次,图形显示个体更大的范围。在第二代,有大于21的个体,在第12代,算法找到大约等于21的最优个体,如图8.54所示。
181
最佳值 20.9876
图8.54 初始范围为[0; 15]时每代个体的范围及最优个体
8.3.3.9 使用混合函数
混合函数是一个最优化函数。在遗传算法停止后,为了改善适应度函数值,可以使用混合函数。混合函数将遗传算法得到的最后点作为它的初始点。可以在Hybrid function(混合函数)参数域指定混合函数。
作为一个例子,Rosenbrock函数定义为
22f(x1,x2)100(x2x1)(1x1)2 该函数的图形如图8.55所示。
182
在(1,1)点取得最小值
图8.55 Rosenbrock函数
使用函数fminunc——最优化工具箱中的一个无约束条件的最小化函数。首先运行遗传算法找到最优点附近的一个点,然后,将它作为fminunc的初始点。找到Rosenbrock函数的最小值点。
工具箱提供了一个计算该函数值的M文件dejong2fcn.m。为了演示这个例子,在MATLAB编辑窗口提示符下键入
hybriddemo
为了观察这个例子的运行过程,首先键入gatool,打开遗传算法工具,进行下列设置: (1) 设置Fitness function为@dejong2fcn。 (2) 设置Number of variables为2。 (3) 设置Population size为 10。 增加混合函数之前,单击Start按钮,遗传算法在“Status and results”窗口显示出运行结果,如图8.56所示。
183
图8.56 增加混合函数之前的运行结果
最终点的坐标接近问题解的真值(1,1)。在Hybrid function参数文本框中设置Hybrid function为 fminunc(参见图8.57),可以改善这个结果。
图8.57 设置混合函数为fminunc 当遗传算法停止时,函数fminunc得到遗传算法的最终点,作为它的初始点,返回更精确
的结果,显示在Status and results窗口,如图8.58所示。
图8.58 使用混合函数fminunc得到的运行结果
8.3.3.10 设置最大代数
在Stopping criteria(停止准则)参数字段,Generations(代数)参数决定最大代数 。增加Generations,通常可以改善最终结果。例如,改变遗传算法工具中的参数:
(1) 设置Fitness function为@rastriginsfcn。 (2) 设置Number of variables为10。 (3) 在Plots窗口选择Best fitness。 (4) 设置Generations为Inf。
(5) 设置Stall generations(停滞代数)为Inf。 (6) 设置Stall time为Inf。
然后运行遗传算法大约300代,单击Stop按钮。图8.59所示为运行结果Best fitness值的图形。
184
最佳值 5.0444,平均值 48.7926 适应度值注意:遗传算法在第170代时运行停滞—— 170代后适应度函数值没有明显的变化。如果恢复Stall generations为它的缺省值50,算法大约在第230代停止。如果算法重复利用当前代数(Generations)的设置停滞,则可以尝试增加Generations和Stall generations来改善计算结果。然而,改善其它参数可能效果更好。
另外,需要特别注意的是,当Mutation function(变异函数)设置为Gaussian时,增加代数(Generations)的数值,实际得到的最后结果可能更差。这是因为Gaussian变异函数有依赖于Generations的因素,它可能减小每一代的变异平均数。结果导致Generations的设置影响算法的性能。
8.3.3.11 向量化适应度函数
如果向量化适应度函数,遗传算法一般运行较快。也就是说,遗传算法只调用一次适应度函数,希望适应度函数快速计算当前种群的所有个体的适应度值。
为了向量化适应度函数,首先要编写出计算适应度函数的M文件,以便处理具有任意行的一个矩阵,这个矩阵与种群的个体相对应。
例如,适应度函数为
2f(x1,x2)x122x1x26x1x26x2
向量化这个函数,用下面代码写出一个M文件:
z = x(:,1).^2 - 2*x(:,1).*x(:,2) + 6*x(:,1) + x(:,2).^2 - 6*x(:,2);
其中,x中的冒号‘: ’表示x的所有行。所以 x(:,1) 是一个向量。‘ .^’和‘ .* ’为向量元素之间的运算。
其次,设置Vectorize(向量化)参数为On。
注意:适应度函数必须接受任意行数来使用Vectorize参数。 下面是在命令行运行的比较结果,显示出运行速度的改善情况。在这里我们设置Vectorize
185
遗传算法停滞
图8.59 增大代数设置的最佳适应度值
为On。
tic; ga(@rastriginsfcn,20); toc elapsed_time =
4.3660
options = gaoptimset('Vectorize','on'); tic; ga(@rastriginsfcn,20,options); toc elapsed_time =
0.5810
8.4 遗传算法参数和函数
本节详细说明13类遗传算法参数和4个遗传算法函数,最后给出一个标准算法选项的列表作为总结。
8.4.1 遗传算法参数
设置遗传算法参数有两种方法,一种是使用遗传算法工具GUI,另一种是从命令行调用遗传算法函数GA。
(1) 如果使用遗传算法工具GUI,则设置参数可从下拉列表中选择一参数或在一文本字段中输入该参数的值。参见“8.3.1.8 设置选项参数”一节。
(2) 如果从命令行调用函数GA,则设置参数可使用函数gaoptimset来创建参数结构,例如:options = gaoptimset('Param1', value1, 'Param2', value2, ...)。参见“8.3.2.2 从命令行设置ga的参数”一节。
在这一节,每一参数用两种方法列出:出现在遗传算法工具中的是标签;出现在参数结构中的是字段名。
例如:种群类型(Population type)在遗传算法工具中作为参数标签;PopulationType对应参数结构中的字段。
遗传算法参数可划分为以下13类: (1) 图形参数。 (2) 种群参数。
(3) 适应度计算参数; (4) 选择参数。 (5) 再生参数。 (6) 变异参数。 (7) 交叉参数。 (8) 迁移参数。 (9) 混合函数参数。 (10) 停止条件参数。 (11) 输出函数参数。
(12) 显示到命令窗口参数。 (13) 向量参数。 8.4.1.1 图形参数
图形参数工作时可从遗传算法得到图形数据。当选择图形函数并执行遗传算法时,一个图形窗口在分离轴上显示这些图形。可在任意时刻点击图形窗口中的停止按钮停止这个算法。
186
Plot interval(绘图间隔)“PlotInterval”是指定相邻两次调用图形函数时的遗传代数。 (1) 在图形方式可以选择以下任意图形函数:
Best fitness (@gaplotbestf) 画出最佳函数值与代数对。
Expectation(期望值)(@gaplotexpectation)画出与每一代原始得分对应的期望的子代
数。
Score diversity(多样性值)(@gaplotscorediversity)画出每一代的得分直方图。 Stopping(停止)(@plotstopping)画出停止条件水平。
Best individual(@gaplotbestindiv)画出每代中最佳适应度函数个体的向量值。
Genealogy(家系)(@gaplotgenealogy)画出个体的谱系。从一代到下一代线条颜色代
码如下:红线指变异的子辈;蓝线表示交叉的子辈;黑线表示原始的个体。 Scores(@gaplotscores) 画出每一代中个体的得分。
Distance(@gaplotdistance) 画出每一代中个体间的平均距离。
Range(@gaplotrange) 画出每一代中最大、最小、平均适应函数值。 Selection(@gaplotselection) 画出双亲的直方图。
Custom function(自定义函数)能使用自己定义的绘图函数。这个绘图函数只能在遗
传算法工具中使用。选择Custom function;在文本框中输入@myfun,这里myfun是函数名。 当从命令行调用遗传算法函数GA来显示图形时,要设置PlotFcns字段的参数作为图形函数的句柄。例如为了显示最佳适应度图形,设置options(参数)如下:
options = gaoptimset('PlotFcns', @gaplotbestf);
显示多个图形,语法如下:
options =gaoptimset('PlotFcns', {@plotfun1, @plotfun2, ...}); 这里@plotfun1, @plotfun2等等是命令行图形函数名。
(2) 绘图函数的结构
绘图函数的第一行具有如下形式:
function state = plotfun(options, state, flag);
函数的输入变元是:
options——包含当前所有options设置的结构。
state——包含当前种群信息的结构。在下一节“状态结构”中描述了state的各个字段。 flag——一个字符串,标志算法的当前运行阶段。 (3) 状态结构
state结构是图形函数、变异函数和输出函数的输入参数,包含以下字段: Population——当代种群。 Score——当代种群的得分。 Generation——当前代数。 StartTime——GA的开始时间。
StopFlag——包含停止原因的字符串。
Selection——指明被选择出来的优良个体、交叉个体和变异个体。 Expectation——希望选择的个体数。
Best——每一代具有最好得分个体的向量。
LastImprovement——适应度值发生改进的最后一代的代数。 LastImprovementTime——适应度值发生改进的最后时间。 8.4.1.2 种群参数
187
种群参数用于确定遗传算法所用种群的参数。
Population type(PopulationType)指定适应度函数的输入数据类型,可用来设置的Population type为以下值之一:
(1) Double Vector(双精度向量) ('doubleVector'):如果种群中的个体是双精度类型时使用,它是缺省值。
(2) Bit string(位串) ('bitstring'):如果种群中的个体是位串类型时使用。
(3) Custom(自定义)('custom'):如果种群中的个体不是前面两种类型时使用。
(4) 如果使用Custom ('custom')类型,必须自己编写创建、变异和交叉函数来接受这种类型种群输入,并分别在下列域中指定这些函数:
创建函数(Creation function ) (CreationFcn); 变异函数(Mutation function) (MutationFcn); 交叉函数(Crossover function) (CrossoverFcn)。
Population size (PopulationSize)指定在每一代中有多少个个体,使用大的种群尺度,遗传算法搜索解空间能更加彻底,同时减少返回局部最小值而不是全局最小值的机会,然而使用大的种群尺度,会使遗传算法运行更慢。
如果设置Population size为向量,遗传算法将创建多子种群,子种群的数量等于向量的长度,每个子种群的大小是向量的对应项值。
Creation function(创建函数) (CreationFcn)指定为GA创建初始种群的函数,可选择以下函数:
(1) Uniform (@gacreationuniform)创建具有均匀分布的随机初始种群,这是缺省值。 (2) Custom:允许使用自己编写的创建函数,使其生成在Population type中指定的数据类型。如果使用遗传算法工具,必须指定创建函数:
设置Creation function为Custom。
设置Function name(函数名称)为@myfun,这里myfun是函数名。 如果使用GA,其设置如下:
options = gaoptimset('CreationFcn', @myfun); 创建函数必须有以下调用语法:
function Population = myfun(GenomeLength, FitnessFcn, options) 这个函数的输入参数是:
Genomelength:适应度函数中独立变量的个数; FitnessFcn:适应度函数; Options:参数结构。
这个函数返回种群,作为遗传算法的初始种群。
Initial population (InitialPopulation):指定遗传算法的初始种群。缺省值是[ ],这种情况下GA使用Creation function 创建初始种群;如果输入一个非空数组给Initial population域,则这个数组必须是种群尺度(Population size)行和Number of variables列,这种情况遗传算法不调用Creation function)。
种群的Initial scores (InitialScores):指定初始种群的初始值。
Initial range (PopInitRange):指定被创建函数生成的初始种群向量范围,能使用一具有两行Number of variables列矩阵设置Initial range ,每一列具有[lb; ub]形式,这里lb是相对项目的下界,而ub是上界。如果指定Initial range是2×1向量,则每个条目均被扩展,行长度不变,即行长度为Number of variables。 8.4.1.3 适应度比例参数
适应度比例参数是把适应度函数所返回的适应度值转换为适合于选择函数使用范围的值。在“Fitness scaling(适应度比例)”窗格中可以指定适应度比例函数参数。
188
在“Fitness scaling”窗格中,尺度函数选项Scaling function (FitnessScalingFcn) 是一个下拉表,可以从中选择要执行适应度比例的函数参数。这些函数参数是:
(1) Rank(排列)(@fitscalingrank)——缺省的适应度比例函数。Rank函数根据个体适应度值的排列顺序而不是根据个体适应度值的大小来衡量个体的优劣。个体的排列是按个体适应度值排序后的位置。最适合个体的排序为1,次最适合个体的排序为2,依此类推。Rank函数对适应度比例进行排序,从而消除了原始适应度值的影响。
(2) Proportional(比率)(@fitscalingprop)——比率的计算使个体的适应度比例大小与它的适应度值成比例。
(3) Top(最佳)(@fitscalingtop)——计算最佳比例等同于计算最佳个体。选择的这一项后,最佳个体比例显示在另外一个字段“Quantity(数量)”。“Quantity”规定了指派正的比例值的个体数目。“Quantity”可以是从1到种群大小之间的整数;也可以是0到1之间的小数,这个小数是种群大小的百分比,其缺省值是0.4。每个能产生子辈的个体指派给相同的比例值,而其它个体的比例值指派为0。这个比例值具有形式:[0 1/n 1/n 0 0 1/n 0 0 1/n ...]。
在命令行改变“Quantity”的缺省值,可使用如下语句:
options = gaoptimset('FitnessScalingFcn', {@fitscalingtop,quantity})
这里quantity是“Quantity”的值。
(4) Shift linear(线性转换)(@fitscalingshiftlinear)——利用线性转换来衡量适应度值,将使最适应个体的期望值等于个体的平均值乘以一个常数。在“Max survival rate(最大生存率)”字段中,可以设置这个常数。如果选择线性转换,这个字段显示的缺省值是2。
在命令行改变“Max survival rate”的缺省值,可使用下面语句:
options = gaoptimset('FitnessScalingFcn',{@fitscalingshiftlinear, rate})
这里rate是“Max survival rate”的值。
(5) Custom(定制)能够使用户编写自己的尺度函数。可以使用遗传算法工具来指定尺度函数:
设置“Scaling function(尺度函数)”为Custom。
设置“Function name(函数名)”为@myfun,这里myfun是函数名。 如果在命令行使用ga,可使用下面的语句:
options = gaoptimset('FitnessScalingFcn', @myfun);
尺度函数必须遵循下面的语法格式:
function expection = myfun(scores, nParents)
这个尺度函数的输入参数是:
scores——一个标量向量,作为种群的成员。 nParents——这个种群所必需的父辈个体数目。
这个函数返回的期望值expectation是一个与scores长度相同的标量行向量,给出种群中每个成员的尺度值。expectation的总项数必须等于nParents。 8.4.1.4 选择参数
选择参数规定遗传算法怎样为下一代挑选双亲,可用以下方法指定算法函数: Selection function (SelectionFcn)域在面板的Selection参数内,这些参数是:
(1) Stochastic uniform(随机均匀分布) (@selectionstochunif)——缺省的选择函数为Stochastic uniform函数,布局在一条线上,每一父辈根据其刻度值按比率对应线上的一部分。算法以相同大小的步长沿线移动。在每一步,算法根据降落的位置确定一父辈,第一步是一小于步长的均匀随机值。
(2) Remainder(剩余) (@selectionremainder)——剩余选择分配其双亲由每个个体刻度值的整数部分决定,并随后在剩余的小数部分采用轮盘赌选择方法。例如一个个体的刻度值是2.3,由于其整数部分是2,这个个体在父辈表中出现两次。随后这些父辈按刻度值的整数部分
189
进行分配,其余的父辈随机选出。父辈在这一步被选取的概率是刻度值的小数部分。
(3) Uniform(均匀) (@selectionuniform)——均匀选项用父辈的代数和期望值来选择父辈,均匀选择用于调试和测试,但不是一个非常有效的搜索策略。
(4) Roulette(轮盘赌选项)(@selectionroulette) ——轮盘赌选项挑选父辈使用一个模拟的轮盘赌,个体在轮子上所占的区域与个体的期望值成正比,算法使用一个随机数选择一个概率与其相等的区域。
(5) Tournament(锦标赛选项)(@selectiontournament)——锦标赛选项挑选每一个父个体通过挑选“Tournament size(锦标赛大小)”随机数生成器,随后选择它们中缺少的最好的个体加入父辈中,“Tournament size”至少为2,缺省值是4。
在命令行用以下语法来改变缺省值:
options = gaoptimset('SelectionFcn', {@selecttournament, size})
这里“size”是“Tournament size”的值。
(6) Custom——允许编写自己的选择函数,在遗传算法工具中为了指定这个函数,使用: 设置Selection function(选择函数)为“Custom”。
设置“Function name”为@myfun,这里myfun是函数的名称。 如果使用命令行,使用
options = gaoptimset('SelectionFcn', @myfun)
选择函数必须具有以下调用语法:
function parents = myfun(expectation, nParents, options)
这个函数的输入参数是:
expectation(期望值)——期望的子辈个体数量作为种群的成员。 nParents(父辈个体)——选择的父辈个体的数量。 options——遗传算法参数结构。
这个函数返回父辈,它是具有nParents长、包含选择的父辈个体指示的行向量。 8.4.1.5 再生参数
再生参数说明了遗传算法怎样为下一代创建子个体。
Elite count (EliteCount)——指定将生存到下一代的个体数,设置Elite count为一个小于或等于种群尺度的正整数,其缺省值是2。
Crossover fraction (CrossoverFraction)——指定下一代中不同于原种群的部分,它们由交叉产生。Crossover fraction是一个0到1之间的小数,可为输入在文本框中的小数或在滑槽移动的小数。其缺省值是0.8。
可参见“8.3.3.7 设置交叉概率”一节中的例子。 8.4.1.6 变异参数
变异参数说明遗传算法怎样通过小的随机数改变种群中的个体而创建变异的子辈。 变异提供遗传变异功能而使遗传算法搜索更广泛的空间。在“Mutation(变异)”面板的“Mutation function(变异函数)”(MutationFcn)字段来指定变异函数,可选择以下函数: (1) Gaussian(高斯函数)(mutationgaussian)——这是缺省的变异函数“Gaussian”,把一高斯分布、具有均值0的随机数加到父向量的每一项。这个分布的变化由参数“Scale” 和“Shrink(压缩)” 决定。如果选择Gaussian,它们将显示出来,且在“Population” 参数中按照“Initial range”进行设置。
① Scale参数确定第一代的方差,如果设置“Initial range”为1行2列的向量v,其初始方差同所有父向量坐标相同,且由Scale*(v(2) - v(1))给出。如果设置“Initial range”为2行、“Number of variables”列的向量,对父向量坐标为i的初始方差由Scale*(v(i, 2) - v(i, 1))给出。
190
② Shrink参数控制方差怎样随着代而收缩。如果设置“Initial range”为1行2列的向量,则第k代的方差vark是与父向量坐标相同,且由下列公式给出:
varkvark1(1shrink•k)
generations如果设置“Initial range”为2行、“Number of variables”列的向量,对父向量坐标为i的初始方差由下列公式给出:
vari,kvari,k1(1shrink•k )generations如果设置“Shrink”为1,则算法压缩方差接近线性坐标直到最后一代达到0,一个负的“Shrink”引起方差的增长。缺省的Scale和“Shrink”分别是0.5和0.7。在命令行要改变缺省值,可使用如下语法:
options = gaoptimset('MutationFcn', ...{@mutationgaussian, scale, shrink})
这里scale和shrink分别是“Scale”和“Shrink”的值。
(2) Uniform (mutationuniform)——均匀变异是两个过程,第一步算法选择个体变量的一部分进行变异,这里每一项有一Mutation Rate(变异概率),这个Rate的缺省值是0.01;第二步,算法用均匀选择在项目范围中选择一随机数替换每个选中的项目。在命令行要改变Rate的缺省值,可使用如下语法:
options = gaoptimset('MutationFcn', {@mutationuniform, rate}) 这里rate是Rate的值。
(3) Custom——自定义允许使用自己的变异函数,使用遗传算法工具时,指定变异函数使用如下:
设置“Mutation function”为Custom。
设置“Function name”为@myfun,这里myfun是自己设计的变异函数名。 如果使用ga函数,则用options = gaoptimset('MutationFcn', @myfun);语法。自定义的变异函数必须有如下调用格式:
function mutationChildren = myfun(parents, options, nvars,FitnessFcn, … state, thisScore, thisPopulation)。
这个函数的自变量是:
parents——被选择函数选择出的父辈的行向量。 options——参数结构。 nvars——变量数。
FitnessFcn——适应度函数。
State——包含当前种群信息的结构(在“状态结构”中描述了state域)。 ThisScore——许多当前种群的向量。
ThisPopulation——当前种群的个体矩阵。
这个函数返回mutationChildren——变异的子辈,就象一个矩阵,其行对应子孙,矩阵的列数就是“Number of variables”。 8.4.1.7 交叉参数
交叉参数说明遗传算法如何组合两个个体或双亲为下一代形成一交叉的子个体。 Crossover function (CrossoverFcn)指明进行交叉的函数,可以选择以下函数:
191
(1) Scattered(分散)(@crossoverscattered):这是一个缺省的交叉函数,它创建一个二进制向量,这个向量某位是1,则这个基因从第一个父辈中来,如为0则从第二个父辈中来,组合这些基因而形成一子个体。例如:P1,P2是父辈,
p1 = [a b c d e f g h] p2 = [1 2 3 4 5 6 7 8]
这个二进制向量是[1 1 0 0 1 0 0 0],则函数返回如下子辈个体: child1 = [a b 3 4 e 6 7 8]
(2) Single point (@crossoversinglepoint)——单点交叉,它在1到“Number of variables”之间选择一随机数n,随后:
在第一个父辈中选择序号小于或等于n的向量项。 在第2个父辈中选择序号大于n的向量项。 连接这些项目形成一子辈。
例如,父辈P1,P2是 p1 = [a b c d e f g h] p2 = [1 2 3 4 5 6 7 8]
且交叉点是3,则函数返回下列子辈:
child = [a b c 4 5 6 7 8]
(3) Two point (@crossovertwopoint)——两点交叉,它在1到“Number of variables”之间选择两个随机数m和n,函数选择:
在第一个父辈中选择序号小于或等于m的向量项。 在第二个父辈中选择序号包括在m+1到n的向量项。 序号大于n的向量项也来自于第一个父辈。
算法连接这些基因形成单一基因,例子如下,例如父辈P1,P2是: p1 = [a b c d e f g h] p2 = [1 2 3 4 5 6 7 8]
且交叉点是3和6,则函数返回的子辈是
child = [a b c 4 5 6 g h]
(4) Intermediate (@crossoverintermediate)——通过父辈的加权平均值来创建子辈。可通过一简单参数“Ratio(比率)”指定权值,“Ratio”可能是一标量或具有“Number of variables”长的行向量,缺省值是向量的每个值均为1,这个函数使用下列公式从双亲计算出子辈:
child = parent1 + rand * Ratio * ( parent2 - parent1) 如果“Ratio”的所有项值均在[0,1]范围内,产生的子辈限于由父母的相对顶点定义的立体空间中,如果“Ratio”不在这个范围,则子辈可能位于这个空间之外。如果“Ratio”是一个标量,则所有子辈都将位于父母间的一直线上。在命令行方式改变“Ratio”的缺省值,可使用以下语法:
options = gaoptimset('CrossoverFcn', ...{@crossoverintermediate, ratio}) 在这里,ratio是“Ratio”的值。
(5) Heuristic (@crossoverheuristic)——返回的子辈位于包含父辈的直线上,离父辈不远的距离上有较好的适应度,在同一方向上远离父辈,则有较差的适应度,可以使用参数“Ratio”指定子辈离较好适应度的父辈有多远,这个参数是在选择启发式(Heuristic)时出现。“Ratio”的缺省值是1.2,如果父辈是parent1和parent2,而parent1有较好的适应度,这个函数返回的子辈如下:
192
child = parent2 + Ratio * (parent1 - parent2)
在命令行改变“Ratio”的缺省值,使用如下语法:
options=gaoptimset('CrossoverFcn',{@crossoverheuristic, ratio})
在这里,ratio是“Ratio”的值。
(6) Custom——自定义函数,允许使用自己定义的交叉函数。在遗传算法工具中,可使用如下方法指定交叉函数:
设置“Crossover function”为 Custom。
设置“Function name”为@myfun,这里myfun是自定义的函数名。
如果使用GA,设置options = gaoptimset('CrossoverFcn', @myfun)。 自定义函数必须有如下调用格式:
xoverKids = myfun(parents, options, nvars, FitnessFcn, unused, thisPopulation)
在这里,函数的自变量是:
parents——通过选择函数来选择双亲的行向量。 options——参数结构。
nvars——Number of variables(基因数)。 FitnessFcn——适应度函数。 Unused——保留,未使用。
ThisPopulation——表示当前种群的矩阵。这个矩阵的行数是“Population size(种群尺
度)”,列数是“变量个数(Number of variables)”。 这个函数返回xoverKids,即交叉的子辈,是一个矩阵,每行对应子辈,其列数是“Number
of variables”。 8.4.1.8 迁移参数
Migration(迁移)指明个体在子种群间怎样移动,如果设置“Population size”给一长度大于1的向量,则迁移发生。当迁移发生时,一个子种群中最好的个体代替另一子种群中最差的个体,个体从一个子种群迁移到另一子种群是复制,即在源子种群中并没有被移走。 可以通过“Migration”参数面板中下面三个字段来控制迁移的发生:
(1) “Direction(方向)” (MigrationDirection)——迁移发生在一个或两个方向。
如果设置“Direction”为Forward ( 'forward'),则迁移发生在下一个种群,也就是第N个子种群迁移到第N+1个子种群。
如果设置“Direction”为Both ('both'),则第N个子种群迁移到第N-1个子种群和N+1个子种群。
迁移在最后一个子种群处将卷绕回来,即最后一个子种群迁移到第一个子种群,第一个迁可以迁移到最后一个子种群。为了防止卷绕,在确定的种群尺度下,在种群尺度向量的最后添加一0项,指示一大小为0的子种群。
(2) “Interval(间隔)” (MigrationInterval)——指明在两次迁移间要经过多少代,例如设置Interval为20,则每隔20代就发生迁移。
(3) “Fraction(百分比)” (MigrationFraction)——指明在两个子种群间有多少个个体迁移。“百分比”指明两个迁移子种群中较小子种群的个体迁移百分比。例如:如果个体从一个有50个个体的子种群迁移到一个有100个个体的子种群中,且fraction设置为0.1,则发生迁移的个体数是0.1 * 50 = 5。 8.4.1.9 混合函数参数
混合函数是运行在遗传算法终止后的另一个最小化函数,可在“Hybrid function(混合函
193
数)”(HybridFcn)参数中指定混合函数。混合函数有以下选择:
(1) [ ]——没有混合函数。
(2) fminsearch (@fminsearch)——使用MATLAB函数fminsearch。 (3) patternsearch (@patternsearch)——使用模式搜索。
(4) fminunc (@fminunc)——使用优化工具箱函数fminunc。 8.4.1.10 停止条件参数
停止条件决定什么引起算法的终止,可以指明以下参数:
(1) “Generations”——指明算法最大重复执行次数,缺省值是100;
(2) “Time limit” (TimeLimit)——指明算法停止执行前的最大时,以秒为单位;
(3) “Fitness limit(适应度限)” ( FitnessLimit)——最好适应度值小于或等于“适应度限(Fitness limit)”则算法终止;
(4) “Stall generations(停滞代数)” (StallGenLimit)——如果适应度值在“Stall generations”指明的代数没有改进,则算法停止;
(5) “Stall time(停滞时间)” (StallTimeLimit)——如果最好适应度值在“Stall time”时间间隔内没有改进,则算法终止。 8.4.1.11 输出函数参数
输出函数在每一代返回来自遗传算法的输出到命令行。
“History to new window(记录到新窗口)”(@gaoutputgen)——每到“Interval”的倍数重复在新窗口显示由算法计算的历史点。
“Custom”——允许使用自己的输出函数,在遗传算法工具中使用以下方法指明输出函数:
选择“Custom function(自定义函数)”。 在文本框输入@myfun,这里myfun是函数名。
如果使用GA,则设置options = gaoptimset('OutputFcn', @myfun)。 在MATLAB命令行键入
edit gaoutputfcntemplate
则可使用模板编写自己的输出函数。
下面描述输出函数结构,输出函数有如下调用语法:
[state, options, optchanged] = myfun(options, state, flag, interval) 函数有如下输入参数: options——参数结构。
state——包含当前代信息的结构。
flag——指明算法当前状态的字符串,有如下形式:
- 'init'——初始状态。 - 'iter'——算法运行状态。 - 'done'——算法终止状态。
interval——可选的interval自变量。
输出函数返回如下结果变量:
state——包含当前代信息的结构。
options——被输出函数修改的参数结构,这个参数是可选的。 optchanged——指示options是否改变的标志。 8.4.1.12 显示到命令窗口参数
194
'Display' (显示级别)——指明遗传算法运行时,在命令行显示的信息数,有效的参数是: Off ('off')——只有最终结果显示。
Iterative ('iter')——显示每一次迭代的有关信息。
Diagnose ('diagnose')——不但显示每一次迭代的有关信息,而且列出参数缺省值已经
被改变的有关信息。
Final ('final')——遗传算法的结果(成功与不成功)、停止的原因、最终点。 Iterative与Diagnose两者显示如下信息: Generation——代数。
f-count——适应函数估价的累计数。 Best f(x)——最佳适应度值。 Mean f(x)——平均适应度值。
Stall Generations——停滞代数,即最后一次改进适应度函数以来的代数。 显示级别的缺省值是:
Off——遗传算法工具中。
'final'——使用gaoptimset创建的参数结构中。 8.4.1.13 向量参数
向量参数指明适应度函数的计算是否被向量化。如果设置“Fitness function is vectorized(适应度函数向量化)”(Vectorized)为Off,则遗传算法在每次循环中计算新一代个体的适应度值。如果设置“Fitness function is vectorized”为On,则遗传算法计算新一代个体的适应度值时只调用适应度函数一次,这样就比在每次循环中计算个体的适应度值更快。但是,使用这个参数,适应度函数必须能够接收具有任意行数的输入矩阵。
8.4.2 遗传算法函数
本节介绍遗传算法工具的四个函数的功能、格式及其详细说明,这四个函数为:ga、gaoptimget、gaoptimset和gatool。 8.4.2.1 函数ga
功能:用遗传算法搜索函数最小值。 格式:
x = ga(fitnessfun, nvars) x = ga(fitnessfun, nvars, options) x = ga(problem) [x, fval] = ga(...) [x, fval, reason] = ga(...) [x, fval, reason, output] = ga(...)
[x, fval, reason, output, population] = ga(...) [x, fval, reason, output, population, scores] = ga(...) 详细说明:
ga在命令行实现遗传算法求目标函数的最小值。
x = ga(fitnessfun, nvars) 把遗传算法应用到优化问题,这里fitnessfun是最小化的目标函数,nvars是找到的最优个体答案向量x的长度
195
x = ga(fitnessfun, nvars, options) 把遗传算法应用到优化问题,使用在参数结构中那些选项参数。
x = ga(problem),为problem找最小值,problem结构有下列三个字段: fitnessfcn——适应度函数;
nvars——适应度函数的独立变量个数; options——用gaoptimset创建的参数结构。 [x, fval] = ga(...)返回fval,是适应度函数在x处的值。
[x, fval, reason] = ga(...),返回reason,它是一包含算法终止原因的字符串。
[x, fval, reason, output] = ga(...),返回output,是一包含每一代输出和算法执行的其它信息的结构,这个输出结构包含以下字段:
randstate——遗传算法启动之前rand的状态,rand是MATLAB随机数生成器。
randnstate——遗传算法启动之前randn的状态,randn是MATLAB普通随机数生成器,可使用randstate和randnstate值复制GA的输出。 generations——计算的代数。
funccount——适应度函数的估算次数。
message——算法终止的原因,它与输出变量reason相同。 语句[x, fval, reason, output, population] = ga(...) 返回population,为种群矩阵,rows是最后的种群。
语句[x, fval, reason, output, population, scores] = ga(...) 返回值scores,是最终种群的得分值。
注意:对problems使用的种群类型是双精度型向量,ga并不接受输入是复数型向量的函数,为了解决包括复数数据的问题,可以编写自己的函数,即把复数的实部和虚部分开,变为ga能接受的实数向量。
举例:
[x fval, reason] = ga(@rastriginsFcn, 10) x =
Columns 1 through 7
0.9977 0.9598 0.0085 0.0097 -0.0274 -0.0173 0.9650 Columns 8 through 10 -0.0021 -0.0210 0.0065 fval =
3.7456 reason =
generations 参见:gaoptimset, gatool。 8.4.2.2 函数gaoptimget
功能:得到遗传算法参数结构值 格式:
val = gaoptimget(options, 'name') 详细说明:
val = gaoptimget(options, 'name') 返回参数name的值,name来自遗传算法参数的结构参数。 如果name的值没有在参数中指明,则gaoptimget(options, 'name')返回一空的矩阵。它只需
196
要能唯一定义name的足够的前导字符,gaoptimget忽略参数name中的大小写。
参见:ga, gatool。 8.4.2.3 函数gaoptimset
功能:创建遗传算法参数结构
格式:
options = gaoptimset gaoptimset
options = gaoptimset('param1',value1,'param2',value2,...) options = gaoptimset(oldopts,'param1',value1,...) options = gaoptimset(oldopts,newopts) 详细说明:
options = gaoptimset (无输入参数),创建一称为options的选项参数结构,它包含遗传算法的参数,并设置这些参数为缺省值。
Gaoptimset,无输入或输出变量参数,显示具有有效值的参数的完整列表。
options = gaoptimset('param1',value1,'param2',value2,...),创建一结构options,并设置其它值'param1'为value1, 'param2'为value2,等等。在这里,只需要给出能唯一定义参数名的足够的前导字符,任何未指定的参数设置均使用它们的缺省值。参数名中的大小写被忽略。
options = gaoptimset(oldopts, 'param1', value1,...),创建一oldopts拷贝,修改指定的参数具有指定的值。
options = gaoptimset(oldopts, newopts),用一新的参数结构newopts组合一存在的参数结构oldopts,在newopts中任意参数的非空值覆盖oldopts中对应的参数。
参数:
表8.3列出了能用gaoptimset设置的参数,在“遗传算法参数”一节完整地描述了这些参数及其取值。在花括号{}中的值是缺省值。在命令行使用无输入参数的命令函数gaoptimset,可查看这些优化参数。
表8.2 使用函数gaoptimset设置的参数
参数 CreationFcn CrossoverFraction 说明 创建初始种群的函数句柄 不包括优良子辈,由交叉函数创建的下一代种群的交叉概率。 CrossoverFcn 遗传算法用来创建交叉的子辈函数的句柄 @crossoverheuristic {@crossoverscattered} @crossoverintermediate @crossoversinglepoint @crossovertwopoint EliteCount 正整数,指明当前代中有多少个个体一定生存到下一代 FitnessLimit 标量,如果适应度值达到FitnessLimit的值,则遗传算法停止。 FitnessScalingFcn
变换适应度函数值的函数的句柄 @fitscalinggoldberg 197
标量 | {-Inf} 正整数 | {2} 值 {@gacreationuniform} 正数标量 | {0.8} {@fitscalingrank} @fitscalingprop @fitscalingtop Generations PopInitRange PopulationType 正整数,指明算法停止前可叠代的最大次数 矩阵或向量,指明初始种群中个体的范围 字符串,指定种群的数据类型 正整数 | {100} 矩阵或向量 [0;1] 'bitstring' | 'custom' | {'doubleVector'} HybridFcn InitialPopulation InitialScores MigrationDirection MigrationFraction 在ga终止后使用它继续优化的函数的句柄 初始种群 初始得分 迁移方向 0到1之间的标量,指明每个子种群迁移到不同子种群的个体比率 MigrationInterval 正整数,指明间隔多少代,子种群间个体发生迁移 MutationFcn 产生变异子辈的函数的句柄 @mutationuniform {@mutationgaussian} OutputFcns OutputInterval PlotFcns Ga在每次迭代调用的函数的句柄数组 正整数,指明相隔多少代调用输出函数 把算法计算出来的数据绘制成图形的函数句柄数组 数组 | {[ ]} 正整数 | {1} @gaplotbestf @gaplotbestgenome @gaplotdistance @gaplotexpectation @gaplotgeneology @gaplotselection @gaplotrange @gaplotscorediversity @gaplotscores @gaplotstopping | {[ ]} PlotInterval PopulationSize SelectionFcn 正整数,指明调用图形函数间隔的代数 种群尺度 选择进行交叉或变异的父辈的函数句柄 正整数 | {1} 正整数 | {20} @selectiongoldberg @selectionrandom {@selectionstochunif} @selectionroulette @selectiontournament StallGenLimit 正整数,停滞代数限,如果相隔StallGenLimit代,目标函数没有改进,则算法停止
198
正整数 | {50} 正整数| {20} 函数句柄 | {[ ]} 正标量 {[ ]} 列向量 | {[ ]} 'both' | {'forward'} 标量 | {0.2} StallTimeLimit 正标量,停滞时间限,如果在StallTimeLimit秒后,目标函数没有改进,则算法停止 正标量 | {20} TimeLimit Vectorized 正标量,时间限,算法运行TimeLimit秒后停止 正标量 | {30} 字符串,指明运算的适应度函数是否是向量 'on' | {'off'} 参见:gaoptimget, gatool 8.4.2.4 命令gatool
功能:打开遗传算法工具 格式:
gatool
详细说明:打开遗传算法工具,给遗传算法提供图形用户界面,如图8.18所示。 可使用遗传算法工具来运行遗传算法,求解优化问题,并显示结果。 参见:ga, gaoptimset。
8.4.3 标准算法选项
遗传算法工具提供了许多标准算法选项,见表8.1。
表8.3 遗传算法工具标准算法选项
步 骤 初始化种群 适应度计算 选择 交叉 变异 绘图 uniform rank based,proportional,top(truncation),linear scaling and shift Roulette,stochastic uniform selection(SUS),tournament ,uniform Heuristic,intermediate,scattered,single-point,two-point Gaussian,uniform multipoint Best fitness,best individual,distance among individuals,expectation of individuals,range,diversity of population,selection index,stopping conditions 算法选项
遗传算法可以帮助我们确定这种具有多个局部最小值函数的最优解。
遗传算法工具提供了通过使用所有关键部件(包括使用算法选项)来定义问题的能力,实现了运行时间的可视化。
所谓运行时间可视化,是指函数正在优化时所产生的结果,可以通过使用遗传算法工具中的绘图函数用图形表示出来,并且运行时间的可视化可以通过使用遗传算法工具中的绘图函数在该函数优化的同时产生。
使用遗传算法工具时常常需要指定: (1) 群体大小。
(2) 优良的子辈个数。
(3) Crossover fraction(交叉片段)。
(4) Migration among subpopulations (子群体间迁移),使用环形拓扑。
通过提供用户自定义函数可以定制这些算法选项,并且可以用不同的数据格式来描述问题,比如使用混合整型数或复数作变量。可以以时限、停滞时限、适应度界限、繁殖辈数等为基准来作为算法的终止准则。最后,可以通过矢量化适应度函数来提高运算速度。
199
因篇幅问题不能全部显示,请点此查看更多更全内容