Initializing help system before first use

Indicator constraints

Indicator constraints

  • associate a binary variable b with a linear constraint C
  • model an implication:
    'if b=1 then C', in symbols: b → C, or
    'if b=0 then C', in symbols: b- → C
    (the constraint C is active only if the condition is true)
  • use indicator constraints for the composition of logic expressions

Indicator constraints in Mosel: for the definition of indicator constraints (function indicator of module mmxprs) you need a binary variable (type mpvar) and a linear inequality constraint (type linctr). You also have to specify the type of the implication (1 for b → C and -1 for b- → C). The subroutine indicator returns a new constraint of type logctr that can be used in the composition of other logic expressions (see Section Logic constructs below).

 uses "mmxprs"

 declarations
  R=1..10
  C: array(range) of linctr
  L: array(range) of logctr
  x: array(R) of mpvar
  b: array(R) of mpvar
 end-declarations

 forall(i in R) b(i) is_binary   ! Variables for indicator constraints

 C(2):= x(2)<=5

! Define 2 indicator constraints
 L(1):= indicator(1, b(1), x(1)+x(2)>=12)    ! b(1)=1 -> x(1)+x(2)>=12
 indicator(-1, b(2), C(2))                   ! b(2)=0 -> x(2)<=5

 C(2):=0                         ! Delete auxiliary constraint definition

Indicator constraints in BCL: an indicator constraint is defined by associating a binary decision variable (XPRBvar) and an integer flag (1 for b → C and -1 for b- → C) with a linear inequality or range constraint (XPRBctr). By defining an indicator constraint (function XPRBsetindicator or method XPRBctr.setIndicator() depending on the host language) the type of the constraint itself gets changed; it can be reset to 'standard constraint' by calling the setIndicator function with flag value 0.

 XPRBprob prob("testind");
 XPRBvar x[N], b[N];
 XPRBctr IndCtr[N];
 int i;

// Create the decision variables
 for(i=0;i<N;i++) x[i] = prob.newVar("x", XPRB_PL);  // Continuous variables
 for(i=0;i<N;i++) b[i] = prob.newVar("b", XPRB_BV);  // Indicator variables

// Define 2 linear inequality constraints
 IndCtr[0] = prob.newCtr("L1", x[0]+x[1]>=12);
 IndCtr[1] = prob.newCtr("L2", x[1]<=5);

// Turn the 2 constraints into indicator constraints
 IndCtr[0].setIndicator(1, b[0]);              // b(0)=1 -> x(0)+x(1)>=12
 IndCtr[1].setIndicator(-1, b[1]);             // b(1)=0 -> x(1)<=5