主要内容

本页采用了机器翻译。点击此处可查看最新英文版本。

您能证明一个解是全局的吗?

无法保证

如何判断是否已经找到目标函数的全局最小值?简短的回答是,您不能;您无法保证 Global Optimization Toolbox 求解器的结果是全局最优的。尽管所有 Global Optimization Toolbox 求解器都反复尝试寻找全局解,但没有求解器采用能够证明解为全局的算法。

但是,您可以使用本节中的策略来调查解。

使用 patternsearch 检查解是否为局部解

在确定一个所谓的解是否是全局最小值之前,首先要检查它是否是局部最小值。为此,请对问题运行 patternsearch

要将 problem 转换为使用 patternsearch 而不是 fminconfminunc,请输入

problem.solver = 'patternsearch';

另外,将起点更改为刚刚找到的解,并清除选项:

problem.x0 = x;
problem.options = [];

例如,检查附近点显示以下内容:

options = optimoptions(@fmincon,'Algorithm','active-set');
ffun = @(x)(x(1)-(x(1)-x(2))^2);
problem = createOptimProblem('fmincon', ...
    'objective',ffun,'x0',[1/2 1/3], ...
    'lb',[0 -1],'ub',[1 1],'options',options);
[x,fval,exitflag] = fmincon(problem)
x =
  1.0e-007 *
         0    0.1614

fval =
 -2.6059e-016

exitflag =
     1

然而,用 patternsearch 检查这个所谓的解表明存在更好的解。从报告的解 x 开始 patternsearch

% set the candidate solution x as the start point
problem.x0 = x;
problem.solver = 'patternsearch';
problem.options = [];
[xp,fvalp,exitflagp] = patternsearch(problem)
Optimization terminated: mesh size less than options.MeshTolerance.

xp =

    1.0000   -1.0000


fvalp =

   -3.0000


exitflagp =

     1

确定包含全局解的有界区域

假设您有一个在有界区域内的平滑目标函数。只要有足够的时间和起点,MultiStart 最终会找到一个全局解。

因此,如果您可以边界全局解存在的区域,那么您就可以在一定程度上保证 MultiStart 能够找到全局解。

例如,考虑函数

f=x6+y6+sin(x+y)(x2+y2)cos(x21+y2)(2+x4+x2y2+y4).

初始加数 x6 + y6 迫使函数在 |x| 或 |y| 的较大值时变大且为正。函数全局最小值的分量必须在边界之内

–10 ≤ x,y ≤ 10,

因为 106 比函数其他加数中出现的所有 104 的倍数大得多。

您可以为该问题确定较小的边界;例如,全局最小值介于 -2 和 2 之间。确定合理的边界比确定最佳边界更重要。

将 MultiStart 用于更多起点

要检查您的问题是否有更好的解,请使用附加起点运行 MultiStart。执行此任务时使用 MultiStart 而不是 GlobalSearch,因为 GlobalSearch 不会从所有起点运行局部求解器。

例如,请参阅 示例:寻找更好的解

另请参阅

主题