Optimize Multidimensional Function Using surrogateopt
, Problem-Based
This example shows how to minimize a multidimensional function using surrogate optimization in the problem-based approach. The function to minimize, multirosenbrock(x)
, appears at the end of this example. The multirosenbrock
function has a single local minimum of 0
at the point [1,1,...,1]
. The function is designed to be challenging for solvers to minimize.
Note: The code for the multirosenbrock
helper function is provided at the end of this example. Make sure the code is included at the end of your script or in a file on the path.
Create a 4-D optimization variable x
. The multirosenbrock
function expects the variable to be a row vector, so specify x
as a 4-element row vector.
x = optimvar("x",1,4);
The surrogateopt
solver requires finite bounds on all problem variables. Specify lower bounds of –3 and upper bounds of 3. When you specify scalar bounds, they apply to all problem variables.
x.LowerBound = -3; x.UpperBound = 3;
To use multirosenbrock
as the objective function, convert the function to an optimization expression using fcn2optimexpr
.
fun = fcn2optimexpr(@multirosenbrock,x);
Create an optimization problem with the objective function multirosenbrock
.
prob = optimproblem("Objective",fun);
Solve the problem, specifying the surrogateopt
solver.
rng default % For reproducibility [sol,fval] = solve(prob,"Solver","surrogateopt")
Solving problem using surrogateopt.
surrogateopt stopped because it exceeded the function evaluation limit set by 'options.MaxFunctionEvaluations'.
sol = struct with fields:
x: [0.2895 0.0882 0.5829 0.3348]
fval = 0.6831
Attempt to Improve Solution
The returned solution is not good, because the objective function value is not very close to 0
. Try to improve the solution by running surrogateopt
for more evaluations. Use the previous solution as a start point.
options = optimoptions("surrogateopt","MaxFunctionEvaluations",1000); [sol2,fval2] = solve(prob,sol,"Solver","surrogateopt","Options",options)
Solving problem using surrogateopt.
surrogateopt stopped because it exceeded the function evaluation limit set by 'options.MaxFunctionEvaluations'.
sol2 = struct with fields:
x: [1.0410 1.0844 0.8870 0.7865]
fval2 = 0.0145
This time, the solver reaches a good solution.
Helper Function
This code creates the multirosenbrock
helper function.
function F = multirosenbrock(x) % This function is a multidimensional generalization of Rosenbrock's % function. It operates in a vectorized manner, assuming that x is a matrix % whose rows are the individuals. % Copyright 2014 by The MathWorks, Inc. N = size(x,2); % assumes x is a row vector or 2-D matrix if mod(N,2) % if N is odd error('Input rows must have an even number of elements') end odds = 1:2:N-1; evens = 2:2:N; F = zeros(size(x)); F(:,odds) = 1-x(:,odds); F(:,evens) = 10*(x(:,evens)-x(:,odds).^2); F = sum(F.^2,2); end
See Also
surrogateopt
| fcn2optimexpr
| solve