遗传算法选项的影响

这个例子展示了遗传算法函数的一些选项的效果遗传算法。属性创建和更改选项optimoptions函数。

设置一个问题遗传算法

遗传算法使用遗传算法搜索函数的最小值。对于本例,使用遗传算法最小化适应度函数shufcn,两个变量的实值函数。

shufcn在范围内= [-2 2;-2]通过调用plotobjective

plotobjective (@shufcn [2 2;2 2]);

使用遗传算法求解器,提供至少两个输入参数,一个适应度函数和变量的数量在问题。返回的前两个输出参数遗传算法x,找到最好的点,和Fval,函数值在最佳点处。第三个输出参数,exitFlag告诉你原因遗传算法停止了。遗传算法也可以返回第四个参数,输出,其中包含有关求解器性能的信息。

FitnessFunction = @shufcn;numberOfVariables = 2;

运行遗传算法解算器。

rng默认的%的再现性[x, Fval exitFlag、输出]= ga (FitnessFunction numberOfVariables);
优化终止:适应度值的平均变化小于可选值。功能容限。
流('代数为:%d\n', Output.generations);
代数是:124
流('函数求值的数量为:%d\n', Output.funccount);
函数计算的次数为:5881
流('找到的最佳函数值为:%g\n', Fval);
得到的最佳函数值为-186.199

如果运行此示例时不带rng违约命令,你的结果会不同,因为遗传算法是一种随机算法。

遗传算法是如何工作的

遗传算法使用一组适用于该种群的操作符对该种群进行工作。总体是设计空间中的一组点。默认情况下,初始总体是随机生成的。种群的下一代是用当前世代的个体的适合度来计算的。有关详细信息,请参见遗传算法是如何工作的

添加可视化

要在运行时可视化求解器性能,请设置a“PlotFcn”选择使用optimoptions。在本例中,在单元格数组中选择两个绘图函数。集gaplotbestf,绘制出每一代人的最佳和平均得分。还gaplotstopping,绘制满足停止条件的百分比。

选择= optimoptions (@ga,“PlotFcn”, {@gaplotbestf, @gaplotstopping});

运行遗传算法解算器,包括选择论点。

[x, Fval exitFlag、输出]=ga (FitnessFunction numberOfVariables,[][],[],[],[],[],[],选择);
优化终止:适应度值的平均变化小于可选值。功能容限。

指定人口选项

指定人口规模

遗传算法使用统一随机数生成器创建默认初始填充。所使用的默认填充大小遗传算法当决策变量个数小于5时为50,否则为200。对于某些问题,这个尺寸可能是一个可怜的;较小的人口规模足以解决较小的问题。由于当前问题只有两个变量,所以指定总体大小为10。设置选项的值PopulationSize在现有的选项中,选择

选择。PopulationSize = 10;

指定初始总体范围

生成初始总体的默认方法使用均匀随机数生成器。对于没有整数约束的问题,遗传算法创建一个初始种群,其中所有的点都在-10到10的范围内。例如,在一个有两个变量的问题中,一个规模为3的总体可能是:

人口= [-10,-10]+ 20*rand(3,2);

可以通过更改属性设置初始范围InitialPopulationRange选择。范围必须是一个两行矩阵。如果范围只有一列,也就是说,它是2乘1的,那么每个变量的范围就是给定的范围。例如,如果您将范围设置为(1;1],则两个变量的初始范围为-1到1。要为每个变量指定不同的初始范围,必须将该范围指定为包含两行和的矩阵numberOfVariables列。例如,如果您将范围设置为[1 0;1 2],那么第一个变量的范围为-1到1,第二个变量的范围为0到2(每列对应一个变量)。

修改选项的值InitialPopulationRange在现有的选择中,选择

选择。InitialPopulationRange = [-1 0;1 2];

运行遗传算法解算器。

[x, Fval exitFlag,输出]= ga (FitnessFunction numberOfVariables, [], [], [],[]、[][],[],选择);
优化终止:适应度值的平均变化小于可选值。功能容限。

流('代数为:%d\n', Output.generations);
代数为:67
流('函数求值的数量为:%d\n', Output.funccount);
函数计算的次数为:614
流('找到的最佳函数值为:%g\n', Fval);
得到的最佳函数值为-179.987

复制的结果

默认情况下,遗传算法从使用MATLAB®随机数生成器创建的随机初始种群开始。下一代是用遗传算法运算符也使用相同的随机数生成器。每当生成随机数时,随机数生成器的状态就会改变。这意味着,即使您没有更改任何选项,当您再次运行时,您也可以得到不同的结果。

运行求解程序两次以显示此现象。

运行遗传算法解算器。

[x, Fval exitFlag、输出]= ga (FitnessFunction numberOfVariables);
优化终止:适应度值的平均变化小于可选值。功能容限。
流('找到的最佳函数值为:%g\n', Fval);
得到的最佳函数值为-186.484

运行遗传算法一次。

[x, Fval exitFlag、输出]= ga (FitnessFunction numberOfVariables);
优化终止:适应度值的平均变化小于可选值。功能容限。
流('找到的最佳函数值为:%g\n', Fval);
得到的最佳函数值为-185.867

在前两轮中,遗传算法给不同的结果。结果是不同的,因为随机数生成器的状态从一次运行变化到另一次运行。

如果您知道要在运行之前重新生成结果遗传算法,您可以保存随机数流的状态。

状态=提高;

运行遗传算法

[x, Fval exitFlag、输出]= ga (FitnessFunction numberOfVariables);
优化终止:适应度值的平均变化小于可选值。功能容限。
流('找到的最佳函数值为:%g\n', Fval);
得到的最佳函数值为-186.467

重置流并重新运行遗传算法。结果与前一次运行相同。

rng(状态);[x, Fval exitFlag、输出]= ga (FitnessFunction numberOfVariables);
优化终止:适应度值的平均变化小于可选值。功能容限。
流('找到的最佳函数值为:%g\n', Fval);
得到的最佳函数值为-186.467

但是,您可能没有意识到在运行之前需要尝试重新生成结果遗传算法。在这种情况下,只要你有输出结构,您可以重置随机数生成器如下。

strm = RandStream.getGlobalStream;strm。状态= Output.rngstate.State;

重新运行遗传算法。同样,结果是相同的。

[x, Fval exitFlag、输出]= ga (FitnessFunction numberOfVariables);
优化终止:适应度值的平均变化小于可选值。功能容限。
流('找到的最佳函数值为:%g\n', Fval);
得到的最佳函数值为-186.467

停止准则修改

遗传算法使用四种不同的标准来决定何时停止求解器。遗传算法当达到最大代数时停止;默认情况下,这个数字是变量数的100倍。遗传算法还检测以秒为单位的一段时间(停顿时间限制)或某些代数(最大停顿代数)的最佳适应性值是否没有变化。另一个标准是最大时间限制(以秒为单位)。修改停止条件,将最大代数增加到300,最大失速代数增加到100。

选择= optimoptions(选择,“MaxGenerations”, 300,“MaxStallGenerations”, 100);

重新运行遗传算法解算器。

[x, Fval exitFlag,输出]= ga (FitnessFunction numberOfVariables, [], [], [],[]、[][],[],选择);
优化终止:适应度值的平均变化小于可选值。功能容限。

流('代数为:%d\n', Output.generations);
代数是299
流('函数求值的数量为:%d\n', Output.funccount);
函数计算的次数为:2702
流('找到的最佳函数值为:%g\n', Fval);
得到的最佳函数值为-186.729

选择遗传算法运营商

遗传算法从种群中的随机点集开始,并使用运算符产生下一代种群。不同的操作符是缩放、选择、交叉和变异。工具箱为每个操作符提供了几个可供选择的函数。选择fitscalingpropFitnessScalingFcnselectiontournamentSelectionFcn

选择= optimoptions (@ga,“SelectionFcn”@selectiontournament,“FitnessScalingFcn”, @fitscalingprop);

重新运行遗传算法

[x, Fval exitFlag,输出]= ga (FitnessFunction numberOfVariables, [], [], [],[]、[][],[],选择);
优化终止:适应度值的平均变化小于可选值。功能容限。
流('代数为:%d\n', Output.generations);
代数为:52
流('函数求值的数量为:%d\n', Output.funccount);
函数计算的次数为:2497
流('找到的最佳函数值为:%g\n', Fval);
得到的最佳函数值为-186.417

最佳函数值可以通过选择不同的操作符来提高或降低。为您的问题选择一组好的操作符通常最好通过实验来完成。