这个例子展示了遗传算法函数的一些选项的效果遗传算法
.控件创建和更改选项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);
优化终止:适应度值的平均变化小于选项。
流('代的数量是:%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 ,[],[],[],[],[],[],[], 选择);
优化终止:适应度值的平均变化小于选项。
填充选项对求解器性能有很大的影响。每次迭代的速度取决于总体大小:较大的总体导致较慢的迭代。相反,人口越多,就会导致遗传算法
更彻底地探索,所以可以得到更好的解决方案。类似地,更宽的初始范围可以导致更彻底的探索,但可能需要更大的种群才能以类似的彻底性探索更广泛的范围。
指定人口规模
遗传算法
使用统一随机数生成器创建默认初始填充。所使用的默认填充大小遗传算法
当决策变量个数小于5时为50,否则为200。对于某些问题,默认大小可能不能很好地工作;例如,较小的人口规模就足以解决较小的问题。由于当前的问题只有两个变量,指定总体大小为10。设置选项的值PopulationSize
到现有选项中的10个,选择
.
选择。PopulationSize = 10;
指定初始总体范围
生成初始总体的默认方法使用均匀随机数生成器。对于没有整数约束的问题,遗传算法
创建一个初始种群,所有点都在-10到10的范围内。例如,可以使用此命令在默认范围内生成大小为3的population:
人口= [-10,-10]+ 20*rand(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 ,[],[],[],...[],[],[],[], 选择);
优化终止:适应度值的平均变化小于选项。
流('代的数量是:%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
遗传算法
运营商遗传算法
从种群中的随机点开始,使用算子来产生下一代种群。不同的操作是缩放、选择、交叉和变异。工具箱提供了几个函数来指定每个操作符。指定fitscalingprop
为FitnessScalingFcn
和selectiontournament
为SelectionFcn
.
选择= 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
最好的函数值可以根据指定的操作符而改善或恶化。试验不同的运算符通常是确定哪一组运算符最适合您的问题的最佳方法。