主要内容

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

指定 MultiStart 的起点,基于问题

当使用基于问题的方法中的 MultiStart 解决问题时,您可以使用以下一种或两种技术来指定起点:

  • 使用 OptimizationValues 函数创建 optimvalues 对象的向量。将此向量作为 x0 参量传递给 solve

  • 调用 MinNumStartPoints 时设置 solve 名称值参量。如果 MinNumStartPoints 超过了 x0 中的点数,那么 solve 会在问题边界内随机创建额外的点。

初始点向量

对于此示例,将初始点向量创建为变量 x 的网格,该变量由从 -10 到 10 的整数值组成,并为变量 y 创建初始点向量,该变量由从 –5/25/2 的半整数值组成。optimvalues 函数需要一个问题,因此创建一个目标函数 peaks(x,y) 的优化问题。

您必须指定 optimvalues 的点,以便点数的维度(索引)是最后一个。例如,要给出标量 tn 点的多个值,请指定

[t(1)t(2)...t(n)](这是 1×n,并且 n 是最后一个索引。)

要给出长度为 2 的向量变量 w 的多个值,请指定

[w(1,1)w(1,2)w(1,3)w(1,n)w(2,1)w(2,2)w(2,3)w(2,n)](这是 2×n,并且 n 是最后一个索引。)

此规则甚至对于行向量也适用。换句话说,您可以指定多个行向量,就好像每个行向量都是一个列向量一样。

要给出 2×3 矩阵 A 的多个值,请指定

[A(1,1,1)A(1,2,1)A(1,3,1)A(2,1,1)A(2,2,1)A(2,3,1)][A(1,1,2)A(1,2,2)A(1,3,2)A(2,1,2)A(2,2,2)A(2,3,2)][A(1,1,n)A(1,2,n)A(1,3,n)A(2,1,n)A(2,2,n)A(2,3,n)](这是 2×3×n,并且 n 是最后一个索引。)

在本例中,确保将标量变量 xy 的多个值指定为行向量,如标量 t 示例中所示。

x = optimvar("x",LowerBound=-10,UpperBound=10);
y = optimvar("y",LowerBound=-5/2,UpperBound=5/2);
prob = optimproblem(Objective=peaks(x,y));
xval = -10:10;
yval = (-5:5)/2;
[x0x,x0y] = meshgrid(xval,yval);
% Convert x0x and x0y to row vectors for optimvalues
x0 = optimvalues(prob,x=x0x(:)',y=x0y(:)');

x0 中的所有点开始解决最小化问题。

ms = MultiStart;
[sol,fval,eflag,output] = solve(prob,x0,ms)
Solving problem using MultiStart.

MultiStart completed the runs from all start points. 

All 231 local solver runs converged with a positive local solver exitflag.
sol = struct with fields:
    x: 0.2283
    y: -1.6255

fval = 
-6.5511
eflag = 
    LocalMinimumFoundAllConverged

output = struct with fields:
                funcCount: 2230
         localSolverTotal: 231
       localSolverSuccess: 231
    localSolverIncomplete: 0
    localSolverNoSolution: 0
                  message: 'MultiStart completed the runs from all start points. ↵↵All 231 local solver runs converged with a positive local solver exitflag.'
                    local: [1×1 struct]
      objectiveDerivative: "reverse-AD"
     constraintDerivative: "closed-form"
             globalSolver: 'MultiStart'
                   solver: 'fmincon'

随机起点

再次解决问题,这次使用来自 25 个随机初始点的 MultiStart。将 solve 的初始点设置为 [–1,2]

init.x = -1;
init.y = 2;
rng default % For reproducibility
[sol2,fval2,eflag2,output2] = solve(prob,init,ms,MinNumStartPoints=25)
Solving problem using MultiStart.

MultiStart completed the runs from all start points. 

All 25 local solver runs converged with a positive local solver exitflag.
sol2 = struct with fields:
    x: 0.2283
    y: -1.6255

fval2 = 
-6.5511
eflag2 = 
    LocalMinimumFoundAllConverged

output2 = struct with fields:
                funcCount: 161
         localSolverTotal: 25
       localSolverSuccess: 25
    localSolverIncomplete: 0
    localSolverNoSolution: 0
                  message: 'MultiStart completed the runs from all start points. ↵↵All 25 local solver runs converged with a positive local solver exitflag.'
                    local: [1×1 struct]
      objectiveDerivative: "reverse-AD"
     constraintDerivative: "closed-form"
             globalSolver: 'MultiStart'
                   solver: 'fmincon'

这次,MultiStart 从 25 个伪随机初始点运行。解与之前一样。

另请参阅

| |

主题