Search code examples
pythonpyomo

Solving Pyomo concrete model


I'm very new to this Pyomo package and I'm trying to learn it using a very simple optimization problem. My code is as follows.

from __future__ import division
from pyomo.environ import *

model = ConcreteModel()
model.x = Var([1,2,3], domain=NonNegativeReals)
model.OBJ = Objective(expr = 1*model.x[1] + 2*model.x[2]+model.x[3], rule=Objective_rule)

model.Constraint1 = Constraint(expr = -1*model.x[1] -2*model.x[2] <= -4.5)
model.Constraint1 = Constraint(expr = -2*model.x[1] -3*model.x[3] <= -8)
model.Constraint1 = Constraint(expr =1*model.x[2] +1*model.x[3] ==10)
opt = SolverFactory('glpk')
opt.solve(model)

But unfortunately, I got the following traceback

Traceback (most recent call last):

  File "C:\Users\wilso\python\6308\opt1.py", line 12, in <module>
    model.OBJ = Objective(expr = 1*model.x[1] + 2*model.x[2]+model.x[3], rule=Objective_rule)

NameError: name 'Objective_rule' is not defined

Could anyone please kindly let me know what should I do to fix this problem. Thanks a lot for your great help.

Sincerely

Wilson


Solution

  • You are on the right track. 2 problems:

    1. in your objective, you are mixing two types of expressions. If you provide the expression directly (version 1 below), don't include rule=... And vice versa... see version 2
    2. Your constraints... you were building Constraint1 and then overwriting it. You need to label them differently. I changed that.

    If you look at some of my other pyomo answers on this site, you will see a couple other basic examples of using these formats.

    # from __future__ import division
    from pyomo.environ import *
    
    model = ConcreteModel("version 1")
    model.x = Var([1,2,3], domain=NonNegativeReals)
    model.OBJ = Objective(expr = 1*model.x[1] + 2*model.x[2]+model.x[3]) #, rule=Objective_rule)
    
    model.Constraint1 = Constraint(expr = -1*model.x[1] -2*model.x[2] <= -4.5)
    model.Constraint2 = Constraint(expr = -2*model.x[1] -3*model.x[3] <= -8)  # changed to "2"
    model.Constraint3 = Constraint(expr =1*model.x[2] +1*model.x[3] ==10)     # changed to "3"
    opt = SolverFactory('glpk')
    opt.solve(model)
    
    model.display()
    
    print('\n\n+++++++++++++++++++++++++++++++\n')
    ### alternatively with "rule"
    
    model = ConcreteModel("version 2")
    model.x = Var([1,2,3], domain=NonNegativeReals)
    
    ### OBJECTIVE
    def objective_rule(model):
        return 1*model.x[1] + 2*model.x[2]+model.x[3]
    model.OBJ = Objective(rule=objective_rule)
    
    ### CONSTRAINTS
    model.Constraint1 = Constraint(expr = -1*model.x[1] -2*model.x[2] <= -4.5)
    model.Constraint2 = Constraint(expr = -2*model.x[1] -3*model.x[3] <= -8)  # changed to "2"
    model.Constraint3 = Constraint(expr =1*model.x[2] +1*model.x[3] ==10)     # changed to "3"
    opt = SolverFactory('glpk')
    opt.solve(model)
    
    model.display()
    

    Yields:

    Model version 1
    
      Variables:
        x : Size=3, Index=x_index
            Key : Lower : Value : Upper : Fixed : Stale : Domain
              1 :     0 :   0.0 :  None : False : False : NonNegativeReals
              2 :     0 :  2.25 :  None : False : False : NonNegativeReals
              3 :     0 :  7.75 :  None : False : False : NonNegativeReals
    
      Objectives:
        OBJ : Size=1, Index=None, Active=True
            Key  : Active : Value
            None :   True : 12.25
    
      Constraints:
        Constraint1 : Size=1
            Key  : Lower : Body : Upper
            None :  None : -4.5 :  -4.5
        Constraint2 : Size=1
            Key  : Lower : Body   : Upper
            None :  None : -23.25 :  -8.0
        Constraint3 : Size=1
            Key  : Lower : Body : Upper
            None :  10.0 : 10.0 :  10.0
    
    
    +++++++++++++++++++++++++++++++
    
    Model version 2
    
      Variables:
        x : Size=3, Index=x_index
            Key : Lower : Value : Upper : Fixed : Stale : Domain
              1 :     0 :   0.0 :  None : False : False : NonNegativeReals
              2 :     0 :  2.25 :  None : False : False : NonNegativeReals
              3 :     0 :  7.75 :  None : False : False : NonNegativeReals
    
      Objectives:
        OBJ : Size=1, Index=None, Active=True
            Key  : Active : Value
            None :   True : 12.25
    
      Constraints:
        Constraint1 : Size=1
            Key  : Lower : Body : Upper
            None :  None : -4.5 :  -4.5
        Constraint2 : Size=1
            Key  : Lower : Body   : Upper
            None :  None : -23.25 :  -8.0
        Constraint3 : Size=1
            Key  : Lower : Body : Upper
            None :  10.0 : 10.0 :  10.0