主要内容

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

搜索全局极小值

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

例如,考虑下面的函数。

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:长度(t) y(Ii) = two_min(t(Ii));结束情节(t, y)

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

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

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

的代码two_min辅助函数在此示例结束.运行遗传算法的默认参数来最小化two_min函数。使用gaplot1drange助手函数(包含在此示例结束)绘制的范围遗传算法在每个迭代中的填充。

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

{

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 ,[],[],[],[],[],[],[], 选项)
优化终止:超过最大代数。

{

x = 100.9783
fval = -1.3674

这一次,自定义图显示了更广泛的个体。从一开始就有接近101的个体,总体均值开始收敛到101。

辅助函数

此代码创建two_minhelper函数。

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

此代码创建gaplot1drangehelper函数。

函数国家= gaplot1drange(选项、州旗)% gaplot1range绘制总体的平均值和范围。% STATE = gaplot1drange(OPTIONS,STATE,FLAG)绘制平均值和范围%(最高和最低)的个体(仅1-D)。%的例子:创建使用gaplot1range的选项%作为绘图函数% options = optimoptions('ga','PlotFcn',@gaplot1drange);版权所有The MathWorks, Inc.如果isinf(options.MaxGenerations) || size(state.Population,2) >“情节不可用”的插值函数“没有”);返回结束一代= state.Generation;分数= state.Population;smean =意味着(分数);Y = smean;L = smean - min(分数);U = max(分数)- 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);结束结束

相关的话题

Baidu
map