Python 如何将pyomo约束转换为规则表达式?

Python 如何将pyomo约束转换为规则表达式?,python,optimization,pyomo,Python,Optimization,Pyomo,我正在学习pyomo并使用一个玩具示例,更具体地说,我想了解如何使用pyomo构建表达式约束规则,并最终将其转换为装饰器形式-我有以下模型正在工作并产生预期的输出 from pyomo.environ import * L = {"s": 3, "j": 5, "f": 8} B = {"s": 2, "j": 5, "f": 8} C = {"s": 2, "j": 3, "f": 4} P = {"s": 3, "j": 5, "f": 7} limit_b = 325 limit_l

我正在学习pyomo并使用一个玩具示例,更具体地说,我想了解如何使用pyomo构建表达式约束规则,并最终将其转换为装饰器形式-我有以下模型正在工作并产生预期的输出

from pyomo.environ import *

L = {"s": 3, "j": 5, "f": 8}
B = {"s": 2, "j": 5, "f": 8}
C = {"s": 2, "j": 3, "f": 4}
P = {"s": 3, "j": 5, "f": 7}

limit_b = 325
limit_l = 400

model = ConcreteModel()

model.PACKAGES = Set(initialize=L.keys())

model.x = Var(model.PACKAGES, within=NonNegativeIntegers)

model.value = Objective(
    expr=sum((P[i] - C[i]) * model.x[i] for i in model.PACKAGES), sense=maximize
)

model.L_cst = Constraint(
    expr=sum(L[i] * model.x[i] for i in model.PACKAGES) <= limit_l
)

model.ballon_cst = Constraint(
    expr=sum(B[i] * model.x[i] for i in model.PACKAGES) <= limit_b
)

opt = SolverFactory("cbc")
results = opt.solve(model, tee=True)
model.pprint()
print("Objective value:", model.value())

有人能帮我解释一下这个过程吗?

约束中的问题是您将模型作为第一个参数传递。约束组件中的位置参数假定为索引集。您的约束未编制索引,因此使用规则声明约束的正确方法是:

model.max_L_per_month = Constraint(rule=max_L_per_month_rule)
我建议看一下使用规则声明约束的示例,以及decorator符号的概述

model.max_L_per_month = Constraint(rule=max_L_per_month_rule)