主要内容

使用全局优化和局部优化遗传算法

寻找全局最小值

有时,优化的目标是找到一个函数的全局最小值或最大值,即函数值在搜索空间中任何其他点上都更小或更大的点。然而,优化算法有时会返回一个局部最小值,即函数值小于附近点,但可能大于搜索空间中遥远点的值。遗传算法有时可以通过正确的设置来克服这一缺陷。

以下面的函数为例。

f x - 经验值 - x 1 0 0 2 f o r x 1 0 0 - 经验值 - 1 + x - 1 0 0 x - 1 0 2 f o r x > 1 0 0

绘制函数。

t = -10: .1:103;Ii = 1:length(t) y(Ii) = two_min(t(Ii));结束情节(t, y)

图中包含一个轴对象。axis对象包含一个类型为line的对象。

这个函数有两个局部极小值,一个在 x 0 ,其中函数值为-1,另一个为 x 1 0 1 ,其中函数值为 - - - - - - 1 - - - - - - 1 / e .由于后一个值较小,全局最小值出现在 x 1 0 1

运行遗传算法使用默认参数

的代码two_minHelper函数在这个例子到此结束.运行遗传算法使用默认参数最小化two_min函数。使用gaplot1drange辅助函数(包含在这个例子到此结束)来绘制遗传算法每次迭代的种群。

rng默认的%的再现性选择= optimoptions (“遗传算法”“PlotFcn”, @gaplot1drange);[x, fval] = ga (@two_min 1 ,[],[],[],[],[],[],[], 选项)
优化终止:适应度值的平均变化小于选项。

图遗传算法包含一个轴对象。标题为Population Range, Mean的axis对象包含一个类型为errorbar的对象。

x = -0.0688
fval = -1.0000

遗传算法返回一个非常接近局部最小值的点 x 0 .注意所有的个体都在-60到60之间。种群从不探索全球最小值附近的点 x 1 0 1

增加初始范围

一种使遗传算法探索更大范围点的方法——即增加种群的多样性——是增加初始范围。初始范围不必包括x = 101点,但必须足够大,以便算法生成x = 101附近的个体。设置InitialPopulationRange选项(-10; 90)然后重新运行求解器。

选项。InitialPopulationRange = (-10; 90);[x, fval] = ga (@two_min 1 ,[],[],[],[],[],[],[], 选项)
优化终止:超过了最大代数。

图遗传算法包含一个轴对象。标题为Population Range, Mean的axis对象包含一个类型为errorbar的对象。

x = 100.9783
fval = -1.3674

这一次,自定义图显示了更广泛的个人范围。从早期开始就有个体在101附近,种群均值开始收敛到101。

辅助函数

此代码创建two_minhelper函数。

函数y = two_min (x)如果y = -exp(-(X /100)^2);其他的Y = -exp(-1) + (x-100)*(x-102);结束结束

此代码创建gaplot1drangehelper函数。

函数国家= gaplot1drange(选项、州旗)% gaplot1range绘制总体的平均值和范围。% STATE = gaplot1drange(OPTIONS,STATE,FLAG)绘制平均值和范围%(最高和最低)个人(仅1-D)。%的例子:%创建使用gaplot1drange的选项%作为绘图函数% options = optimoptions('ga','PlotFcn',@gaplot1drange);版权所有2012-2014 The MathWorks, Inc.如果isinf(options.MaxGenerations) || size(state.Population,2) > 1 title(“情节不可用”的插值函数“没有”);返回结束一代= state.Generation;分数= state.Population;smean =意味着(分数);Y = smean;L = smean - min(得分);U = max(score) - smean;开关国旗情况下“init”集(gca),“xlim”, 1, options.MaxGenerations + 1);plotRange = errorbar(代Y L U);集(plotRange,“标签”“gaplot1drange”);标题(“平均人口范围”的插值函数“没有”)包含(“代”的插值函数“没有”情况下“通路”plotRange = findobj (get (gca),“孩子”),“标签”“gaplot1drange”);newX = [get (plotRange,“Xdata”)一代);newY = [get (plotRange,“Ydata”) Y);newL = [get (plotRange,“Ldata”) L);newU = [get (plotRange,“Udata”) U);集(plotRange,“Xdata”newX,“Ydata”newY,“Ldata”newL,“Udata”, newU);结束结束

相关的话题