6.9 Integer Optimization¶
An optimization problem where one or more of the variables are constrained to integer values is called a (mixed) integer optimization problem. MOSEK supports integer variables in combination with linear, quadratic and quadratically constrtained and conic problems (except semidefinite). See the previous tutorials for an introduction to how to model these types of problems.
6.9.1 Example MILO1¶
We use the example
to demonstrate how to set up and solve a problem with integer variables. It has the structure of a linear optimization problem (see Sec. 6.1 (Linear Optimization)) except for integrality constraints on the variables. Therefore, only the specification of the integer constraints requires something new compared to the linear optimization problem discussed previously.
The complete source for the example is listed in Listing 6.15.
Please note that compared to a linear optimization problem with no integer-constrained variables:
The
prob.ints.sub
field is used to specify the indexes of the variables that are integer-constrained.The optimal integer solution is returned in the
res.sol.int
MATLAB structure.
MOSEK also provides a wrapper for the intlinprog
function found in the MATLAB optimization toolbox. This function solves linear problems wth integer variables; see the reference section for details.
6.9.2 Specifying an initial solution¶
It is a common strategy to provide a starting feasible point (if one is known in advance) to the mixed-integer solver. This can in many cases reduce solution time.
It is not necessary to specify the whole solution. MOSEK will attempt to use it to speed up the computation. MOSEK will first try to construct a feasible solution by fixing integer variables to the values provided by the user (rounding if necessary) and optimizing over the continuous variables. The outcome of this process can be inspected via information items "MSK_IINF_MIO_CONSTRUCT_SOLUTION"
and "MSK_DINF_MIO_CONSTRUCT_SOLUTION_OBJ"
, and via the Construct solution objective
entry in the log. We concentrate on a simple example below.
Solution values can be set using the appropriate fields in the problem structure.
here
to download.¶% Specify start guess for the integer variables.
prob.sol.int.xx = [1 1 0 nan]';
The log output from the optimizer will in this case indicate that the inputted values were used to construct an initial feasible solution:
Construct solution objective : 1.950000000000e+01
The same information can be obtained from the API:
6.9.3 Example MICO1¶
Integer variables can also be used arbitrarily in conic problems (except semidefinite). We refer to the previous tutorials for how to set up a conic optimization problem. Here we present sample code that sets up a simple optimization problem:
The canonical conic formulation of (6.23) suitable for Optimization Toolbox for MATLAB is
[rcode, res] = mosekopt('symbcon echo(0)');
symbcon = res.symbcon;
clear prob
% The full variable is [t; x; y]
prob.c = [1 0 0];
prob.a = sparse(0,3); % No constraints
% Conic part of the problem
prob.f = sparse([ eye(3);
0 1 0;
0 0 0;
0 0 1 ]);
prob.g = [0 0 0 -3.8 1 0]';
prob.cones = [symbcon.MSK_CT_QUAD 3 symbcon.MSK_CT_PEXP 3];
% Specify indexes of variables that are integers
prob.ints.sub = [2 3];
% It is as always possible (but not required) to input an initial solution
% to start the mixed-integer solver.
prob.sol.int.xx = [0, 9, -1];
% Optimize the problem.
[r,res] = mosekopt('minimize',prob);
% The integer solution (x,y)
res.sol.int.xx(2:3)
Note that the conic constraints are described using the format \(Fx+g\in\K\), that is as affine conic constraints. See Sec. 6.7 (Affine conic constraints (new)) for details.
Error and solution status handling were omitted for readability.