主要内容

遗传算法选项的影响

此示例显示了遗传算法函数的某些选项的效果遗传算法.控件创建和更改选项optimoptions函数。

设置一个问题遗传算法

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

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

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

使用遗传算法解算器,提供至少两个输入参数、一个适应度函数和问题中的变量数。返回的前两个输出参数遗传算法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它绘制出每一代人口的最佳和平均得分。还间隙停车,绘制满足停止标准的百分比。

opts=options(@ga,“PlotFcn”,{@gaplotbestf,@gaplotstopping});

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

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

指定人口选项

指定总体大小

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

opts.PopulationSize=10;

指定初始总体范围

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

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

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

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

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

运行遗传算法解算器。

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

流('代数为:%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(状态);[x,Fval,exitFlag,Output]=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。

选择= optimoptions(选择,“MaxGenerations”,300,“超级世代”, 100);

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

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

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

选择遗传算法运营商

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

opts=options(@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

通过选择不同的运算符,可以使最佳的函数值得到改善或恶化。为您的问题选择一组好的运算符通常最好通过实验来完成。

另请参阅

相关的话题