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

Linearizations and approximations via SOS and piecewise linear (pwlin) expressions

Description
Various examples of using SOS (Special Ordered Sets of type 1 or 2) and piecewise linear expressions to represent nonlinear functions in MIP models implemented with Mosel (files *.mos) or BCL (files *.cxx).
  • approximating a continuous nonlinear function in a single variable via piecewise linear expressions (soslingc.mos) or SOS-1 (soslin.*);
  • approximating a continuous nonlinear function in two variables via SOS-2 (sosquad.*);
  • price breaks: all items discount (non-continuous piecewise linear function) formulated via piecewise linear expressions (pricebrai) or SOS-1 (pricebrai SOS);
  • incremental pricebreaks formulated via piecewise linear expressions (pricebrinc), SOS-2 (pricebrinc SOS), or binary variables (pricebrinc bin).
Further explanation of this example: Whitepaper 'MIP formulations and linearizations', Section Non-linear functions


Source Files
By clicking on a file name, a preview is opened at the bottom of this page.
soslin.cxx[download]
soslin.mos[download]
soslingc.mos[download]
sosquad.cxx[download]
sosquad.mos[download]





sosquad.mos

(!*******************************************************
   Mosel Example Problems 
   ======================

   file sosquad.mos
   ````````````````
   Approximation of a nonlinear function in two variables 
   by two SOS-2.
   - Example discussed in mipformref whitepaper -  
      
   (c) 2008 Fair Isaac Corporation
       author: S. Heipcke, 2002, rev. July 2020
*******************************************************!)

model "sosquad"
 uses "mmxprs"

 parameters
  NX=10
  NY=10
 end-parameters

 declarations
  RX=1..NX                         ! Set of breakpoints X-axis
  RY=1..NY                         ! Set of breakpoints Y-axis
  X: array(RX) of real             ! Breakpoint coordinates X-axis
  Y: array(RY) of real             ! Breakpoint coordinates Y-axis
  FXY: array(RX,RY) of real        ! Function values at breakpoints
 end-declarations

! Sample data: a 10x10 grid to interpolate a quadratic function.
 forall(i in RX) X(i):=i
 forall(j in RY) Y(j):=j
 forall(i in RX, j in RY) FXY(i,j) := (i-5)*(j-5)
 writeln(FXY)

 declarations
  wx: array(RX) of mpvar           ! Weight on x co-ordinate
  wy: array(RY) of mpvar           ! Weight on y co-ordinate
  wxy: array(RX,RY) of mpvar       ! Weight on (x,y) co-ordinates
  x,y,f: mpvar                     ! The actual variables: x,y and f(x,y)
 end-declarations

! Definition of SOS
 sum(i in RX) X(i)*wx(i) is_sos2
 sum(j in RY) Y(j)*wy(j) is_sos2

! Constraints
 forall(i in RX) sum(j in RY) wxy(i,j) = wx(i)
 forall(j in RY) sum(i in RX) wxy(i,j) = wy(j)
 sum(i in RX) wx(i) = 1
 sum(j in RY) wy(j) = 1

! Then x, y and f can be calculated using
 x = sum(i in RX)  X(i)*wx(i)
 y = sum(j in RY)  Y(j)*wy(j)
 f = sum(i in RX,j in RY) FXY(i,j)*wxy(i,j)
! But of course there is a fair amount of degeneracy in the
! representation of P=(x,y) by the four points C.

! f can take negative or positive values
 f is_free

! Set bounds to make the problem more interesting
 x >= 2; y >= 2
 
! Solve the problem
 minimize(f)
 
 writeln("Solution: ", getobjval)
 writeln("x: ", x.sol, ", y: ", y.sol) 

end-model

Back to examples browserPrevious exampleNext example