es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo declarar la función objetivo y las restricciones en Pyomo (modelo abstracto)

Estoy aprendiendo cómo crear modelos abstractos en Pyomo e hice la modelación, sin embargo, al visualizar la pprint, no hay declaración de la función objetivo y las restricciones. ¿Cómo puedo solucionar esto? Adjunto el código.

Gracias de antemano.

import pyomo as pyo
from pyomo.environ import *

model = AbstractModel()

model.I = Set()
model.J = Set()

model.a = Param(model.I, model.J)
model.b = Param(model.I)
model.c = Param(model.J)

model.x = Var(model.J, domain=NonNegativeReals)

def obj(model):
  return sum(model.c[j] * model.x[j] for j in model.J)

model.obj = Objective(rule=obj)

def ax_constraint_rule(model, i):
  return sum(model.a[i, j] * model.x[j] for j in model.J) >= model.b[i]

model.AxbConstraint = Constraint(model.I, rule=ax_constraint_rule)

model.pprint()

3 Set Declarations
    I : Size=0, Index=None, Ordered=Insertion
        No construido
    J : Size=0, Index=None, Ordered=Insertion
        No construido
    a_index : Size=0, Index=None, Ordered=True
        No construido

3 Param Declarations
    a : Size=0, Index=a_index, Domain=Any, Default=None, Mutable=False
        No construido
    b : Size=0, Index=I, Domain=Any, Default=None, Mutable=False
        No construido
    c : Size=0, Index=J, Domain=Any, Default=None, Mutable=False
        No construido

1 Var Declarations
    x : Size=0, Index=J
        No construido

7 Declaraciones: I J a_index a b c x
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para declarar la función objetivo y las restricciones al usar modelos abstractos en Pyomo, debes especificarlos como componentes del modelo dentro del bloque model. En el código dado, obj y ax_constraint_rule se definen fuera del bloque model. Para solucionar esto, mueve estas definiciones dentro del bloque como se muestra a continuación:

    model = AbstractModel()
    
    model.I = Set()
    model.J = Set()
    
    model.a = Param(model.I, model.J)
    model.b = Param(model.I)
    model.c = Param(model.J)
    
    model.x = Var(model.J, domain = NonNegativeReals)
    
    # Define objective function as a model component
    def obj(model):
        return sum(model.c[j] * model.x[j] for j in model.J)
    
    # Specify the objective function
    model.obj = Objective(rule=obj)
    
    # Define constraints as model components
    def ax_constraint_rule(model, i):
        return sum(model.a[i, j] * model.x[j] for j in model.J) >= model.b[i]
    
    # Specify the constraints
    model.AxbConstraint = Constraint(model.I, rule=ax_constraint_rule)
    
    model.pprint()
    

    Con esta modificación, la función objetivo y la restricción ahora están incluidas en la salida del método model.pprint().

Comments are closed.