此示例显示了遗传算法函数的某些选项的效果遗传算法
.控件创建和更改选项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
遗传算法
运营商遗传算法
从种群中的随机点开始,使用算子来产生下一代种群。不同的操作是缩放、选择、交叉和变异。工具箱为每个操作符提供了几个可供选择的函数。选择fitscalingprop
为FitnessScalingFcn
和selectiontournament
为SelectionFcn
.
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
通过选择不同的运算符,可以使最佳的函数值得到改善或恶化。为您的问题选择一组好的运算符通常最好通过实验来完成。