此示例显示了一些选项对遗传算法函数的影响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,出口,输出] = ga(fitnessfunction,numberofvariables);
优化终止:FITHS值的平均变化小于选项。功能化。
fprintf('几代人数是:%d \ n',产出.Generations);
几代人数为:124
fprintf('函数评估的数量是:%d \ n',产出.Funccount);
函数评估的数量是:5881
fprintf('找到的最佳功能值是:%g \ n',fval);
找到的最佳功能值为:-186.199
如果你没有这个例子RNG默认值
命令,结果可能有所不同,因为GA.
是一种随机算法。
遗传算法使用应用于人口的一组运营商的群体工作。人口是设计空间中的一组点。默认情况下,随机生成初始群体。该算法使用当前生成中的个人的适应性来计算下一代人口。有关详细信息,请参阅遗传算法如何运作。
要在运行时可视化求解器性能,请设置a'plotfcn'
选择使用优化选择
。在这种情况下,在单元格数组中选择两个绘图函数。放gaplotbestf.
,这绘制了每一代人口的最佳和平均得分。还设置了gaplotstopping
,这绘制了满足停止标准的百分比。
选择= Optimoptions(@ga,'plotfcn',{@ gaplotbestf,@ gaplotstopping};
跑过GA.
求解器,包括选择
争论。
[x,fval,出口,输出] =......ga(fitnessfunction,numberofvariables,[],[],[],[],[],[],[],选择);
优化终止:FITHS值的平均变化小于选项。功能化。
人口选项对求解器性能有很大影响。每次迭代的速度取决于人口大小:较大的人口导致较慢的迭代。相反,人口更大GA.
更彻底地探索,因此可以导致更好的解决方案。同样,更广泛的初始范围可以导致更彻底的探索,但可能需要更大的人口来探索更广泛的范围,具有类似的彻底性。
指定人口大小
GA.
使用均匀随机数生成器创建默认的初始群体。使用的默认人口大小GA.
判断变量的数量小于5,否则是50。对于某些问题,默认大小可能无法正常工作;例如,较小的人口大小可以足以用于较小的问题。由于当前问题只有两个变量,指定群体大小为10.设置选项的值人群化
在现有选项中的10个,选择
。
选择.populationsize = 10;
指定初始群体范围
生成初始群体的默认方法使用均匀的随机数发生器。对于没有整数约束的问题,GA.
创建一个初始群体,其中所有点都在-10到10中。例如,您可以使用此命令在默认范围内生成大小三个群体:
人口= [-10,-10] + 20 *兰特(3,2);
您可以通过更改初始范围来设置初始范围initialpopulationrange.
选项。该范围必须是具有两行的矩阵。如果该范围只有一列,即,它是2-by-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,[],[],[],......[],[],[],[],选择);
优化终止:FITHS值的平均变化小于选项。功能化。
fprintf('几代人数是:%d \ n',产出.Generations);
几代人数为:67
fprintf('函数评估的数量是:%d \ n',产出.Funccount);
函数评估的数量是:614
fprintf('找到的最佳功能值是:%g \ n',fval);
找到的最佳功能值是:-179.987
默认,GA.
从使用MATLAB®随机数生成器创建的随机初始群体开始。求解器产生下一代使用GA.
操作员也使用相同的随机数发生器。每次生成随机数时,随机数发生器的状态会发生变化。所以,即使您没有更改任何选项,您也可以在再次运行求解器时获得不同的结果。
运行求解器两次以显示这种现象。
跑过GA.
求解器。
[x,fval,出口,输出] = ga(fitnessfunction,numberofvariables);
优化终止:FITHS值的平均变化小于选项。功能化。
fprintf('找到的最佳功能值是:%g \ n',fval);
找到的最佳功能值为:-186.484
跑步GA.
再次。
[x,fval,出口,输出] = ga(fitnessfunction,numberofvariables);
优化终止:FITHS值的平均变化小于选项。功能化。
fprintf('找到的最佳功能值是:%g \ n',fval);
找到的最佳功能值为:-185.867
GA.
在两个运行中给出不同的结果,因为随机数发生器的状态从一个运行到另一个运行状态。
如果您想在运行之前重现结果GA.
,您可以保存随机数流的状态。
thestate = rng;
跑步GA.
。
[x,fval,出口,输出] = ga(fitnessfunction,numberofvariables);
优化终止:FITHS值的平均变化小于选项。功能化。
fprintf('找到的最佳功能值是:%g \ n',fval);
找到的最佳功能值是:-186.467
重置流和重新运行GA.
。结果与之前的运行相同。
rng(听明);[x,fval,出口,输出] = ga(fitnessfunction,numberofvariables);
优化终止:FITHS值的平均变化小于选项。功能化。
fprintf('找到的最佳功能值是:%g \ n',fval);
找到的最佳功能值是:-186.467
如果你运行GA.
在指定重现结果之前,只要您拥有此,您可以重置随机数发生器输出
结构体。
strm = randstream.getglobalstream;strm.state = output.rngstate.state;
重新运真GA.
。同样,结果是相同的。
[x,fval,出口,输出] = ga(fitnessfunction,numberofvariables);
优化终止:FITHS值的平均变化小于选项。功能化。
fprintf('找到的最佳功能值是:%g \ n',fval);
找到的最佳功能值是:-186.467
GA.
使用四个不同的标准来确定何时停止求解器。GA.
停止达到最大数量的几代人数;默认情况下,此数字是变量数量的100倍。GA.
还可以检测到最佳的健身值是否在几秒钟(失速时间限制)或某个数量的几代(最大停顿代数)中没有改变一些时间。另一个标准是秒内的最大时间限制。修改停止标准,以将数量的最大数量增加到300,最大停顿几代到100。
选择= Optimoptions(选择,'maxgenerations'300,'maxstallgenerations',100);
重新运行GA.
求解器。
[x,fval,出口,输出] = ga(fitnessfunction,numberofvariables,[],[],[],......[],[],[],[],选择);
优化终止:FITHS值的平均变化小于选项。功能化。
fprintf('几代人数是:%d \ n',产出.Generations);
几代人数为:299
fprintf('函数评估的数量是:%d \ n',产出.Funccount);
功能评估的数量是:2702
fprintf('找到的最佳功能值是:%g \ n',fval);
找到的最佳功能值是:-186.729
GA.
运营商GA.
从人口中的随机点开始,并使用运营商产生下一代人口。不同的运营商正在缩放,选择,交叉和突变。工具箱提供了多个功能来指定每个运算符。指定fitscalingprop.
为了Fitnesscalingfcn.
和selecttutnament.
为了选择汇总
。
选择= Optimoptions(@ga,'selectionfcn',@ selectiontournament,......'fitnesscalingfcn',@ fitscalingprop);
重新运真GA.
。
[x,fval,出口,输出] = ga(fitnessfunction,numberofvariables,[],[],[],......[],[],[],[],选择);
优化终止:FITHS值的平均变化小于选项。功能化。
fprintf('几代人数是:%d \ n',产出.Generations);
几代人数为:52
fprintf('函数评估的数量是:%d \ n',产出.Funccount);
函数评估的数量是:2497
fprintf('找到的最佳功能值是:%g \ n',fval);
找到的最佳功能值为:-186.417
最佳函数值可以根据指定的运算符来改进或变得更糟。使用不同的运营商进行实验通常是确定哪套运营商最适合您的问题的方法。