主要内容

孤立的全球最小值

难以定位的全局最低限度

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

  • 添加合理的界限

  • 采取大量的随机起点

  • 制作一个有条理的起点网格

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

此示例显示了这些方法和一些变体。

这个函数-Sech(X所有人都几乎是0|X| > 5,双曲正割(0)= 1。该示例是SECH函数的二维版本,最小值[1],另一个[1E5,-1E5]

FXy) = -10双曲正割(|X- (1,1)|) - 20sec(。- (1e5, - 1e5)|) - 1。

F在(1E5,-1E5)上具有全局最小-21,以及(1,1)的局部最小值。

用于生成图形的代码

最小值(1e5, -1e5)显示为一个狭窄的峰值。最小值(1,1)不能显示,因为它太窄了。

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

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

Globalsearch.多层的使用默认的全局选项找不到全局最小值,因为默认开始点组件在范围内(-9999,10001)Globalsearch.(-1000、1000)多层的

附加界限-1e6和1e6问题Globalsearch.通常没有找到全局最小值:

x1 = [1];x2 = [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;rng(14,'twister') % for再现性[xfinal,fval] = run(gs,problem) GlobalSearch停止,因为它分析了所有试验点。所有32个本地求解程序都运行一个正的本地求解程序退出标志。xfinal = 1.0000 1.0000 fval = -11.0000

带有边界和更多起点的Globalsearch

为了找到全局最小值,你可以搜索更多的点。本例使用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.发现全局最小值。

多地标有界限和许多起点

或者,您可以搜索使用多层的有很多起点。本例使用1e5起点和aMaxTime300年代:

ms = multiStart(GS);[xm,fvalm] =运行(ms,问题,1e5)多际艺料因为超过了最大时间而停止。MultiStart在超过时钟时间限制之前称为本地求解器17266次(MAXTIME = 300秒)。17266本地求解器运行融合,并使用正本地求解器出口标志。XM = 1.0000 1.0000 FVALM = -11.0000

在这种情况下,多层的无法找到全局最小值。

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

你也可以使用多层的在一个无界区域内寻找全局最小值。同样地,你需要有许多起始点才能找到全局最小值。

使用该方法生成10,000线的代码生成10,000个广泛分散的随机起始点广泛分散的点无约束的组件newprob是一个使用该问题的问题结构Fminunc.本地求解器和无限制:

RNG(0,'Twister')%u = rand(1e4,1);u = 1./u;u = exp(u) -  exp(1);s = rand(1e4,1)* 2 * pi;stpts = [u。* cos(s),u。* sin(s)];startpls = customstartpointset(stpts);opts = Optimoptions(@ Fminunc,'算法','准牛顿');newprob = createoptimproblem('fminunc','x0',[0; 0],'目标',f,...'选项',选择);[xcust,fcust] =运行(ms,newprob,startpls)multiStart完成了所有起始点的运行。所有10000个本地解算程序都运行了一个正的本地解算程序退出标志。 xcust = 1.0e+05 * 1.0000 -1.0000 fcust = -21.0000

在这种情况下,多层的发现全局最小值。

多起点与一个规则网格的起点

你也可以使用网格的起始点来代替随机的起始点。要学习如何为更多维度或有小扰动的维度构建规则网格,请参见均匀网格扰动网格

xx = 1 e6:1e4:1e6;[xxx, yyy] = meshgrid (xx, xx);z = [xxx (:), yyy (:));bigstart = CustomStartPointSet (z);[xgrid,fgrid] = run(ms,newprob,bigstart) MultiStart从所有的起点完成运行。所有10000个本地解算程序都运行了一个正的本地解算程序退出标志。xgrid = 1.0e+004 * 10.0000 -10.0000

在这种情况下,多层的发现全局最小值。

多起点规则网格和有希望的起点

制作一个开始点的常规网格,尤其是高维度,可以使用过多的内存量或时间。您可以过滤起始点以仅运行具有小目标函数值的那些。

要最有效地执行此筛选,请以矢量化方式写入您的目标函数。有关信息,请参阅写一个向量化的函数对目标函数和约束函数进行矢量化。以下功能处理基于输入矩阵计算目标的向量,其行表示起始点:

x1 = [1];x2 = [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的点运行本地求解器。从一个比在密集的网格开始多起点与一个规则网格的起点,然后过滤掉所有功能值高的点:

XX = -1E6:1E3:1E6;[xxx, yyy] = meshgrid (xx, xx);z = [xxx (:), yyy (:));Idx = g(z)<-2;有希望启动点的%索引zz = z(idx,:);smallstartset = customstartpointset(zz);opts = Optimoptions(@ Fminunc,'算法','准牛顿','显示','关闭');newprobg = createOptimproblem('fminunc','x0',[0,0],...'目标',g,'选项',选择);I%行向量X0由于G期望行[Xfew,FFew] = Run(MS,NewProbg,SmallStartSet)MultiStart完成了所有起始点的运行。所有2个本地解算器运行融合为正本地求解器出口标志。 xfew = 100000 -100000 ffew = -21

在这种情况下,多层的发现全局最小值。只有两个开始点smallstartset.,其中一个是全局最小值。

相关的话题