多个解
关于多个解
您可以通过以下语法调用 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 的运行的示例 中的问题。进一步假设您希望 0.01 和 XTolerance 均具有 FunctionTolerance 的容差。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。