主要内容

遗传算法选项的影响

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

设置一个问题遗传算法

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

情节shufcn超出范围= [-2 2;-2 2]通过调用plotobjective,在运行此示例时包含它。

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

图中包含一个axes对象。坐标轴对象包含两个对象,分别是曲面、轮廓。

要使用遗传算法求解器,提供至少两个输入参数:适应度函数和问题中的变量数量。返回的前两个输出参数遗传算法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违约命令,您的结果可能不同,因为遗传算法是一个随机算法。

遗传算法是如何工作的

遗传算法使用一组应用于总体的运算符在总体上工作。总体是设计空间中的一组点。初始填充默认是随机生成的。该算法利用当前世代个体的适应度计算种群的下一代。详情请参见遗传算法是如何工作的

添加可视化

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

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

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

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

{

指定人口选项

填充选项对求解器性能有很大影响。每次迭代的速度取决于总体规模:较大的总体导致较慢的迭代。相反,人口越多就会导致遗传算法探索得更彻底,就能得到更好的解决方案。同样地,更大的初始范围也能够带来更彻底的探索,但却需要更多的玩家去探索更广泛的范围。

指定人口数量

遗传算法使用统一随机数生成器创建默认初始总体。使用的缺省总体大小遗传算法当决策变量的数量小于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,Output] = ga(FitnessFunction,numberOfVariables,[],[],[],...[],[],[],[], 选择);
优化终止:适应度值的平均变化小于options.FunctionTolerance。

{

流('代数为:%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

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

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

state = 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。

{

流('代数为:%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

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

另请参阅

相关的话题