全局和局部优化使用遗传算法
搜索全局极小值
有时优化的目标是找到函数的全局最小值或最大值——在搜索空间中函数值小于或大于任何其他点的点。然而,优化算法有时会返回一个局部最小值—一个函数值小于附近点,但可能大于搜索空间中远处点的点的点。遗传算法有时可以通过正确的设置来克服这一缺陷。
例如,考虑下面的函数。
绘制函数。
t = -10: .1:103;为Ii = 1:长度(t) y(Ii) = two_min(t(Ii));结束情节(t, y)
函数有两个局部极小值,一个在 ,其中函数值为-1,另一个为 ,其中函数值为 .由于后一个值更小,全局最小值出现在 .
运行遗传算法
使用默认参数
的代码two_min
辅助函数在此示例结束.运行遗传算法
的默认参数来最小化two_min
函数。使用gaplot1drange
助手函数(包含在此示例结束)绘制的范围遗传算法
在每个迭代中的填充。
rng默认的%的再现性选择= optimoptions (“遗传算法”,“PlotFcn”, @gaplot1drange);[x, fval] = ga (@two_min 1 ,[],[],[],[],[],[],[], 选项)
优化终止:适应度值的平均变化小于options.FunctionTolerance。
x = -0.0688
fval = -1.0000
遗传算法返回一个非常接近局部极小值的点 .注意,所有个体的位置都在-60到60之间。总体从不探索全局极小值附近的点 .
增加初始范围
让遗传算法探索更大范围的点的一种方法——即增加种群的多样性——是增加初始范围。初始范围不必包括点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_min
helper函数。
函数y = two_min (x)如果X <= 100 y = -exp(-(X /100)^2);其他的Y = -exp(-1) + (x-100)*(x-102);结束结束
此代码创建gaplot1drange
helper函数。
函数国家= 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);结束结束