决定遗传算法性能的最重要因素之一是遗传算法的性能多样性如果个体之间的平均距离较大,则多样性较高;如果平均距离较小,则多样性较低。获得适当数量的多样性需要反复试验。如果多样性过高或过低,则遗传算法可能表现不佳。
本节说明如何通过设置种群的初始范围来控制多样性。设定突变量描述突变的数量如何影响多样性。
本节还说明了如何设置人口规模.
默认情况下,遗传算法
使用创建函数创建一个随机初始种群。可以指定初始总体中向量的范围InitialPopulationRange
选择。
注意:初始范围通过指定下限和上限来限制初始总体中点的范围。后续世代可以包含其项不在初始范围内的点。使用磅
和乌兰巴托
输入参数。
如果您大致知道问题的解决方案在哪里,请指定初始范围,使其包含您对解决方案的猜测。但是,如果种群具有足够的多样性,即使不在初始范围内,遗传算法也可以找到解决方案。
这个例子展示了初始范围如何影响遗传算法的性能。这个例子使用了Rastrigin函数,在最小化Rastrigin的功能.函数的最小值是0,在原点处。
rng (1)%为了再现性有趣= @rastriginsfcn;据nvar = 2;选项=最佳选项(“遗传算法”,“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]。这个设置非常适合这个问题。
options.InitialPopulationRange=[1;2];[x,fval]=ga(乐趣,nvar,[],[],[],[],[],[],[],[],[],[],[]选项)
优化终止:适应值的平均变化小于options.FunctionTolerance。
x =1×20.0013 0.0020
fval = 0.0011
适当的多样性通常导致遗传算法
返回比前两种情况更好的结果。
遗传算法
这个例子展示了如何@GACREATIONLINEAR是可行的
,线性约束问题的默认创建函数,为遗传算法
.总体分布良好,并且偏向于位于约束边界上。该示例使用了一个定制的绘图函数。
适应度函数
适应度函数为lincontest6
,包含在您的软件中。这是一个二元二次函数:
自定义绘制函数
将以下代码保存到您的MATLAB®路径上名为gaplotshowpopulation2
.
作用状态= gaplotshowpopulation2 (fcn ~、州旗)%gaplotshowpopulation2在二维中绘制总体和线性约束。% STATE = gaplotshowpopulation2(OPTIONS,STATE,FLAG)绘制人口图%在二维空间中。%%例如:% fun = @lincontest6;%options=gaoptimset('PlotFcn',{{@gaplotshowpopulation2,fun}});%[x,fval,exitflag]=ga(fun,2,A,b,[],[],[],lb,[],[]选项);%此绘图函数仅在2-d中有效如果大小(state.Population 2) > 2回来;结束如果Nargin < 4 FCN = [];结束要绘制的尺寸dimensionsToPlot=[12];开关旗帜%绘制初始化案例“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绘图([01.5],[30],“m-。”);%2*x1+x2<=3%绘图下界绘图([0 0],[0 2],“m-。”);% lb = [0 0];地块([0 1.5],[0 0],“m-。”);% lb = [0 0];set(gca,“xlim”,[-0.7,2.2])集(gca,“ylim”,[-0.7,2.7]) axx = gcf;%等高线绘制目标函数如果~isempty(fcn) range = [-0.5,2;-0.5,2];分= 100;Span = diff(range')/(pts - 1);X = range(1,1): span(1): range(1,2);Y = range(2,1): span(2): range(2,2);流行= 0 (pts * pts,2);值= 0(1分);k = 1;为i=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);案例“通路”pop=state.Population(:,dimensionsToPlot);plotHandle=findobj(get(gca,“孩子”),“标签”,“gaplotshowpopulation2”); 设置(绘图手柄,“扩展数据”,pop(:,1),“伊达塔”流行(:2));结束
自定义绘图函数绘制表示线性不等式和边界约束的线,绘制适应度函数的水平曲线,并绘制种群的演化。此绘图函数期望不仅具有常规输入(选择、州旗)
,也是适应度函数的函数句柄,@lincontest6
在这个例子中。为了生成水平曲线,自定义plot函数需要适应度函数。
问题约束
包括边界和线性约束。
A=[1,1;-1,2;2,1];b=[2;2;3];lb=0(2,1);
包含绘图功能的选项
设置选项,以包括绘图功能时遗传算法
跑。
选项=最佳选项(“遗传算法”,“PlotFcns”,...{{@gaplotshowpopulation2, @lincontest6}});
运行问题并观察人口
在第一张图中,初始种群在线性约束边界上有许多成员。人口相当分散。
rng默认的%的再现性[x, fval] = ga (@lincontest6 2 A、b[],[],磅,[],[],选项);
优化终止:适应值的平均变化小于options.FunctionTolerance。
遗传算法
快速收敛到一个点,即解。
的人口规模场人口选项决定每一代的种群规模。增大种群规模可使遗传算法搜索更多点,从而获得更好的结果。但是,种群规模越大,遗传算法计算每一代所需的时间越长。
请注意
你应该设定人口规模至少是价值数量的变量,使每个种群中的个体跨越被搜索的空间。
你可以尝试不同的设置人口规模这样可以在不花费令人望而却步的时间的情况下返回良好的结果。