Mixed-Integer Surrogate Optimization, Problem-Based

This example shows how to solve an optimization problem that involves integer variables. In this example, find the point x that minimizes the multirosenbrock function over integer-valued arguments ranging from –3 to 6 in 10 dimensions. The multirosenbrock function is a poorly scaled function that is difficult to optimize. Its minimum value is 0, which is attained at the point [1,1,...,1]. The code for the multirosenbrock function appears at the end of this example.

Create a 10-D row vector variable x of type integer with bounds –3 to 6. When you specify scalar bounds, the bounds apply to all variable components.

x = optimvar("x",1,10,"LowerBound",-3,"UpperBound",6,"Type","integer");

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);

Set the maximum number of function evaluations to 200.

opts = optimoptions("surrogateopt","MaxFunctionEvaluations",200);

Solve the problem.

rng(1,'twister') % For reproducibility
[sol,fval] = solve(prob,"Solver","surrogateopt","Options",opts)
Solving problem using surrogateopt. surrogateopt stopped because it exceeded the function evaluation limit set by
'options.MaxFunctionEvaluations'.
sol = struct with fields:
x: [1 1 1 1 1 1 1 1 1 1]

fval = 0

In this case, surrogateopt reaches the correct solution.

Mixed-Integer Problem

Suppose that only the first six variables are integer-valued. To reformulate the problem, create a 6-D integer variable xint and a 4-D continuous variable xcont.

xint = optimvar("xint",1,6,"LowerBound",-3,"UpperBound",6,"Type","integer");
xcont = optimvar("xcont",1,4,"LowerBound",-3,"UpperBound",6);

Convert multirosenbrock to an optimization expression using the input [xint xcont].

fun2 = fcn2optimexpr(@multirosenbrock,[xint xcont]);

Create and solve the problem.

prob2 = optimproblem("Objective",fun2);
rng(1,'twister') % For reproducibility
[sol2,fval2] = solve(prob2,"Solver","surrogateopt","Options",opts)
Solving problem using surrogateopt. surrogateopt stopped because it exceeded the function evaluation limit set by
'options.MaxFunctionEvaluations'.
sol2 = struct with fields:
xcont: [1.0508 1.1394 1.0671 1.1383]
xint: [1 1 1 1 1 1]

fval2 = 0.1310

This time the integer variables reach the correct solution, and the continuous variables are near the solution, but are not completely accurate.

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 