人口的多样性
人口多样性的重要性
决定遗传算法性能的最重要因素之一是多样性在人口中。个体之间的平均距离越大,多样性越高;如果平均距离小,则多样性低。获得适当数量的多样性是一个不断尝试和错误的过程。如果多样性过高或过低,遗传算法可能不能很好地执行。
本节介绍如何通过设置种群的初始范围来控制多样性。的主题“设置突变量”变异变异和交叉描述突变的数量如何影响多样性。
本节还说明如何设置人口规模.
设置初始范围
默认情况下,遗传算法
使用创建函数创建一个随机初始总体。的初始总体中指定向量的范围InitialPopulationRange
选择。
注意:初始范围通过指定下界和上界来限制初始总体中点的范围。后续代可以包含条目不在初始范围内的点。方法设置所有代的上下限磅
而且乌兰巴托
输入参数。
如果您大概知道问题的解决方案在哪里,请指定初始范围,以便它包含您对解决方案的猜测。但是,如果种群具有足够的多样性,即使不在初始范围内,遗传算法也能找到解。
这个例子展示了初始范围如何影响遗传算法的性能。该示例使用Rastrigin的函数,描述在最小化Rastrigin的功能.函数的最小值是0,在原点处。
rng (1)%用于重现性有趣= @rastriginsfcn;Nvar = 2;选项= optimoptions(“遗传算法”,“PlotFcn”, {“gaplotbestf”,“gaplotdistance”},...“InitialPopulationRange”[1; 1.1]);[x, fval] = ga(有趣,据nvar ,[],[],[],[],[],[],[], 选项)
优化终止:适应度值的平均变化小于options.FunctionTolerance。
x =1×20.9942 - 0.9950
Fval = 1.9900
上面的图显示了每一代的最佳适合度,显示出在降低适合度值方面几乎没有进展。下面的图显示了每一代个体之间的平均距离,这是一个很好的衡量种群多样性的方法。对于这种初始范围的设置,多样性太少,算法无法取得进展。
接下来,尝试设置InitialPopulationRange
(1, 100]。这一次的结果更加多变。当前的随机数设置会导致一个相当典型的结果。
选项。InitialPopulationRange = [1;100];[x, fval] = ga(有趣,据nvar ,[],[],[],[],[],[],[], 选项)
优化终止:适应度值的平均变化小于options.FunctionTolerance。
x =1×20.9344 - -1.0792
Fval = 4.0889
这一次,遗传算法取得了进展,但由于个体之间的平均距离太大,最好的个体距离最优解很远。
现在设置InitialPopulationRange
[1, 2]。这个设置非常适合这个问题。
选项。InitialPopulationRange = [1;2];[x, fval] = ga(有趣,据nvar ,[],[],[],[],[],[],[], 选项)
优化终止:适应度值的平均变化小于options.FunctionTolerance。
x =1×20.0013 - 0.0020
Fval = 0.0011
适当的多样性通常造成遗传算法
返回比前两种情况更好的结果。
自定义绘图函数和线性约束遗传算法
这个例子展示了如何@gacreationlinearfeasible
,线性约束问题的默认创建函数,为遗传算法
.种群分布良好,且倾向于分布在约束边界上。该示例使用了一个自定义plot函数。
适应度函数
适应度函数为lincontest6
,它在运行此示例时可用。lincontest6
是两个变量的二次函数:
自定义Plot功能
将以下代码保存到您的MATLAB®路径中名为gaplotshowpopulation2
.
函数State = gaplotshowpopulation2(~, State,flag,fcn)%gaplotshowpopulation2在2-d中绘制总体和线性约束。% STATE = gaplotshowpopulation2(OPTIONS,STATE,FLAG)绘制总体%在二维空间。%%的例子:% fun = @lincontest6;% options = gaoptimset('PlotFcn',{{@gaplotshowpopulation2,fun}});% [x, fval exitflag] = ga(乐趣2 A、b[],[],磅,[],[],选项);此绘图函数仅适用于二维如果size(state.Population,2) >返回;结束如果Nargin < 4 FCN = [];结束%绘图的尺寸维度stoplot = [1 2];开关国旗% Plot初始化情况下“init”pop = state.Population(:,维度stoplot);plotHandle = plot(pop(:,1),pop(:,2),‘*’);集(plotHandle,“标签”,“gaplotshowpopulation2”)标题(“二维人口图”,的插值函数,“没有”) xlabelStr = sprintf(' % s % s ',“变量”num2str (dimensionsToPlot (1)));ylabelStr = sprintf(' % s % s ',“变量”num2str (dimensionsToPlot (2)));包含(xlabelStr的插值函数,“没有”);ylabel (ylabelStr的插值函数,“没有”);持有在;%绘制不等式图([0 1.5],[2 0.5],“m -”。)% x1 + x2 <= 2图([0 1.5],[1 3.5/2],“m -”。);% -x1 + 2*x2 <= 2图([0 1.5],[3 0],“m -”。);% 2*x1 + x2 <= 3%图下限图([0 0],[0 2],“m -”。);% lb = [0 0];图([0 1.5],[0 0],“m -”。);% lb = [0 0];集(gca),“xlim”甘氨胆酸,[-0.7,2.2])集,“ylim”,[-0.7,2.7]) axx = gcf;等高线绘制目标函数。如果~isempty(fcn) range = [-0.5,2;-0.5,2];PTS = 100;Span = diff(range')/(pts - 1);X = range(1,1): span(1): range(1,2);Y = range(2,1): span(2): range(2,2);Pop = 0 (pts * pts,2);值= 0 (pts,1);K = 1;为I = 1:pts为J = 1:pts pop(k,:) = [x(i),y(J)];Values (k) = fcn(pop(k,:));K = K + 1;结束结束Values =重塑(Values,pts,pts);轮廓(x, y,值);colorbar结束显示初始总体Ax = gca;图=图;copyobj (ax,无花果);colorbar暂停三秒钟查看最初的情节,然后继续。图(axx)暂停(3);情况下“通路”pop = state.Population(:,维度stoplot);plotHandle = findobj(get(gca,“孩子”),“标签”,“gaplotshowpopulation2”);集(plotHandle,“Xdata”流行(:1),“Ydata”流行(:2));结束
自定义的plot函数绘制代表线性不等式和约束条件的线,绘制适应度函数的水平曲线,以及绘制种群演化的曲线。这个绘图函数期望不仅有通常的输入(选择、州旗)
,也是适应度函数的函数句柄,@lincontest6
在这个例子中。为了生成水平曲线,自定义绘图函数需要适应度函数。
问题的约束
包括边界和线性约束。
A = [1,1;-1,2;2,1];B = [2;2;3];Lb = 0 (2,1);
选项包括绘图功能
设置选项以包含绘图函数遗传算法
运行。
选项= optimoptions(“遗传算法”,“PlotFcns”,...{{@gaplotshowpopulation2, @lincontest6}});
运行问题和观察人口
在第一个图中,初始种群在线性约束边界上有许多成员。人口相当分散。
rng默认的可重复性%[x, fval] = ga (@lincontest6 2 A、b[],[],磅,[],[],选项);
优化终止:适应度值的平均变化小于options.FunctionTolerance。
遗传算法
快速收敛到一个点,解。
设置人口规模
的人口规模场人口选项决定了每一代的人口规模。随着种群规模的增大,遗传算法可以搜索更多的点,从而得到更好的结果。然而,种群规模越大,遗传算法计算每一代所需的时间就越长。
请注意
你应该设置人口规模至少是的值变量数量,以便每个群体中的个体跨越被搜索的空间。
你可以尝试不同的设置人口规模这样可以在不花费大量时间的情况下获得良好的结果。