Optimization team
Optimization team

Reputation: 143

How to change the mutable parameter in Pyomo (AbstractModel)?

I am trying to update my mutable parameter Nc in my Abstract model the initial value is 4 I constructed the instance then change instance.Nc to 5 and solve it but it is still 4 (initial value) , can any body help ?

from pyomo.environ import *
import random 

model = AbstractModel()
model.i = RangeSet(40)
model.j = Set(initialize=model.i)
model.x = Var(model.i,model.j, initialize=0,within=Binary)
model.y = Var(model.i, within=Binary)

model.Nc=Param(initialize=5,mutable=True)
def Ninit(model,i):
    return random.randint(0,1)

model.N=Param(model.i,initialize=Ninit,mutable=True)

def Dinit(model,i,j):
    return random.random()
model.D=Param(model.i,model.j,initialize=Dinit,mutable=True)
def rule_C1(model,i,j):
        return model.x[i,j]<=model.N[i]*model.y[j] 
model.C1   = Constraint(model.i,model.j,rule=rule_C1)
def rule_C2(model):
        return sum(model.y[i] for i in model.i )==model.Nc
model.C2   = Constraint(rule=rule_C2)
def rule_C3(model,i):
        return sum(model.x[i,j] for j in model.j)==model.N[i]

model.C3   = Constraint(model.i,rule=rule_C3)

def rule_OF(model):
    return sum( model.x[i,j]*model.D[i,j] for i in model.i for j in model.j )
model.obj = Objective(rule=rule_OF, sense=minimize)
opt = SolverFactory('glpk')

#model.NC=4
instance = model.create_instance()
instance.NC=4
results = opt.solve(instance) # solves and updates instance
print('NC= ',value(instance.Nc))
print('OF= ',value(instance.obj))

Upvotes: 0

Views: 429

Answers (1)

AW Exchanger
AW Exchanger

Reputation: 21

It seems you are actually initializing your parmeter Nc to 5 (model.Nc=Param(initialize=5,mutable=True)) and then changing it to 4 once you create the instance (instance.Nc=4), so you might want to do the opposite (model.Nc=Param(initialize=4,mutable=True) then instance.Nc=4)

Also, note that you are inconsistantly addressing the Nc parameter throughout the code. When you declare the parameter you name it "Nc" (model.Nc=Param(initialize=5,mutable=True)), which is the actual python variable that Pyomo will use in the model, but later you try to change it with capital letters "NC", which is not a parameter (instance.NC=4). Minor typos like these can cause confusion and give you errors. Make sure to fix them and give it a try again

Upvotes: 2

Related Questions