GA.
有时优化的目标是找到函数的全局最小或最大值 - 在搜索空间中的任何其他点处的函数值更小或更大的点。然而,优化算法有时返回局部最小值 - 函数值小于附近点的点,但可能大于搜索空间中的遥控点。遗传算法有时可以通过正确的设置克服这种不足。
As an example, consider the following function.
绘制函数。
t = -10:.1:103;对于II = 1:长度(t)y(ii)=两个_min(t(ii));结束plot(t,y)
该函数有两个当地最小值,一个在 ,其中函数值为-1,另一个 ,功能值是 。Since the latter value is smaller, the global minimum occurs at 。
GA.
使用默认参数代码两个_min.
帮手功能是结束O.Fthis example。跑GA.
with default parameters to minimize the两个_min.
功能。使用gaplot1drange.
帮助函数(包括在结束O.Fthis example)绘制的范围GA.
每次迭代的人口。
R.ng默认%For reproducibilityO.ptions = optimoptions('Ga'那'plotfcn'那@gaplot1drange); [x,fval] = ga(@two_min,1,[],[],[],[],[],[],[],options)
优化终止:FITHS值的平均变化小于选项。功能化。
X=-0.。0.688
Fval = -1.0000
The genetic algorithm returns a point very close to the local minimum at 。请注意,所有个人都在-60和60之间。人口从未探索全球最低限度附近的点 。
使遗传算法的一种方法探讨更广泛的点 - 即增加群体的多样性 - 是增加初始范围。初始范围不必包括点x = 101,但必须足够大,使得算法在x = 101附近生成个体。设置initialpopulationrange.
O.ption to[-10;90]
and rerun the solver.
选项.InitialpopulationRange = [-10; 90];[x,fval] = ga(@ two_min,1,[],[],[],[],[],[],[],选项)
优化终止:超出了最大几代数。
x = 100.9783.
fval = -1.3674.
这一次,自定义情节显示了更广泛的个人。早期有101人附近,人口意味着开始收敛到101。
此代码创建两个_min.
帮手功能。
Functiony = two_min(x)如果x <= 100 y = -exp( - (x / 100)^ 2);其他y = -exp(-1) + (x-100)*(x-102);结束结束
此代码创建gaplot1drange.
帮手功能。
Function状态= Gaplot1drange(选项,状态,标志)%gaplot1drange绘制人口的平均值和范围。%状态= gaplot1drange(选项,状态,标志)绘制均值和范围%(最低和最低)的个人(仅限1-D)。%%例子:%Create options that use gaplot1drange%作为绘图功能%O.ptions = optimoptions('ga','PlotFcn',@gaplot1drange);%Copyright 2012-2014 Mathworks,Inc。如果Isinf(options.maxgenerations)||尺寸(state.pulation,2)> 1标题('剧情不可用'那'interp'那'没有');R.E.turn;结束一代= state.generation;得分=国家.Population;Smean =平均值(得分);y = smean;l = smean - min(得分);u = max(得分) - smean;switch旗案件'init'set(gca,'xlim',[1,options.maxgenerations + 1]);plotrange = errorbar(生成,y,l,u);设置(plotrange,'标签'那'gaplot1drange');title('Range of Population, Mean'那'interp'那'没有')Xlabel('代'那'interp'那'没有')案件'iter'plotrange = findobj(get(gca,“孩子”),'标签'那'gaplot1drange');newx = [get(plotrange,'Xdata')一代);newY = [get (plotRange,'ydata')Y]; newL = [get(plotRange,'Ldata')L]; newU = [get(plotRange,'udata')U]; set(plotRange,'Xdata',newx,'ydata',纽约,'Ldata',newl,'udata',纽杜);结束结束