决定遗传算法性能的最重要因素之一是遗传算法的性能多样性人口。如果个体之间的平均距离大,则多样性很高;如果平均距离很小,则多样性低。获得适当的多样性是一个试验和错误的问题。如果多样性太高或太低,则遗传算法可能无法良好。
本节介绍如何通过设置人口的初始范围来控制多样性。设置突变的数量描述突变的数量如何影响多样性。
本节还解释了如何设置人口规模.
默认情况下,遗传算法
使用创建函数创建一个随机初始种群。可以指定初始总体中向量的范围InitialPopulationRange
选择。
注意:初始范围通过指定下限和上限来限制初始群体中的点的范围。后续几代可以包含其条目不在初始范围内的点。使用所有代的上限和下限使用磅
和乌兰巴托
输入参数。
如果您了解解决问题的解决方案谎言的位置,请指定初始范围,以便它包含您对解决方案的猜测。然而,如果群体有足够的多样性,遗传算法也可以找到解决方案,即使它不在初始范围内。
这个例子展示了初始范围如何影响遗传算法的性能。这个例子使用了Rastrigin函数,在最小化Rastrigin的功能.函数的最小值是0,在原点处。
rng (1)重复性的%有趣= @rastriginsfcn;据nvar = 2;选项= Optimoptions('ga','plotfcn',{'gaplotbestf',“gaplotdistance”},...'initialpopulationrange',[1; 1.1]);[x,fval] = ga(fun,nvar,[],[],[],[],[],[],[],选项)
优化终止:FITHS值的平均变化小于选项。功能化。
x =1×20.9942 - 0.9950
fval = 1.9900
在每个代点上显示最佳健康的上部图在降低适应度值时表现出几乎没有进展。下图显示了各一代人之间的个体之间的平均距离,这是群体多样性的良好衡量标准。对于初始范围的这种设置,算法的分集太少了进行进度。
接下来,尝试设置InitialPopulationRange
(1, 100]。这一次的结果更加多变。当前的随机数设置会导致一个相当典型的结果。
选项。InitialPopulationRange =(1; 100年);[x,fval] = ga(fun,nvar,[],[],[],[],[],[],[],选项)
优化终止:FITHS值的平均变化小于选项。功能化。
x =1×20.9344 -1.0792
fval = 4.0889
这次,遗传算法取得进展,但由于个体之间的平均距离如此大,最好的个人远离最佳解决方案。
现在设置InitialPopulationRange
[1, 2]。这个设置非常适合这个问题。
options.initialpopulationRange = [1; 2];[x,fval] = ga(fun,nvar,[],[],[],[],[],[],[],选项)
优化终止:FITHS值的平均变化小于选项。功能化。
x =1×20.0013 0.0020
fval = 0.0011
适当的多样性通常导致遗传算法
返回比前两种情况更好的结果。
遗传算法
此示例显示了如何@gAcreationLearfeasible.
,线性约束问题的默认创建函数,为遗传算法
.总体分布良好,并且偏向于位于约束边界上。该示例使用了一个定制的绘图函数。
适应度函数
适应度函数为lincontest6
,包含在您的软件中。这是一个二元二次函数:
自定义绘图功能
将以下代码保存到您的MATLAB®路径上名为gaplotshowpopulation2
.
功能状态= gaplotshowpopulation2 (fcn ~、州旗)%gaplotshowpopulation2在2-d中绘制人口和线性约束。% STATE = gaplotshowpopulation2(OPTIONS,STATE,FLAG)绘制人口图%在二维空间中。%% 例子:% fun = @lincontest6;%选项= gaoptimset('plotfcn',{{@ gaplotshowpopulation2,fun}});%[x,fval,ExitFlag] = Ga(Fun,2,A,B,[],[],LB,[],[],选项);%此绘图函数仅在2-d中有效如果大小(state.Population 2) > 2返回;结束如果Nargin < 4 FCN = [];结束要绘制的尺寸DimensionStoplot = [1 2];开关旗帜%绘制初始化案件“init”流行= state.Population (:, dimensionsToPlot);plotHandle =情节(流行(:1),流行(:,2),'*');套装(侧板,“标签”,“gaplotshowpopulation2”) 标题("二维人口图",'interp',“没有”)Xlabelstr = Sprintf('%s%s',“变量”num2str (dimensionsToPlot (1)));ylabelStr = sprintf ('%s%s',“变量”num2str (dimensionsToPlot (2)));包含(xlabelStr'interp',“没有”);Ylabel(Ylabelstr,'interp',“没有”);抓住在;%画出不等式0.5阴谋(1.5 [0],[2],'m-。')%x1 + x2 <= 2情节(1.5 [0],[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])集(GCA,“ylim”,[-0.7,2.7]) axx = gcf;%等高线绘制目标函数如果〜isempty(fcn)范围= [-0.5,2; -0.5,2];PTS = 100;跨度=差异(范围')/(PTS - 1);x =范围(1,1):跨度(1):范围(1,2);Y =范围(2,1):跨度(2):范围(2,2);POP =零(PTS * PTS,2);值=零(PTS,1);k = 1;为我= 1:pts为j = 1:pts pop(k,:) = [x(i),y(j)];值(k)= fcn(pop(k,:));k = k + 1;结束结束值=重塑(价值观,分,分);轮廓(x, y,值);colorbar结束%显示初始人口甘氨胆酸ax =;无花果=图;copyobj (ax,无花果);colorbar暂停三秒钟查看最初的情节,然后继续图(axx)暂停(3);案件“通路”流行= state.Population (:, dimensionsToPlot);plothandle = findobj(get(gca,“孩子”),“标签”,“gaplotshowpopulation2”);套装(侧板,'xdata',pop(:,1),'ydata'流行(:2));结束
自定义绘图函数绘制表示线性不等式和束缚约束的线,绘图级别曲线的健身功能,并在演变时绘制群体。此绘图功能预计不仅具有通常的输入(选择、州旗)
,也是适应度函数的函数句柄,@lincontest6
在这个例子中。为了生成水平曲线,自定义plot函数需要适应度函数。
问题限制
包括界限和线性约束。
a = [1,1; -1,2; 2,1];B = [2; 2; 3];lb =零(2,1);
包含绘图功能的选项
设置选项,以包括绘图功能时遗传算法
运行。
选项= Optimoptions('ga','plotfcns',...{{@gaplotshowpopulation2, @lincontest6}});
运行问题并观察人口
在第一张图中,初始种群在线性约束边界上有许多成员。人口相当分散。
RNG.默认的%的再现性[x, fval] = ga (@lincontest6 2 A、b[],[],磅,[],[],选项);
优化终止:FITHS值的平均变化小于选项。功能化。
遗传算法
收敛到单点,解决方案。
的人口规模场人口选项确定每代人口的大小。增加人口大小使遗传算法能够搜索更多点,从而获得更好的结果。然而,群体大小越大,遗传算法需要越长,用于计算每种一代。
请注意
你应该设定人口规模至少是价值变量数量,使每个种群中的个体跨越被搜索的空间。
你可以尝试不同的设置人口规模如果不采取禁止时间运行,则会恢复良好的结果。