主要内容

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

run

运行多启动求解器

说明

x = run(gs,problem) 运行 GlobalSearch 来寻找 problem 的一个或多个局部解解。

示例

x = run(ms,problem,k)MultiStart 起点上运行 k 来找到 problem 的一个或多个局部解解。

示例

x = run(ms,problem,startpts)MultiStart 中描述的起点在 problem 上运行 startpts

示例

[x,fval] = run(___) 使用前面语法中的参量返回 x 处的目标函数值,即找到的最佳点。对于 lsqcurvefitlsqnonlin 局部求解器,fval 包含残差的平方范数。

示例

[x,fval,exitflag,output] = run(___) 还返回一个描述返回条件的退出标志,以及一个描述运行迭代的输出结构体。

示例

[x,fval,exitflag,output,solutions] = run(___) 还返回一个包含运行期间发现的不同局部最小值的解向量。solutions 对应于正局部求解器退出标志。

示例

示例

全部折叠

创建一个具有多个局部极小值的优化问题,并尝试使用 GlobalSearch 找到全局最小值。目标是六峰驼峰问题(请参阅运行求解器)。

rng default % For reproducibility
gs = GlobalSearch;
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]);
x = run(gs,problem)
GlobalSearch stopped because it analyzed all the trial points.

All 8 local solver runs converged with a positive local solver exit flag.
x = 1×2

   -0.0898    0.7127

您可以使用以下语法在调用 x 时请求 run 处的目标函数值:

[x,fval] = run(gs,problem)

但是,如果您忽略了请求 fval,您仍然可以计算 x 处的目标函数值。

fval = sixmin(x)
fval = 
-1.0316

使用默认的 MultiStart 对象来解决六峰驼峰问题(请参阅 运行求解器)。

rng default % For reproducibility
ms = MultiStart;
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]);
[x,fval,exitflag,outpt,solutions] = run(ms,problem,30);
MultiStart completed the runs from all start points. 

All 30 local solver runs converged with a positive local solver exitflag.

检查最佳函数值以及达到最佳函数值的位置。

fprintf('The best function value is %f.\n',fval)
The best function value is -1.031628.
fprintf('The location where this value is attained is [%f,%f].',x)
The location where this value is attained is [-0.089842,0.712656].

为每个分量在 MultiStart 范围内的 [-3,3] 创建一组初始二维点。

v = -3:0.5:3;
[X,Y] = meshgrid(v);
ptmatrix = [X(:),Y(:)];
tpoints = CustomStartPointSet(ptmatrix);

MultiStart 中的点开始 tpoints,找到最小化六峰驼峰问题(请参阅 运行求解器)的点。

rng default % For reproducibility
ms = MultiStart;
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]);
x = run(ms,problem,tpoints)
MultiStart completed the runs from all start points. 

All 169 local solver runs converged with a positive local solver exitflag.
x = 1×2

    0.0898   -0.7127

创建一个具有多个局部极小值的优化问题,并尝试使用 GlobalSearch 找到全局最小值。目标是六峰驼峰问题(请参阅运行求解器)。

rng default % For reproducibility
gs = GlobalSearch;
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]);
[x,fval,exitflag,output,solutions] = run(gs,problem);
GlobalSearch stopped because it analyzed all the trial points.

All 8 local solver runs converged with a positive local solver exit flag.

要了解 GlobalSearch 如何解决这个问题,请检查 output 结构体和 solutions 对象。

disp(output)
                funcCount: 2245
         localSolverTotal: 8
       localSolverSuccess: 8
    localSolverIncomplete: 0
    localSolverNoSolution: 0
                  message: 'GlobalSearch stopped because it analyzed all the trial points.↵↵All 8 local solver runs converged with a positive local solver exit flag.'
  • GlobalSearch 对目标函数进行了 2261 次求值。

  • GlobalSearch 从八个不同的点出发跑到了 fmincon

  • 所有 fmincon 运行均成功收敛到局部解。

disp(solutions)
  1×4 GlobalOptimSolution array with properties:

    X
    Fval
    Exitflag
    Output
    X0
arrayfun(@(x)x.Output.funcCount,solutions)
ans = 1×4

    31    34    40     3

八次局部求解器运行找到了四个解。funcCount 的输出显示 fmincon 只需不超过 40 次函数计算即可得出四个解中的每一个。输出没有显示四次 fmincon 运行进行了多少次函数计算。2261 个函数计算的大多数似乎都是为了让 GlobalSearch 评估试验点,而不是为了让 fmincon 从这些点开始运行。

输入参数

全部折叠

GlobalSearch 求解器,指定为 GlobalSearch 对象。使用 GlobalSearch 命令创建 gs

MultiStart 求解器,指定为 MultiStart 对象。使用 MultiStart 命令创建 ms

优化问题,指定为问题结构体。使用 createOptimProblem 创建 problem。更多详细信息请参阅 创建问题结构体

示例: problem = createOptimProblem('fmincon','objective',fun,'x0',x0,'lb',lb)

数据类型: struct

起点的数量,指定为正整数。MultiStart 使用与 RandomStartPointSet 对象相同的算法生成 k - 1 起点。MultiStart 也使用来自 x0 结构体中的 problem 点。

示例: 50

数据类型: double

MultiStart 的起点,指定为 CustomStartPointSet 对象、RandomStartPointSet 对象或此类对象的元胞数组。

示例: {custompts,randompts}

输出参量

全部折叠

找到最佳点,以实数数组形式返回。最佳点是目标函数值最低的点。

遇到的最低目标函数值,以实标量形式返回。对于 lsqcurvefitlsqnonlin,目标函数是平方和,也称为残差的平方范数。

退出条件摘要,以整数形式返回。

全局求解器退出标志

2至少发现一个可行局部最小值。局部求解器的一些运行并未收敛。
1至少发现一个可行局部最小值。局部求解器的所有运行均已收敛(具有正退出标志)。
0找不到局部最小值。局部求解器至少被调用一次,并且至少一个局部求解器超出了 MaxIterationsMaxFunctionEvaluations 容差。
-1一个或多个局部求解器运行被局部求解器输出或绘图函数停止。
-2找不到可行的局部最小值。
-5超过 MaxTime 限制。
-8找不到解。所有运行都有局部求解器退出标志 -2 或更低,并非所有都等于 -2
-10用户提供的函数遇到失败。

解决方案流程详情,以包含以下字段的结构体返回。

字段含义
funcCount函数计算的次数。
localSolverIncomplete带有 0 退出标志的局部求解器运行次数。
localSolverNoSolution具有负退出标志的局部求解器运行的次数。
localSolverSuccess具有正退出标志的局部求解器运行次数。
localSolverTotal局部求解器运行的总次数。
message退出消息。

不同的局部解,以 GlobalOptimSolution 对象的向量返回。这些解对应于正的局部求解器退出标志。换句话说,如果局部求解器退出标志为非正数,则相应的解不会记录在 solutions 中。要获得所有局部解,请使用 @savelocalsolutions GlobalSearch 和 MultiStart 的输出函数

版本历史记录

在 R2010a 中推出