主要内容

遗传算法选择的影响。

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

设置一个问题遗传算法

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

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

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

图中包含一个轴对象。轴对象包含曲面、轮廓两种类型的对象。

使用遗传算法解算器,提供至少两个输入参数:一个健身功能,这个问题不变量的数目。前两个输出参数返回由遗传算法x,找到了最好的点FVAL,函数在最佳点处的值。第三个输出参数,exitFlag,表明为什么遗传算法停止了。遗传算法还可以返回一个第四个参数,输出,其中包含有关求解器的性能信息。

FitnessFunction = @shufcn;numberOfVariables = 2;

运行遗传算法解算器。

RNG.默认的%用于重现[x, Fval exitFlag、输出]= ga (FitnessFunction numberOfVariables);
优化终止:在健身值小于options.FunctionTolerance平均变化。
流(“世代的数目是:%d \ n”, Output.generations);
代的数目是:124
流(“功能的评价的数量是:%d \ n”, Output.funccount);
功能评估的号码是:5881
流('找到的最佳函数值是:%g\n',FVAL);
找到的最佳函数值是:-186.199

如果您运行这个例子没有rng违约命令,您的结果可能有所不同,因为遗传算法是一种随机算法。

遗传算法是如何工作的

遗传算法适用于使用一组应用到人口运营商的群体。总体是一家集设计空间中的点。初始群体被默认随机生成的。该算法计算的下一代使用当前一代的个体的适应人群。有关详细信息,请参阅遗传算法是如何工作的

添加可视化

以可视化的求解器性能的同时,它正在运行,集'PlotFcn'使用选项optimoptions.在这种情况下,选择在细胞阵列中的两个曲线图的功能。放gaplotbestf它绘制出每一代人口的最佳和平均得分。还gaplotstopping,绘制满足停止标准的百分比。

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

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

[x, Fval exitFlag、输出]=...ga (FitnessFunction numberOfVariables ,[],[],[],[],[],[],[], 选择);
优化终止:在健身值小于options.FunctionTolerance平均变化。

图遗传算法包含2个轴对象。标题为Best: -186.71 Mean: -123.753的轴对象1包含2个类型为line的对象。这些对象代表最佳适应度,平均适应度。标题为“停止条件”的axis对象2包含一个类型为bar的对象。

指定人口选项

填充选项对求解器性能有很大的影响。每次迭代的速度取决于总体大小:较大的总体导致较慢的迭代。相反,人口越多,就会导致遗传算法探索更彻底,这样可以带来更好的解决方案。同样,较宽的初始范围可导致更彻底的探索,但可能需要更大的人群,探索具有类似的完整性更宽的范围。

指定人口规模

遗传算法创建通过使用统一的随机数发生器产生一个默认的初始群体。通过使用默认的人口规模遗传算法当决策变量个数小于5时为50,否则为200。对于某些问题,默认大小可能不能很好地工作;例如,较小的人口规模就足以解决较小的问题。由于当前的问题只有两个变量,指定总体大小为10。设置选项的值PopulationSize在现有的选项10,选择

opts.PopulationSize = 10;

指定初始群体范围

生成初始总体的默认方法使用均匀随机数生成器。对于没有整数约束的问题,遗传算法创建一个初始种群,所有点都在-10到10的范围内。例如,可以使用此命令在默认范围内生成大小为3的population:

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

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

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

选择。初始化人口范围= [-1 0;1 2];

运行遗传算法解算器。

[x, Fval exitFlag,输出]= ga (FitnessFunction numberOfVariables ,[],[],[],...[],[],[],[], 选择);
优化终止:在健身值小于options.FunctionTolerance平均变化。

图遗传算法包含2个轴对象。轴加工对象物1与标题最佳:-179.987平均数:-78.6061包含型线的2个对象。这些对象代表最佳适应度,平均适应度。标题为“停止条件”的axis对象2包含一个类型为bar的对象。

流(“世代的数目是:%d \ n”, Output.generations);
代数为:67
流(“功能的评价的数量是:%d \ n”, Output.funccount);
功能评估的号码是:614
流('找到的最佳函数值是:%g\n',FVAL);
最好的功能价值发现的是:-179.987

结果重现

默认情况下,遗传算法从使用MATLAB®随机数生成器创建的随机初始种群开始。求解器产生下一代使用遗传算法运算符也使用这些随机数生成器。每产生一个随机数,随机数生成器的状态就会改变。因此,即使您不改变任何选项,您也可以在再次运行求解器时得到不同的结果。

运行求解两次,显示此现象。

运行遗传算法解算器。

[x, Fval exitFlag、输出]= ga (FitnessFunction numberOfVariables);
优化终止:在健身值小于options.FunctionTolerance平均变化。
流('找到的最佳函数值是:%g\n',FVAL);
找到的最佳函数值是:-186.484

运行遗传算法再次。

[x, Fval exitFlag、输出]= ga (FitnessFunction numberOfVariables);
优化终止:在健身值小于options.FunctionTolerance平均变化。
流('找到的最佳函数值是:%g\n',FVAL);
找到的最佳函数值是:-185.867

遗传算法因为从一个随机数生成器的状态发生改变运行到另一个给出了两个运行不同的结果。

如果你想在运行之前,重现您的结果遗传算法,你可以保存随机数流的状态。

状态=提高;

运行遗传算法

[x, Fval exitFlag、输出]= ga (FitnessFunction numberOfVariables);
优化终止:在健身值小于options.FunctionTolerance平均变化。
流('找到的最佳函数值是:%g\n',FVAL);
最好的功能价值发现的是:-186.467

重置该流并重新运行遗传算法.结果与上次运行相同。

RNG(thestate);[x, Fval exitFlag、输出]= ga (FitnessFunction numberOfVariables);
优化终止:在健身值小于options.FunctionTolerance平均变化。
流('找到的最佳函数值是:%g\n',FVAL);
最好的功能价值发现的是:-186.467

如果你运行遗传算法在指定重新生成结果之前,可以重置随机数生成器,只要您有输出结构。

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

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

[x, Fval exitFlag、输出]= ga (FitnessFunction numberOfVariables);
优化终止:在健身值小于options.FunctionTolerance平均变化。
流('找到的最佳函数值是:%g\n',FVAL);
最好的功能价值发现的是:-186.467

停止准则修改

遗传算法使用四个不同的标准来确定何时停止求解器。遗传算法当达到最大代数时停止;默认情况下,这个数字是变量数量的100倍。遗传算法还可以检测,如果最好的锻炼价值并不为以秒为单位(失速时间限制)一段时间发生变化,或者对于一些世代数(最大堵代)。另一个标准是在秒的最大时间限制。修改停止标准,以增加代至300的最大数目与最大失速世代为100。

OPTS = optimoptions(OPTS,“MaxGenerations”,300,'MaxStallGenerations',100);

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

[x, Fval exitFlag,输出]= ga (FitnessFunction numberOfVariables ,[],[],[],...[],[],[],[], 选择);
优化终止:在健身值小于options.FunctionTolerance平均变化。

图遗传算法包含2个轴对象。标题为Best: -186.729 Mean: -186.202的轴对象1包含2个类型为line的对象。这些对象代表最佳适应度,平均适应度。标题为“停止条件”的axis对象2包含一个类型为bar的对象。

流(“世代的数目是:%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 ,[],[],[],...[],[],[],[], 选择);
优化终止:在健身值小于options.FunctionTolerance平均变化。
流(“世代的数目是:%d \ n”, Output.generations);
代的数目是:52
流(“功能的评价的数量是:%d \ n”, Output.funccount);
功能评估的号码是:2497
流('找到的最佳函数值是:%g\n',FVAL);
找到的最佳函数值是:-186.417

最好的函数值可以改善或根据指定的经营者变得更糟。与不同的运营商进行实验往往是确定运营商的一套最适合您的问题的最佳途径。

另请参阅

相关的话题