主要内容

遗传算法选项的影响

这个例子显示了一些选项对遗传算法函数的影响遗传算法.控件创建和更改选项optimoptions函数。

为某人设定一个问题遗传算法

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

情节shufcn超出范围= [-2 2;-2 2]通过调用plotobjective

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

图中包含一个轴对象。坐标轴对象包含曲面、轮廓等2个对象。

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

FitnessFunction = @shufcn;numberOfVariables = 2;

运行遗传算法解算器。

rng默认的%用于再现性[x,Fval,exitFlag,Output] = ga(FitnessFunction,numberOfVariables);
优化终止:适应度值的平均变化小于options.FunctionTolerance。
流(代数为:%d\n, Output.generations);
代数为:124
流(函数求值的次数是:%d\n, Output.funccount);
函数求值的数量为:5881
流(找到的最佳函数值是:%g\n, Fval);
找到的最佳函数值是:-186.199

如果不使用rng违约命令,您的结果可能会有所不同,因为遗传算法是一个随机算法。

遗传算法是如何工作的

遗传算法使用一组应用于总体的操作符来处理总体。总体是设计空间中的一组点。初始population默认是随机生成的。该算法利用当前一代个体的适应度来计算种群的下一代。详细信息请参见遗传算法是如何工作的

添加可视化

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

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

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

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

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

指定填充选项

填充选项对求解器性能有很大影响。每次迭代的速度取决于种群的大小:较大的种群导致较慢的迭代。相反,一个较大的人口导致遗传算法探索得更彻底,才能得到更好的解决方案。类似地,更大的初始范围可以导致更彻底的探索,但可能需要更大的人口以同样彻底的方式探索更广泛的范围。

指定人口规模

遗传算法使用统一随机数生成器创建默认初始填充。所使用的默认填充大小遗传算法当决策变量数量小于5时为50,否则为200。默认大小可能不适用于某些问题;例如,较小的种群规模可能足以解决较小的问题。由于当前的问题只有两个变量,所以将总体大小指定为10。设置该选项的值PopulationSize到现有选项的10,选择

选择。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,Output] = ga(FitnessFunction,numberOfVariables,[],[],[], [],...[],[],[],[], 选择);
优化终止:适应度值的平均变化小于options.FunctionTolerance。

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

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

复制的结果

默认情况下,遗传算法从使用MATLAB®随机数生成器创建的随机初始人口开始。求解器使用遗传算法操作符也使用相同的随机数生成器。每次生成随机数时,随机数生成器的状态都会发生变化。因此,即使不更改任何选项,再次运行求解器时也会得到不同的结果。

运行两次求解器来显示这种现象。

运行遗传算法解算器。

[x,Fval,exitFlag,Output] = ga(FitnessFunction,numberOfVariables);
优化终止:适应度值的平均变化小于options.FunctionTolerance。
流(找到的最佳函数值是:%g\n, Fval);
找到的最佳函数值是:-186.484

运行遗传算法一次。

[x,Fval,exitFlag,Output] = ga(FitnessFunction,numberOfVariables);
优化终止:适应度值的平均变化小于options.FunctionTolerance。
流(找到的最佳函数值是:%g\n, Fval);
找到的最佳函数值是:-185.867

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

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

Thestate = rng;

运行遗传算法

[x,Fval,exitFlag,Output] = ga(FitnessFunction,numberOfVariables);
优化终止:适应度值的平均变化小于options.FunctionTolerance。
流(找到的最佳函数值是:%g\n, Fval);
找到的最佳函数值是:-186.467

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

rng(状态);[x,Fval,exitFlag,Output] = ga(FitnessFunction,numberOfVariables);
优化终止:适应度值的平均变化小于options.FunctionTolerance。
流(找到的最佳函数值是:%g\n, Fval);
找到的最佳函数值是:-186.467

如果你跑了遗传算法属性,在指定重新生成结果之前,可以重置随机数生成器输出结构。

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

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

[x,Fval,exitFlag,Output] = ga(FitnessFunction,numberOfVariables);
优化终止:适应度值的平均变化小于options.FunctionTolerance。
流(找到的最佳函数值是:%g\n, Fval);
找到的最佳函数值是:-186.467

修改停止条件

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

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

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

[x,Fval,exitFlag,Output] = ga(FitnessFunction,numberOfVariables,[],[],[], [],...[],[],[],[], 选择);
优化终止:适应度值的平均变化小于options.FunctionTolerance。

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

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

指定遗传算法运营商

遗传算法从总体中的一组随机点开始,使用算子生成下一代总体。不同的操作符是缩放、选择、交叉和变异。工具箱为每个操作符提供了几个指定的函数。指定fitscalingpropFitnessScalingFcn而且selectiontournamentSelectionFcn

Opts = optimoptions(@ga,“SelectionFcn”@selectiontournament,...“FitnessScalingFcn”, @fitscalingprop);

重新运行遗传算法

[x,Fval,exitFlag,Output] = ga(FitnessFunction,numberOfVariables,[],[],[], [],...[],[],[],[], 选择);
优化终止:适应度值的平均变化小于options.FunctionTolerance。
流(代数为:%d\n, Output.generations);
代数为:52
流(函数求值的次数是:%d\n, Output.funccount);
函数求值的数量是:2497
流(找到的最佳函数值是:%g\n, Fval);
找到的最佳函数值是:-186.417

最佳函数值可以根据指定的操作符提高或降低。尝试不同的操作符通常是确定哪一组操作符最适合您的问题的最佳方法。

另请参阅

相关的话题