指定 MultiStart
的起点,基于问题
当使用基于问题的方法中的 MultiStart
解决问题时,您可以使用以下一种或两种技术来指定起点:
使用
OptimizationValues
函数创建optimvalues
对象的向量。将此向量作为x0
参量传递给solve
。调用
MinNumStartPoints
时设置solve
名称值参量。如果MinNumStartPoints
超过了x0
中的点数,那么solve
会在问题边界内随机创建额外的点。
初始点向量
对于此示例,将初始点向量创建为变量 x
的网格,该变量由从 -10 到 10 的整数值组成,并为变量 y
创建初始点向量,该变量由从 –5/2
到 5/2
的半整数值组成。optimvalues
函数需要一个问题,因此创建一个目标函数 peaks(x,y)
的优化问题。
您必须指定 optimvalues
的点,以便点数的维度(索引)是最后一个。例如,要给出标量 t
和 n
点的多个值,请指定
(这是 1×n
,并且 n
是最后一个索引。)
要给出长度为 2 的向量变量 w
的多个值,请指定
(这是 2×n
,并且 n
是最后一个索引。)
此规则甚至对于行向量也适用。换句话说,您可以指定多个行向量,就好像每个行向量都是一个列向量一样。
要给出 2×3 矩阵 A
的多个值,请指定
(这是 2×3×n
,并且 n
是最后一个索引。)
在本例中,确保将标量变量 x
和 y
的多个值指定为行向量,如标量 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 个伪随机初始点运行。解与之前一样。
另请参阅
MultiStart
| solve
| optimvalues