Reputation: 13
model = pyo.ConcreteModel()
# Sets
model.k = pyo.RangeSet(136)
model.i = pyo.Set(initialize = [1,2,3,4])
model.n = pyo.Set(model.i,initialize = {1:[1,2,3],2:[1,2,3,4,5],3:[1,2,3],4:[1,2]})
def set_init(model):
return [(i,n) for i in model.i for n in model.n[i]]
model.x = pyo.Set(dimen = 2,initialize = set_init)
#Param
model.t = pyo.Param(model.k,initialize = np.arange(0, 68, 0.5).tolist())
model.tauB = pyo.Param(model.x)
#Var
model.Sb = pyo.Var(model.k,model.x,within=pyo.Binary)
model.Db = pyo.Var(model.x,domain = pyo.NonNegativeReals)
def rule3(model,i,n):
return model.Db[i,n]>=sum(model.Sb[k,i,n]*model.t[k] for k in model.k) - model.tauB[i,n]
model.objconst = pyo.Constraint(model.i,model.n[i],rule=rule3)
ERROR: Rule failed when generating expression for Constraint objconst with index (1, 1): AttributeError: 'list' object has no attribute 'is_expression_type'
ERROR: Constructing component 'objconst' from data=None failed: AttributeError: 'list' object has no attribute 'is_expression_type'
What is the correct way to use this indexed set model.x to build the constraint?
Upvotes: 1
Views: 1802
Reputation: 11903
This should get you going. Made several tweaks. You should use model.x
for creating your last constraint as you cannot reference the value i
in the rule statement. Also, I re-worked your k
values. This compiles.
import pyomo.environ as pyo
import numpy as np
model = pyo.ConcreteModel()
k_data = { idx:item for idx, item in enumerate(np.arange(0, 68, 0.5))}
# Sets
model.k = pyo.Set(initialize=k_data.keys())
model.i = pyo.Set(initialize = [1,2,3,4])
model.n = pyo.Set(model.i,initialize = {1:[1,2,3],2:[1,2,3,4,5],3:[1,2,3],4:[1,2]})
def set_init(model):
return [(i,n) for i in model.i for n in model.n[i]]
model.x = pyo.Set(dimen = 2,initialize = set_init)
#Param
model.t = pyo.Param(model.k,initialize = k_data)
model.tauB = pyo.Param(model.x, initialize = 0) # <-- need some values for this
#Var
model.Sb = pyo.Var(model.k,model.x,within=pyo.Binary)
model.Db = pyo.Var(model.x,domain = pyo.NonNegativeReals)
def rule3(model,i,n):
return model.Db[i,n]>=sum(model.Sb[k,i,n]*model.t[k] for k in model.k) - model.tauB[i,n]
model.objconst = pyo.Constraint(model.x,rule=rule3)
Upvotes: 0