这个例子比较surrogateopt
给另外两个解算者:fmincon
,平滑问题的推荐解决方案,和patternsearch
,非光滑问题的推荐解决方案。这个例子使用了一个二维区域上的非光滑函数。
类型nonSmoothFcn
函数[f, g] = nonSmoothFcn(x) %非光滑目标函数%elseif x (1) < 3 f (i) = 2 * sin (x(我,1))——(x(我,1)* x(我,2)^ 2)/ 10 + 15;elseif x (1) < 0 f (i) = 0.5 * x(我,1)^ 2 + 20 + abs (x(我,2))+ patho (x(我,:));elseif x (1) > = 0 f (i) = 3 * sqrt (x(我,1))+ 25 + abs (x(我,2))+ patho (x(我,:));计算梯度g = NaN;如果x(i,1) < -7 g = 2*[x(i,1)];x(我,2)];elseif x(我,1)< 3 g = (2 * cos (x(我,1))- (x(我,2)^ 2)/ 10;x - x(1) *(我,2)/ 5];Elseif x(i,1) < 0 [fp,gp] = patho(x(i,:)); if x(i,2) > 0 g = [x(i,1)+gp(1); 1+gp(2)]; elseif x(i,2) < 0 g = [x(i,1)+gp(1); -1+gp(2)]; end elseif x(i,1) >0 [fp,gp] = patho(x(i,:)); if x(i,2) > 0 g = [.15/sqrt(x(i,1))+gp(1); 1+ gp(2)]; elseif x(i,2) < 0 g = [.15/sqrt(x(i,1))+gp(1); -1+ gp(2)]; end end function [f,g] = patho(x) Max = 500; f = zeros(size(x,1),1); g = zeros(size(x)); for k = 1:Max %k arg = sin(pi*k^2*x)/(pi*k^2); f = f + sum(arg,2); g = g + cos(pi*k^2*x); end
mplier = 0.1;%缩放控制变量Objfcn = @ (x) nonSmoothFcn (mplier * x);%目标函数的句柄Range = [-6 6;-6 6]/mplier;%用于绘制目标函数的范围rng默认的重置全局随机数生成器showNonSmoothFcn (Objfcn、范围);标题(“非光滑目标函数”)视图(-151年,44岁)
drawnow
看看surrogateopt
在默认迭代次数内定位全局最小值。
磅= 6 * 1(1、2)/ mplier;乌兰巴托=磅;[x, fvals eflags、输出]= surrogateopt (Objfcn磅,乌兰巴托);
surrogateopt停止,因为它超过了'options.MaxFunctionEvaluations'设置的函数求值限制。
流("找到的最小值= %g.\r"fvals)
最低找到的值= 13。
图showNonSmoothFcn (Objfcn、范围);视图(-151年,44)在p1 = plot3 (xs (1) x (2), fvals,“om”,“MarkerSize”15岁的“MarkerFaceColor”,“米”);传奇(p1, {“解决方案”})举行从
patternsearch
集patternsearch
选择使用相同数量的函数求值,从边界内的随机点开始。
rng默认的X0 = lb + rand(size(lb))。*(乌兰巴托-磅);optsps = optimoptions (“patternsearch”,“MaxFunctionEvaluations”, 200,“PlotFcn”,“psplotbestf”);(xps、fvalps eflagps outputps] = patternsearch (x0 Objfcn ,[],[],[],[], 磅,乌兰巴托,[],optsps);
优化终止:网格尺寸小于选项。网格公差。
图showNonSmoothFcn (Objfcn、范围);视图(-151年,44)在p1 = plot3 (x0 x0 (1), (2), Objfcn (x0),“ob”,“MarkerSize”12“MarkerFaceColor”,“b”);p2 = plot3 (xps (1) xps (2), fvalps,“om”,“MarkerSize”15岁的“MarkerFaceColor”,“米”);传奇((p1, p2) {“起点”,“解决方案”})举行从
patternsearch
找到了相同的解surrogateopt
.
限制函数计算的次数,然后再试一次。
optsurr = optimoptions (“surrogateopt”,“MaxFunctionEvaluations”, 40);[x, fvals eflags、输出]= surrogateopt (Objfcn磅,乌兰巴托,optsurr);
surrogateopt停止,因为它超过了'options.MaxFunctionEvaluations'设置的函数求值限制。
optsps。MaxFunctionEvaluations = 40;(xps、fvalps eflagps outputps] = patternsearch (x0 Objfcn ,[],[],[],[], 磅,乌兰巴托,[],optsps);
超过的最大函数求值数:
同样,两个解算者很快就找到了全局解决方案。
fmincon
fmincon
在求解起点附近的局部解时是有效的。然而,在非凸或非光滑问题中,它很容易陷入远离全局解的困境。
集fmincon
选择使用绘图函数,与以前的求解器相同数量的函数计算,以及相同的起始点patternsearch
.
选择= optimoptions (“fmincon”,“PlotFcn”,“optimplotfval”,“MaxFunctionEvaluations”, 200);[fmsol, fmfval eflag fmoutput] = fmincon (x0 Objfcn ,[],[],[],[], 磅,乌兰巴托,[],选择);
局部最小值。约束满足。Fmincon停止,因为当前步长小于步长公差的值,约束满足到约束公差的值之内。
图showNonSmoothFcn (Objfcn、范围);视图(-151年,44)在p1 = plot3 (x0 x0 (1), (2), Objfcn (x0),“ob”,“MarkerSize”12“MarkerFaceColor”,“b”);fmsol p2 = plot3 (fmsol (1), (2), fmfval,“om”,“MarkerSize”15岁的“MarkerFaceColor”,“米”);传奇((p1, p2) {“起点”,“解决方案”})举行从
fmincon
在开始点附近陷入局部极小值。
fmincon
|patternsearch
|surrogateopt