Using Gurobi within MATLAB’s Problem-Based Optimization#
Starting with release R2017b, the MATLAB Optimization Toolbox offers an alternative way to formulate optimization problems, coined “Problem-Based Optimization”. In this section we’ll explain how this modeling technique can be used in combination with the Gurobi solver.
The problem-based modeling approach uses an object-oriented paradigm for the components of an optimization problem; the optimization problem itself, the decision variables, and the linear constraints are represented by objects. Their creation and modification is effected through methods. The complete documentation for problem-based optimization is part of the Optimization Toolbox; we will only walk through a simple example. For this it is important that your MATLAB path contains Gurobi’s example directory, which can be set as follows:
addpath(fullfile(<path_to_Gurobi>, <architecture>, 'examples', 'matlab'));
The first step is to create an optimization problem:
prob = optimproblem('ObjectiveSense','maximize');
The variable prob
now refers to an optimization problem object,
which we have specified to be a maximization problem. Next we create
three non-negative optimization variables: x
, y
and z
:
x = optimvar('x', 'LowerBound', 0);
y = optimvar('y', 'LowerBound', 0);
z = optimvar('z', 'LowerBound', 0);
With these variables at hand, we now build linear expressions in order
to set an objective function, and to add two linear constraints to
prob
:
prob.Objective = x + 2 * y + 3 * z;
prob.Constraints.cons1 = x + y <= 1;
prob.Constraints.cons2 = y + z <= 1;
Finally we create an options object that guides prob
‘s solution
method to the linear program solver function linprog
, and call the
solve
method.
options = optimoptions('linprog');
sol = solve(prob, options);
Since the examples
directory of the Gurobi installation has been
added to the path in the very first step above, a bit of magic happens
at this stage: The directory contains a file linprog.m
, so that the
invocation of the solve
method ends up calling this latter function
instead of the built-in function linprog
of MATLAB’s Optimization
Toolbox. The following output from Gurobi will be shown on the console:
Gurobi Optimizer version 11.0.1 build v11.0.1rc0 ()
Optimize a model with 2 rows, 3 columns and 4 nonzeros
Model fingerprint: 0x3a4c68c2
Coefficient statistics:
Matrix range [1e+00, 1e+00]
Objective range [1e+00, 3e+00]
Bounds range [0e+00, 0e+00]
RHS range [1e+00, 1e+00]
Presolve removed 2 rows and 3 columns
Presolve time: 0.03s
Presolve: All rows and columns removed
Iteration Objective Primal Inf. Dual Inf. Time
0 -4.0000000e+00 0.000000e+00 0.000000e+00 0s
Solved in 0 iterations and 0.05 seconds
Optimal objective -4.000000000e+00
The example we just discussed can be found in the examples
directory
in the file opttoolbox_lp.m
. The example opttoolbox_mip1.m
shows
an analogous problem formulation with integer variables, that uses the
function intlinprog.m
, also found in the Gurobi examples directory,
as a surrogate for MATLAB’s built-in counterpart.
The modeling constructs provided by the Optimization Toolbox do not
cover all the features of Gurobi, e.g., SOS, semi-continuous variables
and general constraints to name a few. Moreover not all Gurobi
parameters have equivalent counterparts in the option objects for
linprog
and intlinprog
. In order to use such features, Gurobi’s
own Matlab API should be used.