Решение бетонной модели Pyomo

Я новичок в этом пакете Pyomo и пытаюсь изучить его, используя очень простую задачу оптимизации. Мой код выглядит следующим образом.

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)

Но, к сожалению, я получил следующую трассировку

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

Может ли кто-нибудь любезно сообщить мне, что мне делать, чтобы решить эту проблему. Большое спасибо за вашу огромную помощь.

Искренне

Уилсон


person yihao ren    schedule 05.09.2020    source источник


Ответы (1)


Ты на правильном пути. 2 проблемы:

  1. в своей цели вы смешиваете два типа выражений. Если вы указываете выражение напрямую (версия 1 ниже), не включайте rule=... И наоборот ... см. Версию 2
  2. Ваши ограничения ... вы строили Constraint1, а затем перезаписывали его. Их нужно маркировать по-другому. Я изменил это.

Если вы посмотрите на некоторые другие мои pyomo ответы на этом сайте, вы увидите еще пару основных примеров использования этих форматов.

# 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()

Урожайность:

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
person AirSquid    schedule 06.09.2020