这个例子展示了遗传算法函数的一些选项的效果GA.
.您使用使用创建和更改选项优化选择
功能。
GA.
GA.
使用遗传算法搜索最少的功能。对于这个例子,使用GA.
最小化适应度函数Shufcn.
,二变量实值函数。
情节Shufcn.
在范围内= [-2 2; -2 2]
通过呼叫plotobjective.
.
plotobjective (@shufcn [2 2;2 2]);
用来GA.
求解器,提供至少两个输入参数:适应度函数和问题中的变量数量。返回的前两个输出参数GA.
是X
,找到了最好的点Fval
,最佳点处的函数值。第三个输出参数,ExitFlag.
,表示为什么GA.
停了下来。GA.
也可以返回第四个参数,输出
,其中包含有关求解器性能的信息。
Fitnessfunction = @shufcn;numberofvariables = 2;
跑过GA.
求解器。
rng默认%的再现性[X,FVAL,EXITFLAG,输出] = GA(Fitnessfunction,Numberofvariables);
优化终止:适应度值的平均变化小于选项。
FPRINTF('代的数量是:%d\n',输出.generations);
代数为:124
FPRINTF('函数的计算次数为:%d\n',产出.Funccount);
函数求值次数为:5881
FPRINTF('找到的最佳功能值是:%g \ n', Fval);
找到的最佳功能值是:-186.199
如果你没有这个例子rng违约
命令,你的结果可能不同,因为GA.
是一种随机算法。
遗传算法使用一组适用于该群体的操作符对该群体进行运算。总体是设计空间中的点的集合。默认情况下,初始种群是随机生成的。该算法利用当前世代个体的适应度计算下一代种群。有关详细信息,请参见遗传算法如何运作.
若要可视化求解器运行时的性能,请设置“PlotFcn”
选择使用优化选择
.在本例中,在单元格数组中选择两个绘图函数。集gaplotbestf
,这绘制了每一代人口的最佳和平均得分。还设置了gaplotstopping
,绘制停止标准满足的百分比。
选择= optimoptions (@ga,“PlotFcn”, {@gaplotbestf, @gaplotstopping});
跑过GA.
求解器,包括选择
论点。
[x,fval,出口,输出] =......GA(FitnessFunction,Numberofvariables,[],[],[],[],[],[],[],Opts);
优化终止:适应度值的平均变化小于选项。
人口选项可能对求解件性能产生很大影响。每次迭代的速度取决于人口大小:较大的人口导致较慢的迭代。相反,人口更大GA.
更彻底地探索,所以可以得到更好的解决方案。类似地,更宽的初始范围可以导致更彻底的探索,但可能需要更大的种群才能以类似的彻底性探索更广泛的范围。
指定人口规模
GA.
使用统一随机数生成器创建默认初始填充。所使用的默认填充大小GA.
当决策变量个数小于5时为50,否则为200。对于某些问题,默认大小可能不能很好地工作;例如,较小的人口规模就足以解决较小的问题。由于当前的问题只有两个变量,指定总体大小为10。设置选项的值人民化
到现有选项中的10个,选择
.
选择。PopulationSize = 10;
指定初始总体范围
生成初始群体的默认方法使用均匀的随机数发生器。对于没有整数约束的问题,GA.
创建一个初始种群,所有点都在-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.
在现有选项中,选择
.
opts.initialpopulationRange = [-1 0;1 2];
跑过GA.
求解器。
[x,fval,出口,输出] = ga(fitnessfunction,numberofvariables,[],[],[],......[],[],[],[],选择);
优化终止:适应度值的平均变化小于选项。
FPRINTF('代的数量是:%d\n',输出.generations);
几代人数为:67
FPRINTF('函数的计算次数为:%d\n',产出.Funccount);
函数求值次数为:614
FPRINTF('找到的最佳功能值是:%g \ n', Fval);
找到的最佳函数值是:-179.987
默认情况下,GA.
从使用MATLAB®随机数生成器创建的随机初始群体开始。求解器产生下一代使用GA.
操作员也使用相同的随机数发生器。每次生成随机数时,随机数发生器的状态会发生变化。所以,即使您没有更改任何选项,即使再次运行Solver时,您也可以获得不同的结果。
运行求解器两次来显示这个现象。
跑过GA.
求解器。
[X,FVAL,EXITFLAG,输出] = GA(Fitnessfunction,Numberofvariables);
优化终止:适应度值的平均变化小于选项。
FPRINTF('找到的最佳功能值是:%g \ n', Fval);
找到的最佳函数值是:-186.484
跑GA.
一次。
[X,FVAL,EXITFLAG,输出] = GA(Fitnessfunction,Numberofvariables);
优化终止:适应度值的平均变化小于选项。
FPRINTF('找到的最佳功能值是:%g \ n', Fval);
找到的最佳功能值是:-185.867
GA.
在两次运行中给出不同的结果,因为随机数生成器的状态从一次运行更改为另一次运行。
如果您想在运行之前重现您的结果GA.
,可以保存随机数流的状态。
thestate = rng;
跑GA.
.
[X,FVAL,EXITFLAG,输出] = GA(Fitnessfunction,Numberofvariables);
优化终止:适应度值的平均变化小于选项。
FPRINTF('找到的最佳功能值是:%g \ n', Fval);
找到的最佳函数值是:-186.467
重置流并重新运行GA.
.结果与之前的运行相同。
rng(状态);[X,FVAL,EXITFLAG,输出] = GA(Fitnessfunction,Numberofvariables);
优化终止:适应度值的平均变化小于选项。
FPRINTF('找到的最佳功能值是:%g \ n', Fval);
找到的最佳函数值是:-186.467
如果你运行GA.
在指定重现结果之前,只要您拥有该结果,您可以重置随机数发生器输出
结构体。
strm = randstream.getglobalstream;strm.state = output.rngstate.state;
重新运行GA.
.同样,结果是相同的。
[X,FVAL,EXITFLAG,输出] = GA(Fitnessfunction,Numberofvariables);
优化终止:适应度值的平均变化小于选项。
FPRINTF('找到的最佳功能值是:%g \ n', Fval);
找到的最佳函数值是:-186.467
GA.
使用四个不同的标准来确定何时停止求解器。GA.
在达到最大几代人数时停止;默认情况下,此数字是变量数量的100倍。GA.
还可以检测最佳适应度值是否在给定的秒(失速时间限制)或代数(最大失速代数)中不变。另一个标准是以秒为单位的最大时间限制。修改停止标准,将最大代数增加到300,最大失速代增加到100。
选择= optimoptions(选择,'maxgenerations', 300,“MaxStallGenerations”, 100);
重新运行GA.
求解器。
[x,fval,出口,输出] = ga(fitnessfunction,numberofvariables,[],[],[],......[],[],[],[],选择);
优化终止:适应度值的平均变化小于选项。
FPRINTF('代的数量是:%d\n',输出.generations);
几代人数为:299
FPRINTF('函数的计算次数为:%d\n',产出.Funccount);
功能评估的数量是:2702
FPRINTF('找到的最佳功能值是:%g \ n', Fval);
找到的最佳函数值是:-186.729
GA.
运营商GA.
从人口中的随机点开始,并使用运营商产生下一代人口。不同的运算符是缩放,选择,交叉和突变。该工具箱提供了多个函数来指定每个运算符。指定fitscalingprop.
为了FitnessScalingfcn.
和selecttutnament.
为了SelectionFcn
.
选择= optimoptions (@ga,“SelectionFcn”,@ selectiontournament,......'fitnesscalingfcn', @fitscalingprop);
重新运行GA.
.
[x,fval,出口,输出] = ga(fitnessfunction,numberofvariables,[],[],[],......[],[],[],[],选择);
优化终止:适应度值的平均变化小于选项。
FPRINTF('代的数量是:%d\n',输出.generations);
代数为:52代
FPRINTF('函数的计算次数为:%d\n',产出.Funccount);
函数求值次数为:2497
FPRINTF('找到的最佳功能值是:%g \ n', Fval);
找到的最佳功能值为:-186.417
最好的函数值可以根据指定的操作符而改善或恶化。试验不同的运算符通常是确定哪一组运算符最适合您的问题的最佳方法。