Tutorial On CPLEX Linear Programming: Combinatorial Problem Solving (CPS)
Tutorial On CPLEX Linear Programming: Combinatorial Problem Solving (CPS)
Linear Programming
Combinatorial Problem Solving (CPS)
Enric Rodrı́guez-Carbonell
June 6, 2019
LP with CPLEX
■ Among other things, CPLEX allows one to deal with:
min cT x min cT x
A1 x ≤ b1 A1 x ≤ b1
A2 x = b2 A2 x = b2
A3 x ≥ b3 A3 x ≥ b3
x ∈ Rn ∀i ∈ I : xi ∈ Z
∀i 6∈ I : xi ∈ R
2 / 31
CPLEX Toolkit
■ CPLEX allows one to work in several ways. CPLEX is...
■ Java
■ C
■ C++ (Concert Technology)
■ ...
3 / 31
Concert Technology
■ Two kinds of objects:
4 / 31
Creating the Environment: IloEnv
■ The class IloEnv constructs a CPLEX environment.
■ The environment is the first object created in an application.
■ To create an environment named env, you do this:
IloEnv env ;
5 / 31
Creating a Model: IloModel
■ After creating the environment, a Concert application is ready to create
one or more optimization models.
■ Objects of class IloModel define a complete model that can be later
passed to an IloCplex object.
■ To construct a modeling object named model, within an existing
environment named env, call:
IloModel model ( env );
6 / 31
Creating a Model: IloModel
■ After an IloModel object has been constructed, it can be populated with
objects of classes:
7 / 31
Creating a Model: IloModel
■ Modeling variables are constructed as objects of class IloNumVar, e.g.:
IloNumVar x ( env , 0 , 40 , ILOFLOAT );
8 / 31
Creating a Model: IloModel
■ After all the modeling variables have been constructed,
they can be used to build expressions,
which are used to define objects of classes IloObjective, IloRange.
■ To create obj of type IloObjective representing an objective function
(and direction of optimization):
IloObjective obj = IloMinimize ( env , x +2* y );
9 / 31
Creating a Model: IloModel
■ Actually in
model . add ( - x + 2* y + z <= 20);
10 / 31
Solving the Model: IloCplex
■ The class IloCplex solves a model.
■ After the optimization problem has been stored in an IloModel object
(say, model), it is time to create an IloCplex object (say, cplex) for
solving the problem:
IloCplex cplex ( model );
11 / 31
Solving the Model: IloCplex
■ More precise information about the outcome of the last call to the
method solve can be obtained by calling:
cplex . getStatus ();
12 / 31
Querying Results
■ Query methods access information about the solution.
■ Numbers in solution, etc. are of type IloNum (= double)
13 / 31
Querying Results
■ To get the values of the slacks of an array of constraints:
IloRangeArray c ( env );
...
IloNumArray v ( env );
cplex . getSlacks (v , c );
14 / 31
Querying Results
■ To get values of reduced costs of an array of variables:
IloNumVarArray x ( env );
...
IloNumArray v ( env );
cplex . getReducedCosts (v , x );
15 / 31
Querying Results
■ Output operator << is defined for type IloAlgorithm::Status returned
by getStatus, as well as for IloNum, IloNumVar, ...
<< is also defined for any array of elements
if the output operator is defined for the elements.
■ Default names are of the form IloNumVar(n)[ℓ..u] for variables, and
similarly for constraints, e.g.,
IloNumVar (1)[0..9] + IloNumVar (3)[0.. inf ] <= 20
16 / 31
Writing/Reading Models
■ CPLEX supports reading models from files and
writing models to files in several languages (e.g., LP format, MPS format)
■ To write the model to a file (say, model.lp):
cplex . exportModel ( " model . lp " );
■ IloCplex decides which file format to write based on the extension of the
file name (e.g., .lp is for LP format)
■ This may be useful, for example, for debugging
17 / 31
Languages for Linear Programs
■ MPS
◆ Very old format (≈ age of punched cards!) by IBM
◆ Has become industry standard over the years
◆ Column-oriented
◆ Not really human-readable nor comfortable for writing
◆ All LP solvers support this language
■ LP
◆ CPLEX specific file format
◆ Row-oriented
◆ Very readable, close to mathematical formulation
◆ Supported by CPLEX, GUROBI, GLPK, LP SOLVE, ..
(which can translate from one format to the other!)
18 / 31
Example: Product Mix Problem
■ A company can produce 6 different products P1 , . . . , P6
■ Production requires labour, energy and machines, which are all limited
■ The company wants to maximize revenue
■ The next table describes the requirements of producing one unit of each
product, the corresponding revenue and the availability of resources:
P1 P2 P3 P4 P5 P6 Limit
Revenue 5 6 7 5 6 7
Machine 2 3 2 1 1 3 1050
Labour 2 1 3 1 3 2 1050
Energy 1 2 1 4 1 2 1080
19 / 31
Example: Product Mix Problem
MODEL:
xi = quantity of product Pi to be produced.
20 / 31
LP Format
\ Product-mix problem (LP format)
max
revenue: 5 x_1 + 6 x_2 + 7 x_3 + 5 x_4 + 6 x_5 + 7 x_6
subject to
end
21 / 31
MPS Format
* Product-mix problem (Fixed MPS format)
*
* Column indices
*00000000111111111122222222223333333333444444444455555555556666666666
*23456789012345678901234567890123456789012345678901234567890123456789
*
* mrevenue stands for -revenue
*
NAME PRODMIX
ROWS
N mrevenue
L machine
L labour
L energy
COLUMNS
x_1 mrevenue -5 machine 2
x_1 labour 2 energy 1
x_2 mrevenue -6 machine 3
x_2 labour 1 energy 2
x_3 mrevenue -7 machine 2
x_3 labour 3 energy 1
x_4 mrevenue -5 machine 1
x_4 labour 1 energy 4
x_5 mrevenue -6 machine 1
x_5 labour 3 energy 1
x_6 mrevenue -7 machine 3
x_6 labour 2 energy 2
RHS
RHS1 machine 1050 labour 1050
RHS1 energy 1080
ENDATA
22 / 31
LP Format
■ Intended for representing LP’s of the form
min / max cT x
aTi x ⊲⊳i bi (1 ≤ i ≤ m, ⊲⊳i ∈ {≤, =, ≥})
ℓ≤x≤u (−∞ ≤ ℓk , uk ≤ +∞)
23 / 31
LP Format
1. Objective function section
2. Constraints section
(a) Keyword subject to (or equivalently: s.t., st, such that)
(b) List of constraints, each in a different line
24 / 31
LP Format
3. Bounds section (optional)
(a) Keyword Bounds
(b) List of bounds, each in a different line
l <= x <= u: sets lower and upper bounds
l <= x : sets lower bound
x >= l : sets lower bound
x <= u : sets upper bound
x = f: sets a fixed value
x free : specifies a free variable
26 / 31
Example 1
■ Let us see a program for solving:
27 / 31
Example 1
# include < ilcplex / ilocplex .h >
ILOSTLBEGIN
int main () {
IloEnv env ;
IloModel model ( env );
IloNumVarArray x ( env );
x . add ( IloNumVar ( env , 0 , 40));
x . add ( IloNumVar ( env )); // default : between 0 and +∞
x . add ( IloNumVar ( env ));
model . add ( - x [0] + x [1] + x [2] <= 20);
model . add ( x [0] - 3 * x [1] + x [2] <= 30);
model . add ( IloMaximize ( env , x [0]+2* x [1]+3* x [2]));
IloCplex cplex ( model );
cplex . solve ();
cout << " Max = " << cplex . getObjValue () << endl ;
env . end ();
}
28 / 31
Example 2
■ Let us see a program for solving:
29 / 31
Example 2
# include < ilcplex / ilocplex .h >
ILOSTLBEGIN
int main () {
IloEnv env ;
IloModel model ( env );
IloNumVarArray x ( env );
x . add ( IloNumVar ( env , 0 , 40));
x . add ( IloNumVar ( env ));
x . add ( IloNumVar ( env ));
x . add ( IloNumVar ( env , 2 , 3 , ILOINT ));
model . add ( - x [0] + x [1] + x [2] + 10 * x [3] <= 20);
model . add ( x [0] - 3 * x [1] + x [2] <= 30);
model . add ( x [1] - 3.5* x [3] == 0);
model . add ( IloMaximize ( env , x [0]+2* x [1]+3* x [2]+ x [3]));
IloCplex cplex ( model ); cplex . solve ();
cout << " Max = " << cplex . getObjValue () << endl ;
env . end ();
}
30 / 31
More information
■ You can find a template for Makefile and the examples shown here at:
www.cs.upc.edu/~ erodri/webpage/cps/lab/lp/tutorial-cplex-code/tutorial-cplex-code.tgz
31 / 31