FICO Xpress Optimization Examples Repository
FICO Optimization Community FICO Xpress Optimization Home
Back to examples browserPrevious exampleNext example

Hybrid MIP-CP problem solving: sequential solving

The idea of this example is to use a Constraint Programming (CP) model to preprocess data for an LP problem. The constraint propagation performed by the CP solver tightens the bounds on certain decision variables.
  • solving a sequence of CP subproblems
  • data exchange between several models via shared memory
Further explanation of this example: Xpress Whitepaper 'Hybrid MIP/CP solving', Section 'Using CP propagation as preprocessor'. The example problem, namely planning the construction of a stadium, is described in the book 'Applications of optimization with Xpress-MP'.[download all files]

Source Files
By clicking on a file name, a preview is opened at the bottom of this page.

Data Files


   CP example problems
   file b1stadium_ka.mos
   Construction of a stadium
   (See "Applications of optimization with Xpress-MP",
        Section 7.1 Construction of a stadium)

   (c) 2008 Fair Isaac Corporation
       author: S. Heipcke, March 2005, rev. Dec. 2010
model "B-1 Stadium construction (CP)"
 uses "kalis"
  N = 19                              ! Number of tasks in the project
                                      ! (last = fictitious end task)
  TASKS = 1..N
  ARC: dynamic array(range,range) of integer  ! Matrix of the adjacency graph
  DUR: array(TASKS) of integer        ! Duration of tasks
  HORIZON : integer                   ! Time horizon

  start: array(TASKS) of cpvar        ! Start dates of tasks
  bestend: integer

 initializations from 'Data/b1stadium.dat'

 HORIZON:= sum(j in TASKS) DUR(j)

 forall(j in TASKS) do
  0 <= start(j); start(j) <= HORIZON

! Task i precedes task j
 forall(i, j in TASKS | exists(ARC(i, j))) do
  Prec(i,j):= start(i) + DUR(i) <= start(j)
  if not cp_post(Prec(i,j)) then
   writeln("Posting precedence ", i, "-", j, " failed")

! Since there are no side-constraints, the earliest possible completion
! time is the earliest start of the fictitiuous task N
 bestend:= getlb(start(N))
 start(N) <= bestend
 writeln("Earliest possible completion time: ", bestend)

! For tasks on the critical path the start/completion times have been fixed
! by setting the bound on the last task. For all other tasks the range of
! possible start/completion times gets displayed.
 forall(j in TASKS) writeln(j, ": ", start(j))


Back to examples browserPrevious exampleNext example