1 The EPLEX Library. 2 Introduction lib(eplex) An interface between ECLiPSe and an external LP/MIP...

Preview:

Citation preview

1

The EPLEX Library

2

Introduction

lib(eplex)

An interface between ECLiPSe and an external LP/MIP solver COIN-OR Open Solver Interface: currently to COIN’s CLP/CBC and

SYMPHONY/CLP (Open Source) XPRESS-MP, a product by Dash Associates CPLEX, a product by ILOG SA

Motivation to have this link: Use state-of-the-art linear programming tools Use ECLiPSe for modelling Build hybrid solvers

Implementation Tight coupling, using subroutine libraries

lib(eplex)

An interface between ECLiPSe and an external LP/MIP solver COIN-OR Open Solver Interface: currently to COIN’s CLP/CBC and

SYMPHONY/CLP (Open Source) XPRESS-MP, a product by Dash Associates CPLEX, a product by ILOG SA

Motivation to have this link: Use state-of-the-art linear programming tools Use ECLiPSe for modelling Build hybrid solvers

Implementation Tight coupling, using subroutine libraries

3

Mathematical Programming

Making optimal decisions with limited resources ‘Programming’ in the sense of planning Model problem to optimise as an ‘objective’ function,

subject to constraints Classic example: transportation problem

4

Mathematical Programming

500

300

400

200

100

400

300

10

89

7

5

11

5

35

108

7

Plantcapacity

Clientdemand

Transportationcost

minimize10 A1 + 7 A2 + 11 A3 + 8 B1 + 5 B2 + 10 B3 + 5 C1 + 5 C2 + 8 C3 + 9 D1 + 3 D2 + 7 D3

subject toA1 + A2 + A3 = 200B1 + B2 + B3 = 400C1 + C2 + C3 = 300D1 + D2 + D3 = 100

A1 + B1 + C1 + D1 500

A2 + B2 + C2 + D2 300

A3 + B3 + C3 + D3 400

A

B

C

D

1

2

3

Objective Function

Constraints

Leads to a matrix:•Each row is one constraint•Each column is one variable

6

LP/MIP – A brief overview

Linear Programming: Optimisation problem formulated using linear constraints and a linear

objective function An efficient algebraic method developed to solve such problems (Simplex,

1947) Interior point (barrier) method

Mixed Integer Programming: LP problems where some of the variables are constrained to be integer No known ‘optimal’ method: generally use simplex/barrier with branch and

bound search for optimal

Quadratic Programming Quadratic objective function, linear constraints Barrier method

8

Possible Uses From Within ECLiPSe

Black-boxIf problem is suitable for LP/QP/MIP as a whole

But: Only one solution, non-incremental, rounding errors

Incrementality and multiple instancesResults explicitly retrieved

Multiple independent subproblems

HybridSolvers work on (possibly overlapping) subproblems

Programmed cooperation strategy

Data-driven triggering

Low-level interface

9

General Usage

Loading::- lib(eplex).

Loads interface with default solver (OSI CLP/CBC on most machines)

Differences between the underlying solvers are largely hidden

DocumentationECLiPSe Library Manual

Tutorial chapter on Eplex

Reference Manual

10

Transportation Problem (black box solving)

:- lib(eplex).

main(Cost, Vars) :-Vars = [A1, A2, A3, B1, B2, B3, C1, C2, C3, D1, D2, D3],Vars :: 0.0..1.0Inf,

A1 + A2 + A3 $= 200,B1 + B2 + B3 $= 400,C1 + C2 + C3 $= 300,D1 + D2 + D3 $= 100,

A1 + B1 + C1 + D1 $=< 500,A2 + B2 + C2 + D2 $=< 300,A3 + B3 + C3 + D3 $=< 400,

optimize(min( 10*A1 + 7*A2 + 11*A3 + 8*B1 + 5*B2 + 10*B3 + 5*C1 + 5*C2 + 8*C3 + 9*D1 + 3*D2 + 7*D3), Cost).

11

Eplex Constraints

ConstraintsVars :: Min..Max

Expr1 $= Epxr2 eplex:(Expr1 =:= Epxr2)

Expr1 $>= Epxr2 eplex:(Expr1 >= Epxr2)

Expr1 $=< Expr2 eplex:(Expr1 =< Epxr2)

integers(Vars)

Linear expressionsX123 3.4+Expr -ExprE1+E2 E1-E2 E1*E2sum( ListOfExpr )ListOfExpr1 * ListOfExpr2

12

Be Aware of Conventions

In mathematical programming, non-negative variables are usually assumed as default

In ECLiPSe, the default is-1.0Inf .. 1.0Inf

Non-negative variables need to be declared, e.g.X :: 0.0 .. 1.0Inf

13

Common Arithmetic Solver Interface

$::/2

$=/2, =:=/2

$>=/2, >=/2

$=</2, =</2

$>/2, >/2

$</2, </2

$\=/2

=\=/2

::/2

#::/2

#= /2

#>=/2, #>/2

#=</2, #</2

#\=/2

integers/1

reals/1

suspend

ic

eplex

std arith

14

Black-box Optimizer

optimize(+Objective, -Cost) Objective is min(Expr) or max(Expr) Runs the external solver as a black box Considers all $=, $>=, $=< constraints, their variables, the variable

bounds and the integers/1 constraints Computes an optimal solution for Objective Returns the cost Cost Instantiates the variables to the computed solution values Selects LP/QP/MIP depending on integers and Objective

15

Black-box use of LP and MIP solver

A linear problem?- X+Y $>= 3, X-Y $= 0, optimize(min(X),Cost).

Y=1.5

X=1.5

Cost=1.5

A mixed integer problem?- X+Y $>=3, X-Y $= 0, integers([X]), optimize(min(X),Cost).

Y=2.0

X=2

Cost=2.0

A linear problem?- X+Y $>= 3, X-Y $= 0, optimize(min(X),Cost).

Y=1.5

X=1.5

Cost=1.5

A mixed integer problem?- X+Y $>=3, X-Y $= 0, integers([X]), optimize(min(X),Cost).

Y=2.0

X=2

Cost=2.0

X

Y

Cost

16

Summary: Eplex as black-box solver

CLP modelling / LP or MIP solving1. Do modelling and transformations in ECLiPSe

2. Load model into CPLEX/XPRESS/MP and solve using LP or MIP solver

3. Pass cost and solution values back to ECLiPSe

LP / MIP search

ECLiPSe External Solvervariables & bounds

cost

constraints

solution valuesX1 X2 ... Xm

=

=<

>=

= Cost

c1

c2

cn

Obj

17

Problems with Black-Box Approach Solvable constraint class severely limited

Pure LP/QP/MIP

Numerical problems The external solvers use floating-point numbers, subject to rounding errors Other ECLiPSe solvers are usually precise (intervals or rational numbers) Instantiating the ECLiPSe variables to inexact values may cause other

implementations of the constraints to fail!

Lack of incrementality Cannot find alternative optima Cannot add constraints or variables

MIP search is a straightjacket A complex search process inside the black box Hard to control (via dozens of parameters) Hard to add problem-specific heuristics

Unsuitable for solver cooperation!

18

Opening the Black Box

Code for optimize/2:

optimize(Objective, Cost) :-

eplex_solver_setup(Objective),

eplex_solve(Cost),

eplex_get(vars, VarVector),

eplex_get(typed_solution, SolutionVector),

VarVector = SolutionVector.

Code for optimize/2:

optimize(Objective, Cost) :-

eplex_solver_setup(Objective),

eplex_solve(Cost),

eplex_get(vars, VarVector),

eplex_get(typed_solution, SolutionVector),

VarVector = SolutionVector.

19

Incrementality

Solver setupeplex_solver_setup(+Objective)

Run solver onceeplex_solve(-Cost)

Computes a solution with Cost but does not instantiate variables

Access solution informationStatus, solutions, reduced costs, dual values, slack, statistics, etc.

eplex_get(+What, -Value)

eplex_var_get(+Var, +What, -Value)

New constraints and variables can now be added and the problem re-solved!

20

Multiple problems (eplex instances)

Declare an eplex instance, e.g.:- eplex_instance(prob).

(an instance called eplex exists by default)

Constraintsprob:(Vars :: Min..Max)prob:(Expr1 $= Epxr2) prob:(Expr1 =:= Epxr2)prob:(Expr1 $>= Epxr2) prob:(Expr1 >= Epxr2)prob:(Expr1 $=< Expr2) prob:(Expr1 =< Epxr2)prob:(integers(Vars))

Solver setupprob:eplex_solver_setup(+Objective)

Run solver onceprob:eplex_solve(-Cost)Computes a solution with Cost but does not instantiate variables

Access solution informationprob:eplex_get(+What, -Value)prob:epelx_var_get(+Var, +What, -Value)

21

Transportation Problem (with Instance API)

:- lib(eplex).:- eplex_instance(prob).

main(Cost, Vars) :-Vars = [A1, A2, A3, B1, B2, B3, C1, C2, C3, D1, D2, D3],prob:(Vars :: 0.0..1.0Inf),

prob:(A1 + A2 + A3 $= 200),prob:(B1 + B2 + B3 $= 400),prob:(C1 + C2 + C3 $= 300),prob:(D1 + D2 + D3 $= 100),prob:(A1 + B1 + C1 + D1 $=< 500),prob:(A2 + B2 + C2 + D2 $=< 300),prob:(A3 + B3 + C3 + D3 $=< 400),

prob:eplex_solver_setup(min( 10*A1 + 7*A2 + 11*A3 + 8*B1 + 5*B2 + 10*B3 + 5*C1 + 5*C2 + 8*C3 + 9*D1 + 3*D2 + 7*D3)),

prob:eplex_solve(Cost),

( foreach(Var,Vars) doprob:eplex_var_get(Var, typed_solution, Var)

).

22

Traditional MIP branching

simplex solution:X = 4.2

X =< 4 X >= 5

At each node: Solve the continuous relaxation (ignoring integrality) with simplex Select an integer variable with fractional simplex solution Try two alternatives, with bounds forced to integers

Eventually, all variables will be narrowed to integers(if a solution exists)

At each node: Solve the continuous relaxation (ignoring integrality) with simplex Select an integer variable with fractional simplex solution Try two alternatives, with bounds forced to integers

Eventually, all variables will be narrowed to integers(if a solution exists)

24

Doing MIP in ECLiPSe

:- lib(eplex), lib(branch_and_bound).

main :-...<setup constraints>IntVars = <variables that should take integral values>,Objective = <objective function>,...Objective $= CostVar,eplex_solver_setup(min(Objective)),eplex_solve(RelaxedCost), % initial simplex solvingCostVar $>= RelaxedCost) % apply resulting cost bound...minimize(mip_search(IntVars, CostVar), CostVar).

mip_search(IntVars, CostVar) :-...% for each X violating the integrality conditioneplex_var_get(X, solution, RelaxedSol),Split is floor(RelaxedSol),( X $=< Split ; X $>= Split+1 ), % choiceeplex_solve(RelaxedCost), % simplex re-solvingCostVar $>= RelaxedCost, % apply new cost bound...

no integrality constraints!

25

Ok, but ...

The search procedure became messyextra argument (CostVar)

explicit simplex calls

modularity lost (choices/propagation)

Do we really need to run simplex every time?there might be no significant change

Solution: data-driven triggering, e.g. oninstantiation

instantiation far from relaxed solution

bounds change

bounds exclude relaxed solution

The search procedure became messyextra argument (CostVar)

explicit simplex calls

modularity lost (choices/propagation)

Do we really need to run simplex every time?there might be no significant change

Solution: data-driven triggering, e.g. oninstantiation

instantiation far from relaxed solution

bounds change

bounds exclude relaxed solution

26

Triggering the solver automatically

eplex_solver_setup(+Objective, ?Cost, +Options,

+TriggerModes)Objective

min(Expr) or max(Expr)

Costvariable - it does not get instantiated, but only bounded by the solution cost.

TriggerModesinst - if a variable was instantiated

deviating_inst - if a variable was instantiated to a value that differs more than a tolerance from its LP-solution

bounds - if a variable bound was changed

deviating_bounds - if a variable bound was changed such that its LP-solution was excluded by more than a tolerance.

new_constraint - when a new constraint appears

<module>:<cond> - waking condition defined by other solver, e.g. ic:min

trigger(Atom) - explicit triggering

eplex_solver_setup(+Objective, ?Cost, +Options,

+TriggerModes)Objective

min(Expr) or max(Expr)

Costvariable - it does not get instantiated, but only bounded by the solution cost.

TriggerModesinst - if a variable was instantiated

deviating_inst - if a variable was instantiated to a value that differs more than a tolerance from its LP-solution

bounds - if a variable bound was changed

deviating_bounds - if a variable bound was changed such that its LP-solution was excluded by more than a tolerance.

new_constraint - when a new constraint appears

<module>:<cond> - waking condition defined by other solver, e.g. ic:min

trigger(Atom) - explicit triggering

27

Using trigger conditions

Example

?- X+Y $>= 3, X-Y $= 0, eplex_solver_setup(min(X), X, [], [inst]).Y = Y{1.5}X = X{1.5}Delayed goals: lp_demon(…)Yes.

?- X+Y $>= 3, X-Y $= 0, eplex_solver_setup(min(X), X, [], [inst]), X=2.0.Y = Y{2.0}X = 2.0Delayed goals: lp_demon(…)Yes.

28

Eplex solver as compound constraint

X1 X2 ... Xm

=

=<

>=

= Cost

c1

c2

cn

Obj

solver

setup

ExternalSolver

Solver triggered by events, then:

• new bounds and constraints are sent to the external solver

• external solver is run

• cost bound (or failure) is exported

• solution values are exported and ECLiPSe variables annotated (optional)

29

More Elegant Implementation of MIP:- lib(eplex), lib(branch_and_bound).

main :-...<setup constraints>IntVars = <variables that should take integral values>,Objective = <objective function>,...Objective $= CostVar,eplex_solver_setup(min(Objective), CostVar, [], [bounds]),...minimize(mip_search(IntVars), CostVar).

mip_search(IntVars) :-...% for each X violating the integrality conditioneplex_var_get(X, solution, RelaxedSol),Split is floor(RelaxedSol),( X $=< Split) ; X $>= Split+1 ), % choice...% simplex re-solving triggered by bounds change% cost bound automatically applied...

No explicit simplex calls, no auxiliary parameters to search procedure Standard CLP search scheme - other choices/constraints can be added now

30

Control Flow in Classical MIP Solver

Choice

Solve continuousrelaxation

Simplexstep

Choice

31

Control Flow with Constraint Propagation

Search/Choice

Propagation phase

Search/Choice

constraints

32

Control Flow with Constraint Propagation

Search/Choice

Propagation phase

Search/Choice

constraints

Eplex instance demon can be integrated similar to a global constraint

eplex instances

Recommended