主要内容

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

寻找全球最低

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

作为一个例子,考虑下面的函数。

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

图包含一个坐标轴对象。坐标轴对象包含一个类型的对象。

这个函数有两个局部最小值,一个 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健身价值的变化。

图遗传算法包含一个坐标轴对象。坐标轴对象标题范围的人口,意味着包含一个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[]、[][],[],[],[],[],选项)
优化终止:超过了一代又一代的最大数目。

图遗传算法包含一个坐标轴对象。坐标轴对象标题范围的人口,意味着包含一个errorbar类型的对象。

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(选项、州旗)% gaplot1drange块均值和范围的人口。% = gaplot1drange状态(选择、州旗)情节均值和范围%(最高和最低的)个人(一维)。%%的例子:%使用gaplot1drange创建选项%绘制函数% = optimoptions选项(“遗传算法”,“PlotFcn”, @gaplot1drange);% 2012 - 2014版权MathWorks公司。如果isinf (options.MaxGenerations) | |大小(state.Population 2) > 1标题(“情节不可用”,的插值函数,“没有”);返回;结束一代= 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);结束结束

相关的话题