3.1 Using the decorator notation for rules:#
In the slides, we saw an alternative notation for declaring and defining Pyomo components using decorators. Below we change the model to use the decorator notation.
# Warehouse location determination problem using decorator notation
import pyomo.environ as pyo
model = pyo.ConcreteModel(name="(WL)")
W = ['Harlingen', 'Memphis', 'Ashland']
C = ['NYC', 'LA', 'Chicago', 'Houston']
d = {('Harlingen', 'NYC'): 1956, \
('Harlingen', 'LA'): 1606, \
('Harlingen', 'Chicago'): 1410, \
('Harlingen', 'Houston'): 330, \
('Memphis', 'NYC'): 1096, \
('Memphis', 'LA'): 1792, \
('Memphis', 'Chicago'): 531, \
('Memphis', 'Houston'): 567, \
('Ashland', 'NYC'): 485, \
('Ashland', 'LA'): 2322, \
('Ashland', 'Chicago'): 324, \
('Ashland', 'Houston'): 1236 }
P = 2
model.x = pyo.Var(W, C, bounds=(0,1))
model.y = pyo.Var(W, within=pyo.Binary)
@model.Objective()
def obj(m):
return sum(d[w,c]*m.x[w,c] for w in W for c in C)
@model.Constraint(C)
def one_per_cust(m, c):
return sum(m.x[w,c] for w in W) == 1
@model.Constraint(W,C)
def warehouse_active(m, w, c):
return m.x[w,c] <= m.y[w]
@model.Constraint()
def num_warehouses(m):
return sum(m.y[w] for w in W) <= P
pyo.SolverFactory('glpk').solve(model)
model.y.pprint()
model.x.pprint()
y : Size=3, Index={Harlingen, Memphis, Ashland}
Key : Lower : Value : Upper : Fixed : Stale : Domain
Ashland : 0 : 1.0 : 1 : False : False : Binary
Harlingen : 0 : 1.0 : 1 : False : False : Binary
Memphis : 0 : 0.0 : 1 : False : False : Binary
x : Size=12, Index={Harlingen, Memphis, Ashland}*{NYC, LA, Chicago, Houston}
Key : Lower : Value : Upper : Fixed : Stale : Domain
('Ashland', 'Chicago') : 0 : 1.0 : 1 : False : False : Reals
('Ashland', 'Houston') : 0 : 0.0 : 1 : False : False : Reals
('Ashland', 'LA') : 0 : 0.0 : 1 : False : False : Reals
('Ashland', 'NYC') : 0 : 1.0 : 1 : False : False : Reals
('Harlingen', 'Chicago') : 0 : 0.0 : 1 : False : False : Reals
('Harlingen', 'Houston') : 0 : 1.0 : 1 : False : False : Reals
('Harlingen', 'LA') : 0 : 1.0 : 1 : False : False : Reals
('Harlingen', 'NYC') : 0 : 0.0 : 1 : False : False : Reals
('Memphis', 'Chicago') : 0 : 0.0 : 1 : False : False : Reals
('Memphis', 'Houston') : 0 : 0.0 : 1 : False : False : Reals
('Memphis', 'LA') : 0 : 0.0 : 1 : False : False : Reals
('Memphis', 'NYC') : 0 : 0.0 : 1 : False : False : Reals