主要内容

孤立的全球最低

Difficult-To-Locate全球最低

当盆地很小或你不确定最小值的位置时,在全球最小值吸引盆地中找到一个起点可能是困难的。要解决这类问题,你可以:

  • 添加合理的界限

  • 取大量随机的起点

  • 为起点做一个有条理的网格

  • 对于无约束问题,取广泛分散的随机起点

这个例子展示了这些方法和一些变体。

这个函数双曲正割(x对所有人来说都接近0吗|x| > 5,双曲正割(0)= 1.这个例子是一个二维版本的sech函数,在[1],另一个在(1 e5, 1 e5)

fxy) = -10双曲正割(|x- (1,1)|) - 20sech(。(1) x - (1e5, - 1e5)|) - 1。

f在(1e5, -1e5)处全局最小值为-21,在(1,1)处局部最小值为-11。

生成图形的代码

在(1e5, -1e5)处的最小值表现为一个狭窄的尖峰。(1,1)处的最小值由于太窄而无法显示。

下面几节展示了寻找全局最小值的各种方法。有些方法在这个问题上并不成功。不过,您可能会发现每种方法对不同的问题都有用。

默认设置无法找到全局最小值-添加边界

GlobalSearchMultiStart使用默认全局选项无法找到全局最小值,因为默认的起始点组件的范围是(- 9999,10001)GlobalSearch(-1000、1000)MultiStart

具有-1e6和1e6 in的附加边界问题GlobalSearch通常不会找到全局最小值:

x = [1;1];f = @ (x) -10 *双曲正割(规范(x (:) x1)) -20 *双曲正割((规范(x (:) x2)) * 3的军医)1;选择= optimoptions (@fmincon、“算法”、“有效集”);问题= createOptimProblem (fmincon, x0,(0,0),“客观”,f,…“磅”,(1)e6; 1 e6),乌兰巴托,(1)e6; 1 e6),“选项”,选择);gs = GlobalSearch;[xfinal,fval] = run(gs,problem)所有32个本地求解器都以一个正的本地求解器退出标志收敛。fval = -11.0000

全球搜索与边界和更多的起点

为了找到全局最小值,你可以搜索更多的点。这个例子使用1e5起点,和aMaxTime300年代:

gs。NumTrialPoints = 1 e5;gs。MaxTime = 300;[xg,fvalg] = run(gs,problem) GlobalSearch因超过最大时间而停止。GlobalSearch在超过时钟时间限制(MaxTime = 300秒)前调用本地求解器2186次。1943年本地解算器运行时收敛于一个正的本地解算器退出标志。Xg = 1.0e+04 * 10.0000 -10.0000 fvalg = -21.0000

在这种情况下,GlobalSearch找到全局最小值。

有边界和多起点的MultiStart

或者,您可以使用MultiStart有许多起点。这个例子使用1e5起点,和aMaxTime300年代:

= MultiStart女士(gs);[xm,fvalm] = run(ms,problem,1e5) MultiStart停止,因为超过了最大时间。在超过时钟时间限制(MaxTime = 300秒)之前,MultiStart调用本地解算器17266次。17266本地求解器运行时收敛于一个正的本地求解器退出标志。Xm = 1.0000 fvalm = -11.0000

在这种情况下,MultiStart找不到全局最小值。

多起点无边界,广泛分散的起点

你也可以用MultiStart在无界区域内搜索全局最小值。同样,您需要许多起点才能很好地找到全局最小值。

前五行代码使用中描述的方法生成10,000个广泛分散的随机起始点无约束分量的广泛分散点newprob问题结构是否使用fminunc局部求解器和无边界:

Rng (0,'twister') %为重现性u = rand(1e4,1);u = 1. / u;U = exp(U) - exp(1);s =兰德(1 e4, 1) * 2 *π;stpts = [u。* cos (s), u。* sin (s)];startpts = CustomStartPointSet (stpts);选择= optimoptions (@fminunc、“算法”、“拟牛顿”);newprob = createOptimProblem (fminunc, x0,(0, 0),“客观”,f,…“选项”,选择);[xust,fcust] = run(ms,newprob,startpts) All 10000 local solver runs converged with a positive local solver exit flag. xcust = 1.0e+05 * 1.0000 -1.0000 fcust = -21.0000

在这种情况下,MultiStart找到全局最小值。

MultiStart与一个规则网格的起点

您还可以使用一个网格的起始点而不是随机的起始点。要学习如何构建更多维度的规则网格,或有小扰动的网格,请参阅均匀的网格摄动网格

xx = 1 e6:1e4:1e6;[xxx, yyy] = meshgrid (xx, xx);z = [xxx (:), yyy (:));bigstart = CustomStartPointSet (z);[xgrid,fgrid] = run(ms, newproc,bigstart)所有10000个本地求解器运行时都收敛到一个正的本地求解器退出标志。Xgrid = 1.0e+004 * 10.0000 -10.0000 fgrid = -21.0000

在这种情况下,MultiStart找到全局最小值。

MultiStart与规则的网格和有希望的起点

创建一个规则的起点网格,特别是在高维空间中,可能会占用过多的内存或时间。您可以过滤开始点,只运行那些目标函数值小的点。

为了最有效地执行这个过滤,以向量化的方式编写目标函数。信息,请参阅编写一个向量化函数向量化目标函数和约束函数.下面的函数handle基于一个输入矩阵计算目标向量,该矩阵的行表示起始点:

x = [1;1];G = @(x) -10*sech(√(x(:,1)-x1(1)))^2 + (x(:,2)-x1(2)) ^2)…-20 *双曲正割(√(x (: 1) x2(1))。^ 2 + (x (:, 2) x2 (2)) ^ 2)) 1;

假设您希望只对值小于-2的点运行本地求解器。从一个比in更密集的网格开始MultiStart与一个规则网格的起点,然后过滤掉所有功能值高的点:

xx = 1 e6:1e3:1e6;[xxx, yyy] = meshgrid (xx, xx);z = [xxx (:), yyy (:));Idx = g(z) < -2;% index of promising start points zz = z(idx,:);smallstartset = CustomStartPointSet (zz);选择= optimoptions (@fminunc、“算法”、“拟牛顿”,“显示”,“关闭”);newprobg = createOptimProblem (fminunc, x0,(0,0),…“客观”,g,“选项”,选择);% row vector x0 since g expecrows [xfew,ffew] = run(ms,newprobg,smallstartset) MultiStart从所有开始点完成运行。 All 2 local solver runs converged with a positive local solver exit flag. xfew = 100000 -100000 ffew = -21

在这种情况下,MultiStart找到全局最小值。只有两个起点smallstartset,其中一个是全局最小值。

相关的话题