多个解
关于多个解
您可以通过以下语法调用 run
来获得对象中的多个解
[x,fval,exitflag,output,manymins] = run(...);
manymins
是解对象的向量;请参阅 GlobalOptimSolution
。manymins
向量按目标函数值的顺序排列,从最低(最好)到最高(最差)。每个解对象包含以下属性(字段):
注意
manymins
仅包含与正局部局部求解器退出标志相对应的那些解。如果您想要收集所有局部解(而不仅仅是与正退出标志相对应的解决方案),请使用 @savelocalsolutions
输出函数。请参阅 GlobalSearch 和 MultiStart 的输出函数。
有多种方法可以检查解对象的向量:
在 MATLAB® 工作区浏览器中。双击解对象,然后双击变量编辑器中的结果显示。
使用圆点表示法。
GlobalOptimSolution
属性是大写的。使用适当的大写字母来访问属性。例如,要查找函数值向量,请输入:
fcnvals = [manymins.Fval]
fcnvals = -1.0316 -0.2155 0
要获取导致最低函数值(
manymins
的第一个元素)的所有起点的元胞数组,请输入:smallX0 = manymins(1).X0
绘制一些字段值。例如,要查看结果
Fval
的范围,请输入:histogram([manymins.Fval],10)
这将生成计算函数值的直方图。(该图显示的直方图与前几个图的示例不同。)
改变不同解决方案的定义
在获得多个局部解后,您可能会发现您的容差并不合适。您可能会得到比您想要的更多的局部解,而且这些解决方案之间的间隔太近了。或者您可能拥有比您想要的更少的解,其中 GlobalSearch
或 MultiStart
将太多解聚集在一起。
为了处理这种情况,请使用不同的容差再次运行求解器。XTolerance
和 FunctionTolerance
容差决定了求解器如何将其输出分组到 GlobalOptimSolution
向量中。这些容差是 GlobalSearch
或 MultiStart
对象的属性。
例如,假设您想使用 fmincon
中的 active-set
算法来解决 使用 MultiStart 的运行的示例 中的问题。进一步假设您希望 XTolerance
和 FunctionTolerance
均具有 0.01
的容差。run
方法将目标函数值彼此相差 FunctionTolerance
以内且彼此相距小于 XTolerance
的局部解分组。为了获得解:
% Set the random stream to get exactly the same output % rng(14,'twister') ms = MultiStart('FunctionTolerance',0.01,'XTolerance',0.01); opts = optimoptions(@fmincon,'Algorithm','active-set'); sixmin = @(x)(4*x(1)^2 - 2.1*x(1)^4 + x(1)^6/3 ... + x(1)*x(2) - 4*x(2)^2 + 4*x(2)^4); problem = createOptimProblem('fmincon','x0',[-1,2],... 'objective',sixmin,'lb',[-3,-3],'ub',[3,3],... 'options',opts); [xminm,fminm,flagm,outptm,someminsm] = run(ms,problem,50);
MultiStart completed the runs from all start points. All 50 local solver runs converged with a positive local solver exit flag.
someminsm
someminsm = 1x5 GlobalOptimSolution Properties: X Fval Exitflag Output X0
在这种情况下,MultiStart
生成了五个不同的解。这里的“不同”意味着解在目标函数值或位置上相差超过 0.01。