Loading [MathJax]/extensions/tex2jax.js
scipy 1.10.1 Pypi GitHub Homepage
Other Docs

NotesParametersReturns
milp(c, *, integrality=None, bounds=None, constraints=None, options=None)

Solves problems of the following form:

\min_x \ & c^T x \\ \mbox{such that} \ & b_l \leq A x \leq b_u,\\ & l \leq x \leq u, \\ & x_i \in \mathbb{Z}, i \in X_i

where x is a vector of decision variables; c, b_l, b_u, l, and u are vectors; A is a matrix, and X_i is the set of indices of decision variables that must be integral. (In this context, a variable that can assume only integer values is said to be "integral"; it has an "integrality" constraint.)

Alternatively, that's:

minimize

c @ x

such that

b_l <= A @ x <= b_u
l <= x <= u
Specified elements of x must be integers

By default, l = 0 and u = np.inf unless specified with bounds.

Notes

milp is a wrapper of the HiGHS linear optimization software . The algorithm is deterministic, and it typically finds the global optimum of moderately challenging mixed-integer linear programs (when it exists).

Parameters

c : 1D array_like

The coefficients of the linear objective function to be minimized. c is converted to a double precision array before the problem is solved.

integrality : 1D array_like, optional

Indicates the type of integrality constraint on each decision variable.

bounds : scipy.optimize.Bounds, optional

Bounds on the decision variables. Lower and upper bounds are converted to double precision arrays before the problem is solved. The keep_feasible parameter of the Bounds object is ignored. If not specified, all decision variables are constrained to be non-negative.

constraints : sequence of scipy.optimize.LinearConstraint, optional

Linear constraints of the optimization problem. Arguments may be one of the following:

  1. A single LinearConstraint object
  2. A single tuple that can be converted to a LinearConstraint object as LinearConstraint(*constraints)
  3. A sequence composed entirely of objects of type 1. and 2.

Before the problem is solved, all values are converted to double precision, and the matrices of constraint coefficients are converted to instances of scipy.sparse.csc_array. The keep_feasible parameter of LinearConstraint objects is ignored.

options : dict, optional

A dictionary of solver options. The following keys are recognized.

disp

disp

node_limit

node_limit

presolve

presolve

time_limit

time_limit

mip_rel_gap

mip_rel_gap

Returns

res : OptimizeResult

An instance of scipy.optimize.OptimizeResult. The object is guaranteed to have the following attributes.

Mixed-integer linear programming

Examples

Consider the problem at https://en.wikipedia.org/wiki/Integer_programming#Example, which is expressed as a maximization problem of two variables. Since `milp` requires that the problem be expressed as a minimization problem, the objective function coefficients on the decision variables are:
import numpy as np
c = -np.array([0, 1])
Note the negative sign: we maximize the original objective function by minimizing the negative of the objective function.
We collect the coefficients of the constraints into arrays like:
A = np.array([[-1, 1], [3, 2], [2, 3]])
b_u = np.array([1, 12, 12])
b_l = np.full_like(b_u, -np.inf)
Because there is no lower limit on these constraints, we have defined a variable ``b_l`` full of values representing negative infinity. This may be unfamiliar to users of `scipy.optimize.linprog`, which only accepts "less than" (or "upper bound") inequality constraints of the form ``A_ub @ x <= b_u``. By accepting both ``b_l`` and ``b_u`` of constraints ``b_l <= A_ub @ x <= b_u``, `milp` makes it easy to specify "greater than" inequality constraints, "less than" inequality constraints, and equality constraints concisely.
These arrays are collected into a single `LinearConstraint` object like:
from scipy.optimize import LinearConstraint
constraints = LinearConstraint(A, b_l, b_u)
The non-negativity bounds on the decision variables are enforced by default, so we do not need to provide an argument for `bounds`.
Finally, the problem states that both decision variables must be integers:
integrality = np.ones_like(c)
We solve the problem like:
from scipy.optimize import milp
res = milp(c=c, constraints=constraints, integrality=integrality)
res.x
Note that had we solved the relaxed problem (without integrality constraints):
res = milp(c=c, constraints=constraints)  # OR:
# from scipy.optimize import linprog; res = linprog(c, A, b_u)
res.x
we would not have obtained the correct solution by rounding to the nearest integers.
Other examples are given :ref:`in the tutorial <tutorial-optimize_milp>`.
See :

Local connectivity graph

Hover to see nodes names; edges to Self not shown, Caped at 50 nodes.

Using a canvas is more power efficient and can get hundred of nodes ; but does not allow hyperlinks; , arrows or text (beyond on hover)

SVG is more flexible but power hungry; and does not scale well to 50 + nodes.

scipy.sparse._arrays:csc_array_arrays:csc_array

All aboves nodes referred to, (or are referred from) current nodes; Edges from Self to other have been omitted (or all nodes would be connected to the central node "self" which is not useful). Nodes are colored by the library they belong to, and scaled with the number of references pointing them


GitHub : /scipy/optimize/_milp.py#147
type: <class 'function'>
Commit: