A brief introduction to linear optimization with a focus on applying it with the high-quality open-source solver GLPK.
Originally prepared for an intra-department sharing session.
2. Outline
What is Linear Optimization?
What is GLPK?
Available Bindings
GNU MathProg Scripting
Examples:
Trans-shipment (the standard example)
Time Table Scheduling (from school days...)
Allocating HDB Flats by “Combinatorial Auction”
2
3. Linear Optimization? What?
The minimization of functions of the form
c1 x1 + c2 x2 + …+ cn xn
by varying decision variables xi,
subject to constraints of the form
ai1 x1 + ai2 x2 + …+ ain xn = bi or
ai1 x1 + ai2 x2 + …+ ain xn ≤ bi
where the other coefficients aij, bi and ci are fixed.
3
4. Linear Optimization? What?
A typical example: “The Diet Problem”. By
varying the intake of each type of food (e.g.:
chicken rice, durian, cheese cake), minimize
(The Total Cost of Food)
subject to
(Non-negativity of the intakes of each type.)
(Satisfaction of minimum nutritional requirements)
4
5. Linear Optimization? What?
A secondary school example. By varying decision
variables x and y, maximize
2x+y
subject to
x ≥ 0, x ≤ 1,
y ≥ 0, y ≤ 1,
x + y ≤ 1.5
5
6. Linear Optimization? What?
A secondary school example. By varying decision
variables x and y, maximize
2x+y
subject to
x ≥ 0, x ≤ 1,
y ≥ 0, y ≤ 1,
x + y ≤ 1.5
6
7. Linear Optimization? What?
A secondary school example. By varying decision
variables x and y, maximize
2x+y
subject to
x ≥ 0, x ≤ 1,
y ≥ 0, y ≤ 1,
x + y ≤ 1.5
7
8. Linear Optimization? What?
A secondary school example. By varying decision
variables x and y, maximize
2x+y
subject to
x ≥ 0, x ≤ 1,
y ≥ 0, y ≤ 1,
x + y ≤ 1.5
8
9. Linear Optimization? What?
A more useful sounding example: “Simple
Commodity Flow”. By varying the number of TV
sets being transferred along each road in a
road network, minimize
(Total Distance each TV set is moved through)
subject to
(Non-negativity of the flows)
(Sum of Inflows = Sum of Outflows at each junction where
Stock counts as inflow & demand, outflow.)
9
10. Linear Optimization? What?
Perhaps one of the most widely used mathematical
techniques:
Network flow / multi-commodity flow problems
Project Management
Production Planning, etc...
Used in Mixed Integer Linear Optimization for:
Airplane scheduling
Facility planning
Timetabling, etc...
10
11. Linear Optimization? What?
Solution methods:
Simplex-based algorithms
Non-polynomial-time algorithm
Performs much better in practice than predicted by
theory
Interior-point methods
Polynomial-time algorithm
Also performs better in practice than predicted by
theory
11
12. What is GLPK
GLPK: GNU Linear Programming Kit
An open-source, cross-platform software package for
solving large-scale Linear Optimization and Mixed
Integer Linear Optimization problems.
Comes bundled with the GNU MathProg scripting
language for rapid development.
URL: http://www.gnu.org/software/glpk/
GUSEK (a useful front-end):
http://gusek.sourceforge.net/gusek.html
12
13. Bindings for GLPK
GLPK bindings exist for:
C, C++ (with distribution)
Java (with distribution)
C#
Python, Ruby, Erlang
MATLAB, R
… even Lisp.
(And probably many more.)
13
14. Scripting with GNU MathProg
For expressing optimization problems in a compact,
human readable format.
Used to generate problems for computer solution.
Usable in production as problem generation is typically a
small fraction of solution time and problem generation
(in C/C++/Java/etc) via the API takes about as long.
Hence, “rapid development” as opposed to “rapid
prototyping”.
14
15. Scripting with GNU MathProg
Parts of a script:
Model: Description of objective function and
constraints to be satisfied
Data: Parameters that go into the model
Data can be acquired from a database (e.g. via
ODBC).
Post processed solution can be written to a
database.
15
16. Scripting with GNU MathProg
Model File (For choosing a meet-up date)
set Peoples;
set Days;
set Meals;
... # PrefInd[...] defined here
var x{d in Days, m in Meals} binary;
maximize Participation_and_Preference: sum{p in Peoples, d in Days, m
in Meals} PrefInd[p,d,m]*x[d,m];
s.t. one_meal: sum{d in Days, m in Meals} x[d,m] = 1;
solve;
... # Post-processing here
end;
16
17. Scripting with GNU MathProg
Data File (for the above model)
data;
set Peoples := JC LZY FYN MJ;
set Days := Mon Tue Wed Thu Fri Sat Sun;
set Meals := Lunch Dinner;
# Last element is 1 if preferred, 0 if otherwise
set Prefs :=
(JC, Mon, Dinner, 1),
(JC, Tue, Dinner, 0),
... # Rest of preference data
;
end;
17
18. Scripting with GNU MathProg
Good “student” practice:
Decouple model from data (separate files)
Write script to generate data file from sources
Reasonable production practice
Decouple model from data
Acquire data from and write output to database
Abuse: Read statements can be used to write to the
database (e.g.: a “currently working” flag)
18
19. Examples
Trans-shipment (the standard example)
A source to destination network flow problem
Data: Quantity at source, Demand at destination
Time Table Scheduling (from school days...)
Respect requirements, Maximize preference
Support alternate “sessions” and multiple time slots
A “Combinatorial Auction” for HDB Flat Allocation
Allocation and pricing of HDB flats
Efficiently solvable (Surprise!)
19
20. Example: Trans-shipment
Model File
set I; /* canning plants */
param a{i in I}; /* capacity of plant i */
set J; /* markets */
param b{j in J}; /* demand at market j */
param d{i in I, j in J}; /* distance in thousands of miles */
param f; /* freight in dollars per case per thousand miles */
param c{i in I, j in J} := f * d[i,j] / 1000; /* transport cost */
var x{i in I, j in J} >= 0; /* shipment quantities in cases */
minimize cost: sum{i in I, j in J} c[i,j] * x[i,j]; /* total costs */
s.t. supply{i in I}: sum{j in J} x[i,j] <= a[i];/* supply limits */
s.t. demand{j in J}: sum{i in I} x[i,j] >= b[j];/* satisfy demand */
solve;
# < Post-processing code >
end;
20
21. Example: Trans-shipment
Data File
data;
set I := Seattle San-Diego;
param a := Seattle 350
San-Diego 600;
set J := New-York Chicago Topeka;
param b := New-York 325
Chicago 300
Topeka 275;
param d : New-York Chicago Topeka :=
Seattle 2.5 1.7 1.8
San-Diego 2.5 1.8 1.4 ;
param f := 90;
end;
21
23. Example: Trans-shipment
Using ODBC as a Data Source
table tbl_plants IN 'ODBC' 'dsn=demo_tpt' 'plants' :
I <- [name], a~capacity;
table tbl_markets IN 'ODBC' 'dsn=demo_tpt' 'markets' :
J <- [name], b~demand;
table tbl_freight IN 'ODBC' 'dsn=demo_tpt' 'freight' :
[plant,market], d~cost;
Sending Output to a Database (via ODBC)
table result{i in I, j in J: x[i,j]} OUT 'ODBC' 'dsn=demo_tpt'
'UPDATE freight SET flow=? WHERE (plant=?) and (market=?)' :
x[i,j], i, j;
23
24. Example: Time Tabling
Objective: Maximize “preference points”
Constraints:
Pick exactly one appointment from appointment groups
marked compulsory
Pick at most one appointment any appointment group
No timing clash between appointments
24
26. Example: A “Combinatorial”
Auction for HDB Flat Allocation
Objective: Maximize “Allocative Efficiency” (via bids)
Constraints:
All flats allocated (Balance allocated to “HDB”)
At most one flat per “actual applicant”
Allocation limits for applicant categories (Second-timers, Racial
Quotas according to Ethnic Integration Policy)
Modified data used to price allocated flats (allocated
bidder excluded; VCG Mechanism: optimal objective
function value compared with that of full problem).
26
27. Example: A “Combinatorial”
Auction for HDB Flat Allocation
Sample Output (Synthetic Data)
...
Solution by Bidder:
Bidder 1 (2 bids): 1 x C_8
Bidder 2 (1 bids):
...
...
Bidders in group [SecondTimers, EIP_Limit_Chinese] allocated C_8 at price 88 (reserve
price: 53, % of reserve price: 166.0%)
Bidders in group [EIP_Limit_Malay] allocated C_3 at price 218 (reserve price: 180, % of
reserve price: 121.1%)
...
Bidder 1 allocated C_8 at price 88 [SecondTimers, EIP_Limit_Chinese] (bid: 95, reserve
price: 53, savings: 7, possible savings: 42, % savings: 16.67%)
Bidder 6 allocated C_3 at price 218 [EIP_Limit_Malay] (bid: 319, reserve price: 180,
savings: 101, possible savings: 139, % savings: 72.66%)
27