您能证明一个解是全局的吗?
无法保证
如何判断是否已经找到目标函数的全局最小值?简短的回答是,您不能;您无法保证 Global Optimization Toolbox 求解器的结果是全局最优的。尽管所有 Global Optimization Toolbox 求解器都反复尝试寻找全局解,但没有求解器采用能够证明解为全局的算法。
但是,您可以使用本节中的策略来调查解。
使用 patternsearch 检查解是否为局部解
在确定一个所谓的解是否是全局最小值之前,首先要检查它是否是局部最小值。为此,请对问题运行 patternsearch
。
要将 problem
转换为使用 patternsearch
而不是 fmincon
或 fminunc
,请输入
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
能够找到全局解。
例如,考虑函数
初始加数 x6 + y6 迫使函数在 |x| 或 |y| 的较大值时变大且为正。函数全局最小值的分量必须在边界之内
–10 ≤ x,y ≤ 10,
因为 106 比函数其他加数中出现的所有 104 的倍数大得多。
您可以为该问题确定较小的边界;例如,全局最小值介于 -2 和 2 之间。确定合理的边界比确定最佳边界更重要。
将 MultiStart 用于更多起点
要检查您的问题是否有更好的解,请使用附加起点运行 MultiStart
。执行此任务时使用 MultiStart
而不是 GlobalSearch
,因为 GlobalSearch
不会从所有起点运行局部求解器。
例如,请参阅 示例:寻找更好的解。