Documentation Center

  • Trial Software
  • Product Updates

intlinprog

Mixed-integer linear programming (MILP)

Syntax

  • x = intlinprog(f,intcon,A,b) example
  • x = intlinprog(f,intcon,A,b,Aeq,beq)
  • x = intlinprog(f,intcon,A,b,Aeq,beq,lb,ub) example
  • x = intlinprog(f,intcon,A,b,Aeq,beq,lb,ub,options) example
  • x = intlinprog(problem) example
  • [x,fval,exitflag,output] = intlinprog(___) example

Description

Finds the minimum of a problem specified by

f, x, intcon, b, beq, lb, and ub are vectors, and A and Aeq are matrices.

You can specify f, intcon, lb, and ub as vectors or arrays. See Matrix Arguments.

example

x = intlinprog(f,intcon,A,b) solves min f'*x such that the components of x in intcon are integers, and A*x ≤ b.

x = intlinprog(f,intcon,A,b,Aeq,beq) solves the problem above while additionally satisfying the equality constraints Aeq*x = beq. Set A = [] and b = [] if no inequalities exist.

example

x = intlinprog(f,intcon,A,b,Aeq,beq,lb,ub) defines a set of lower and upper bounds on the design variables, x, so that the solution is always in the range lb ≤ x ≤ ub. Set Aeq = [] and beq = [] if no equalities exist.

example

x = intlinprog(f,intcon,A,b,Aeq,beq,lb,ub,options) minimizes using the optimization options specified in options. Use optimoptions to set these options. Set lb = [] and ub = [] if no bounds exist.

example

x = intlinprog(problem) uses a problem structure to encapsulate all solver inputs.

example

[x,fval,exitflag,output] = intlinprog(___), for any input arguments described above, returns fval = f'*x, a value exitflag describing the exit condition, and a structure output containing information about the optimization process.

Examples

expand all

Solve an MILP with Linear Inequalities

Solve the problem

Write the objective function vector and vector of integer variables.

f = [8;1];
intcon = 2;

Convert all inequalities into the form A*x <= b by multiplying "greater than" inequalities by -1.

A = [-1,-2;
    -4,-1;
    2,1];
b = [14;-33;20];

Call intlinprog.

x = intlinprog(f,intcon,A,b)
LP:                Optimal objective value is 59.000000.                                            


Optimal solution found.

Intlinprog stopped at the root node because the objective value is within a gap tolerance of the optimal value;
options.TolGapAbs = 0 (the default value). The intcon variables are integer within tolerance,
options.TolInteger = 1e-05 (the default value).


x =

    6.5000
    7.0000

Solve an MILP with All Types of Constraints

Solve the problem

Write the objective function vector and vector of integer variables.

f = [-3;-2;-1];
intcon = 3;

Write the linear inequality constraints.

A = [1,1,1];
b = 7;

Write the linear equality constraints.

Aeq = [4,2,1];
beq = 12;

Write the bound constraints.

lb = zeros(3,1);
ub = [Inf;Inf;1]; % Enforces x(3) is binary

Call intlinprog.

x = intlinprog(f,intcon,A,b,Aeq,beq,lb,ub)
LP:                Optimal objective value is -12.000000.                                           


Optimal solution found.

Intlinprog stopped at the root node because the objective value is within a gap tolerance of the optimal value;
options.TolGapAbs = 0 (the default value). The intcon variables are integer within tolerance,
options.TolInteger = 1e-05 (the default value).


x =

         0
    5.5000
    1.0000

Solve an MILP with Nondefault Options

Solve the problem

without showing iterative display.

Specify the solver inputs.

f = [-3;-2;-1];
intcon = 3;
A = [1,1,1];
b = 7;
Aeq = [4,2,1];
beq = 12;
lb = zeros(3,1);
ub = [Inf;Inf;1]; % enforces x(3) is binary

Specify no display.

options = optimoptions('intlinprog','Display','off');

Run the solver.

x = intlinprog(f,intcon,A,b,Aeq,beq,lb,ub,options)
x =

         0
    5.5000
    1.0000

Use a Problem Structure

Solve the problem

using iterative display. Use a problem structure as the intlinprog input.

Specify the solver inputs.

f = [-3;-2;-1];
intcon = 3;
A = [1,1,1];
b = 7;
Aeq = [4,2,1];
beq = 12;
lb = zeros(3,1);
ub = [Inf;Inf;1]; % enforces x(3) is binary
options = optimoptions('intlinprog','Display','off');

Insert the inputs into a problem structure. Include the solver name.

problem = struct('f',f,'intcon',intcon,...
    'Aineq',A,'bineq',b,'Aeq',Aeq,'beq',beq,...
    'lb',lb,'ub',ub,'options',options,...
    'solver','intlinprog');

Run the solver.

x = intlinprog(problem)
x =

         0
    5.5000
    1.0000

Examine the MILP Solution and Process

Call intlinprog with more outputs to see solution details and process.

The goal is to solve the problem

Specify the solver inputs.

f = [-3;-2;-1];
intcon = 3;
A = [1,1,1];
b = 7;
Aeq = [4,2,1];
beq = 12;
lb = zeros(3,1);
ub = [Inf;Inf;1]; % enforces x(3) is binary

Call intlinprog with all outputs.

[x,fval,exitflag,output] = intlinprog(f,intcon,A,b,Aeq,beq,lb,ub)
LP:                Optimal objective value is -12.000000.                                           


Optimal solution found.

Intlinprog stopped at the root node because the objective value is within a gap tolerance of the optimal value;
options.TolGapAbs = 0 (the default value). The intcon variables are integer within tolerance,
options.TolInteger = 1e-05 (the default value).


x =

         0
    5.5000
    1.0000


fval =

  -12.0000


exitflag =

     1


output = 

        relativegap: 0
        absolutegap: 0
      numfeaspoints: 1
           numnodes: 0
    constrviolation: 1.7764e-15
            message: 'Optimal solution found.

Intlinprog stopped at the root node because the objective v...'

The output structure shows numnodes is 0. This means intlinprog solved the problem before branching. This is one indication that the result is reliable. Also, the absolutegap and relativegap fields are 0. This is another indication that the result is reliable.

Input Arguments

expand all

f — Coefficient vectorreal vector

Coefficient vector, specified as a vector of doubles representing the objective function, f'*x. The notation assumes that f is a column vector, but you are free to use a row vector.

f can also be an array. Internally, intlinprog converts an array f to the vector f(:).

If you specify f = [], intlinprog tries to find a feasible point without trying to minimize an objective function.

Example: f = [4;2;-1.7];

Data Types: double

intcon — Vector of integer constraintsvector of integers

Vector of integer constraints, specified as a vector of positive integers. The values in intcon indicate the components of the decision variable x that are integer-valued. intcon has values from 1 through numel(f).

intcon can also be an array. Internally, intlinprog converts an array intcon to the vector intcon(:).

Example: intcon = [1,2,7] means x(1), x(2), and x(7) take only integer values.

Data Types: double

A — Linear inequality constraint matrixreal matrix

Linear inequality constraint matrix, specified as a matrix of doubles. A represents the linear coefficients in the constraints A*x  b. A has size M-by-N, where M is the number of constraints and N = numel(f). To save memory, A can be sparse.

Example: A = [4,3;2,0;4,-1]; means three linear inequalities (three rows) for two decision variables (two columns).

Data Types: double

b — Linear inequality constraint vectorreal vector

Linear inequality constraint vector, specified as a vector of doubles. b represents the constant vector in the constraints A*x  b. b has length M, where A is M-by-N.

Example: [4,0]

Data Types: double

Aeq — Linear equality constraint matrix[] (default) | real matrix

Linear equality constraint matrix, specified as a matrix of doubles. Aeq represents the linear coefficients in the constraints Aeq*x = beq. Aeq has size Meq-by-N, where Meq is the number of constraints and N = numel(f). To save memory, Aeq can be sparse.

Example: A = [4,3;2,0;4,-1]; means three linear inequalities (three rows) for two decision variables (two columns).

Data Types: double

beq — Linear equality constraint vector[] (default) | real vector

Linear equality constraint vector, specified as a vector of doubles. beq represents the constant vector in the constraints Aeq*x = beq. beq has length Meq, where Aeq is Meq-by-N.

Example: [4,0]

Data Types: double

lb — Lower bounds[] (default) | real vector or array

Lower bounds, specified as a vector or array of doubles. lb represents the lower bounds elementwise in lb  x  ub.

Internally, intlinprog converts an array lb to the vector lb(:).

Example: lb = [0;-Inf;4] means x(1) ≥ 0, x(3) ≥ 4.

Data Types: double

ub — Upper bounds[] (default) | real vector or array

Upper bounds, specified as a vector or array of doubles. ub represents the upper bounds elementwise in lb  x  ub.

Internally, intlinprog converts an array ub to the vector ub(:).

Example: ub = [Inf;4;10] means x(2) ≤ 4, x(3) ≤ 10.

Data Types: double

options — Options for intlinprogoptions created using optimoptions

Options for intlinprog, specified as the output of optimoptions.

OptionDescriptionDefault
BranchingRuleRule for choosing the component for branching:
  • 'maxpscost' — The fractional component with maximum pseudocost. See Branch and Bound.

  • 'mostfractional' — The component whose fractional part is closest to 1/2.

  • 'maxfun' — The fractional component with maximal corresponding component in the absolute value of objective vector f.

'maxpscost'
CutGenerationLevel of cut generation (see Cut Generation):
  • 'none' — No cuts. Makes CutGenerationMaxIter irrelevant.

  • 'basic' — Normal cut generation.

  • 'intermediate' — Use more cut types.

  • 'advanced' — Use most cut types.

'basic'
CutGenMaxIterNumber of passes through all cut generation methods before entering the branch-and-bound phase, an integer from 1 through 50. Disable cut generation by setting the CutGeneration option to 'none'.10
DisplayLevel of display (see Iterative Display):
  • 'off' or 'none' — No iterative display

  • 'final' — Show final values only

  • 'iter' — Show iterative display

'iter'
HeuristicsAlgorithm for searching for feasible points (see Heuristics for Finding Feasible Solutions):
  • 'none'

  • 'rss'

  • 'round'

  • 'rins'

'rss'
HeuristicsMaxNodesStrictly positive integer that bounds the number of nodes intlinprog can explore in its branch-and-bound search for feasible points. See Heuristics for Finding Feasible Solutions.50
IPPreprocessTypes of integer preprocessing (see Mixed-Integer Program Preprocessing):
  • 'none' — Use very few integer preprocessing steps.

  • 'basic' — Use a moderate number of integer preprocessing steps.

  • 'advanced' — Use all available integer preprocessing steps.

'basic'
LPMaxIterStrictly positive integer, the maximum number of simplex algorithm iterations per node during the branch-and-bound process.3e4
LPPreprocessType of preprocessing for the solution to the relaxed linear program (see Linear Program Preprocessing):
  • 'none' — No preprocessing.

  • 'basic' — Use preprocessing.

'basic'
MaxNodesStrictly positive integer that is the maximum number of nodes intlinprog explores in its branch-and-bound process.1e7
MaxNumFeasPointsStrictly positive integer. intlinprog stops if it finds MaxNumFeasPoints integer feasible points.Inf
MaxTimePositive real that is the maximum time in seconds that intlinprog runs.7200
NodeSelectionChoose the node to explore next.
  • 'simplebestproj' — Best projection. See Branch and Bound.

  • 'minobj' — Explore the node with the minimum objective function.

  • 'mininfeas' — Explore the node with the minimal sum of integer infeasibilities. See Branch and Bound.

'simplebestproj'
ObjectiveCutoffReal greater than -Inf. During the branch-and-bound calculation, intlinprog discards any node where the linear programming solution has an objective value exceeding ObjectiveCutoff.Inf
RelObjThresholdNonnegative real. intlinprog changes the current feasible solution only when it locates another with an objective function value that is at least RelObjThreshold lower: (fold – fnew)/(1 + fold) > RelObjThreshold.1e-4
RootLPAlgorithmAlgorithm for solving linear programs:
  • 'dual-simplex' — Dual simplex algorithm

  • 'primal-simplex' — Primal simplex algorithm

'dual-simplex'
RootLPMaxIterNonnegative integer that is the maximum number of simplex algorithm iterations to solve the initial linear programming problem.3e4
TolConReal from 1e-9 through 1e-3 that is the maximum discrepancy that linear constraints can have and still be considered satisfied. TolCon is not a stopping criterion.1e-4
TolFunLPNonnegative real where reduced costs must exceed TolFunLP for a variable to be taken into the basis.1e-7
TolGapAbsNonnegative real. intlinprog stops if the difference between the internally calculated upper (U) and lower (L) bounds on the objective function is less than or equal to TolGapAbs:

U – L <= TolGapAbs.

0
TolGapRelReal from 0 through 1. intlinprog stops if the relative difference between the internally calculated upper (U) and lower (L) bounds on the objective function is less than or equal to TolGapRel:

(U – L) / (abs(U) + 1) <= TolGapRel.

1e-4
TolIntegerReal from 1e-6 through 1e-3, where the maximum deviation from integer that a component of the solution x can have and still be considered an integer. TolInteger is not a stopping criterion.1e-5

Example: options = optimoptions('intlinprog','MaxTime',120)

problem — Structure encapsulating inputs and optionsstructure

Structure encapsulating the inputs and options, specified with the following fields.

fVector representing objective f'*x (required)
intconVector indicating variables that take integer values (required)
AineqMatrix in linear inequality constraints Aineq*x  bineq

bineq

Vector in linear inequality constraints Aineq*x  bineq

Aeq

Matrix in linear equality constraints Aeq*x = beq

beq

Vector in linear equality constraints Aeq*x = beq
lbVector of lower bounds
ubVector of upper bounds
solver'intlinprog' (required)

options

Options created using optimoptions (required)

You must specify at least these fields in the problem structure. Other fields are optional:

  • f

  • intcon

  • solver

  • options

Example: problem.f = [1,2,3];
problem.intcon = [2,3];
problem.options = optimoptions('intlinprog');
problem.Aineq = [-3,-2,-1];
problem.bineq = -20;
problem.lb = [-6.1,-1.2,7.3];
problem.solver = 'intlinprog';

Data Types: struct

Output Arguments

expand all

x — Solutionreal vector

Solution, returned as a vector that minimizes f'*x subject to all bounds, integer constraints, and linear constraints.

When a problem is infeasible or unbounded, x is [].

fval — Objective valuereal scalar

Objective value, returned as the scalar value f'*x at the solution x.

When a problem is infeasible or unbounded, fval is [].

exitflag — Algorithm stopping conditioninteger

Algorithm stopping condition, returned as an integer identifying the reason the algorithm stopped. The following lists the values of exitflag and the corresponding reasons intlinprog stopped.

2

intlinprog stopped prematurely. Integer feasible point found.

1

intlinprog converged to the solution x.

0

intlinprog stopped prematurely. No integer feasible point found.

-2

No feasible point found.

-3

Root LP problem is unbounded.

The exit message can give more detailed information on the reason intlinprog stopped, such as exceeding a tolerance.

output — Solution process summarystructure

Solution process summary, returned as a structure containing information about the optimization process.

relativegap

Relative difference between upper (U) and lower (L) bounds of the objective function that intlinprog calculates in its branch-and-bound algorithm.

relativegap = (U - L) / (abs(U) + 1)

If intcon = [], relativegap = [].

absolutegap

Difference between upper and lower bounds of the objective function that intlinprog calculates in its branch-and-bound algorithm.

If intcon = [], absolutegap = [].

numfeaspoints

Number of integer feasible points found.

If intcon = [], numfeaspoints = []. Also, if the initial relaxed problem is infeasible, numfeaspoints = [].

numnodes

Number of nodes in branch-and-bound algorithm. If the solution was found during preprocessing or during the initial cuts, numnodes = 0.

If intcon = [], numnodes = [].

constrviolation

Constraint violation that is positive for violated constraints.

constrviolation = max([0; norm(Aeq*x-beq, inf); (lb-x); (x-ub); (Ai*x-bi)])

message

Exit message.

Limitations

  • Often, some supposedly integer-valued components of the solution x(intCon) are not precisely integers. intlinprog deems as integers all solution values within the TolInteger tolerance of an integer.

    To round all supposed integers to be exactly integers, use the round function.

    x(intcon) = round(x(intcon));

      Caution   Rounding solutions can cause the solution to become infeasible. Check feasibility after rounding:

      max(A*x - b) % See if entries are not too positive, so have small infeasibility
      max(abs(Aeq*x - beq)) % See if entries are near enough to zero
      max(x - ub) % Positive entries are violated bounds
      max(lb - x) % Positive entries are violated bounds
  • intlinprog does not enforce that solution components be integer-valued when their absolute values exceed 2.1e9. When your solution has such components, intlinprog warns you. If you receive this warning, check the solution to see whether supposedly integer-valued components of the solution are close to integers.

  • intlinprog does not allow components of the problem, such as coefficients in f, A, or ub, to exceed 1e25 in absolute value. If you try to run intlinprog with such a problem, intlinprog issues an error.

  • Currently, you cannot run intlinprog in the Optimization app.

More About

expand all

MILP

Mixed-integer linear programming definition.

MILP means find the minimum of a problem specified by

f, x, intcon, b, beq, lb, and ub are vectors, and A and Aeq are matrices.

You can specify f, intcon, lb, and ub as vectors or arrays. See Matrix Arguments.

Tips

  • To specify binary variables, set the variables to be integers in intcon, and give them lower bounds of 0 and upper bounds of 1.

  • Save memory by specifying sparse linear constraint matrices A and Aeq. However, you cannot use sparse matrices for b and beq.

  • To provide logical indices for integer components, meaning a binary vector with 1 indicating an integer, convert to intcon form using find. For example,

    logicalindices = [1,0,0,1,1,0,0];
    intcon = find(logicalindices)
    intcon =
    
         1     4     5

See Also

|

Was this topic helpful?