Mpec Examples

MPEC: Mathematical Programs with Equilibrium Constraints

Mathematical Programs with Equilibrium Constraints (MPECs) are formulations that can be used to model certain classes of discrete events. MPECs can be more efficient than solving mixed integer formulations of the optimization problems because it avoids the combinatorial difficulties of searching for optimal discrete variables.


SIGN Operator

! MPEC formulation for SIGN function
! y = SIGN(x) returns a value y, where:
!    1 if the corresponding element of X is greater than zero
!   -1 if the corresponding element of X is less than zero
Model sign
  Parameters
    x = -2
  End Parameters

  Variables
    y >= -1, <= 1

    s_a >= 0
    s_b >= 0
  End Variables

  Equations
    ! test sign operator, y = sign(x)
    x = s_b - s_a

    minimize s_a*(1+y) + s_b*(1-y)
  End Equations
End Model
! SIGN function MPEC as an Object
Objects
  f = sign
End Objects

Connections
  f.x = x
  f.y = y
End Connections

Parameters
  x = -2
End Parameters

Variables
  y
End Variables

GEKKO SIGNUM function (sign2)

See GEKKO Documentation for additional examples.

from gekko import GEKKO
m = GEKKO()
x = m.Param(-2)
# use sign2 to define a new variable
y = m.sign2(x)
m.solve()  # solve
print('x: ' + str(x.value))
print('y: ' + str(y.value))

Absolute Value (ABS) Operator

! MPEC formulation for ABS function
! y = ABS(x) returns a value y, where:
!    y = x if the corresponding element of X is > than zero
!    y = -x if the corresponding element of X is < than zero
Parameters
  x = -2
End Parameters

Variables
  y

  s_a >= 0
  s_b >= 0
End Variables

Equations
  ! test abs operator, y = abs(x)
  x = s_b - s_a
  y = s_a + s_b

  minimize s_a*s_b
End Equations
! ABS function MPEC as an Object
Objects
  f = abs
End Objects

Connections
  f.x = x
  f.y = y
End Connections

Parameters
  x = -2
End Parameters

Variables
  y
End Variables

GEKKO ABS function (abs2)

See GEKKO Documentation for additional examples.

from gekko import GEKKO
m = GEKKO()
x = m.Param(-2)
# use abs2 to define a new variable
y = m.abs2(x)
# use abs2 in an equation
z = m.Var()
m.Equation(z==m.abs2(x)+1)
m.solve() # solve
print('x: ' + str(x.value))
print('y: ' + str(y.value))
print('z: ' + str(z.value))

Minimum Selector (MIN) Operator

! MPEC formulation for MIN function
! y = MIN(x1,x2) returns a value y, where:
!    y = x1 if x1 < x2
!    y = x2 if x2 < x1
Model
  Parameters
    x1 = -2
    x2 = -1
  End Parameters

  Variables
    y

    ! slack variables
    s_a >= 0
    s_b >= 0
  End Variables

  Equations
    ! test min operator, y = min(x1,x2)
    x2 - x1 = s_b - s_a
    y = x1 - s_a

    minimize s_a*s_b
  End Equations
End Model
! MIN function MPEC as an Object
Objects
  f = min
End Objects

Connections
  f.x[1] = x1
  f.x[2] = x2
  f.y = y
End Connections

Parameters
  x1 = -2
  x2 = -1
End Parameters

Variables
  y
End Variables

GEKKO MIN function (min2)

See GEKKO Documentation for additional examples.

from gekko import GEKKO
m = GEKKO()
x1 = m.Param(-2)
x2 = m.Param(-1)
# use min2
y = m.min2(x1,x2)
m.solve() # solve
print('x1: ' + str(x1.value))
print('x2: ' + str(x2.value))
print('y: '  + str(y.value))

Maximum Selector (MAX) Operator

! MPEC formulation for MAX function
! y = MAX(x1,x2) returns a value y, where:
!    y = x1 if x1 > x2
!    y = x2 if x2 > x1
Model
  Parameters
    x1 = -2
    x2 = 4
  End Parameters

  Variables
    y

    ! slack variables
    s_a >= 0
    s_b >= 0
  End Variables

  Equations
    ! test max operator, y = max(x1,x2)
    x2 - x1 = s_a - s_b
    y = x1 + s_a

    minimize s_a*s_b
  End Equations
End Model
! MAX function MPEC as an Object
Objects
  f = max
End Objects

Connections
  f.x[1] = x1
  f.x[2] = x2
  f.y = y
End Connections

Parameters
  x1 = -2
  x2 =  4
End Parameters

Variables
  y
End Variables

GEKKO MAX function (min2)

See GEKKO Documentation for additional examples.

from gekko import GEKKO
m = GEKKO()
x1 = m.Param(-2)
x2 = m.Param(-1)
# use max2
y = m.max2(x1,x2)
m.solve() # solve
print('x1: ' + str(x1.value))
print('x2: ' + str(x2.value))
print('y: '  + str(y.value))

Reference

Mojica, J.L., Petersen, D.J., Hansen, B., Powell, K.M., Hedengren, J.D., Optimal Combined Long-Term Facility Design and Short-Term Operational Strategy for CHP Capacity Investments, Energy, Vol 118, 1 January 2017, pp. 97–115. Article

💬