图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之外,增加了以下输出变量 ? “reason(原因)”— 算法停止的原因。
? “output(输出)”— 包含关于算法在每一代性能的结构体。 ? “population(种群)”— 最后种群。 ? “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