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
! 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
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.
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
! 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
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.
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
! 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
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.
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
! 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
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.
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