提问者:小点点

Pyomo:带有if语句的约束


我目前正在努力解决这个问题。我需要最大化公司的利润。

这就是我目前拥有的代码:

from pyomo.environ import *
from pyomo.opt import *
opt = solvers.SolverFactory("ipopt")
model = ConcreteModel()

model.x1 = Var(within=NonNegativeIntegers)
model.x2 = Var(within=NonNegativeIntegers)
model.y1 = Var(within=NonNegativeIntegers)
model.y2 = Var(within=NonNegativeIntegers)
model.b1 = Var(within=Boolean)
model.b2 = Var(within=Boolean)

model.c1 = Constraint(expr = model.x1 + model.x2 + model.y1 + model.y2 <=   7000)
model.c2 = Constraint(expr = 2*model.x1 + 2*model.x2 + model.y1 + model.y2 <= 10000)
model.c3 = Constraint(expr = model.x1  <= 2000)
model.c4 = Constraint(expr = model.x2 <= 1000)
model.c5 = Constraint(expr = model.y1 <= 2000)
model.c6 = Constraint(expr = model.y2 <= 3000)


model.z = Objective(expr= (150*model.x1 + 180*model.x2*model.b1 + 100*model.y1 + 110*model.y2*model.b2), sense=maximize)
results = opt.solve(model)

这是我试图为约束编写的代码,该约束仅使用第一个坡度,只要不超过2000个产品:

def ObjRule(model):
 if model.x1 >= 2000:
     return model.b1==1
 if model.x2 >= 2000:
     return model.b2 == 1`

如果有人能给我一个提示,那我该怎么做呢。

提前谢谢你,帕特里克


共1个答案

匿名用户

在Pyomo中,规则不是发送给解算器的回调。对每个索引调用它们一次,以获得一组静态表达式。这组表达式是发送到解算器的内容。在规则内部使用的任何if逻辑都不应涉及变量的值(除非它基于变量的初始值,在这种情况下,只要在返回的主表达式之外使用变量,就将变量包装在value()中)。

如果要对分段函数进行建模,需要应用某种建模技巧。在某些情况下,这需要引入离散变量(参见Piecewise组件的示例),在其他情况下则不需要(例如,当最大化可以表示为有限数量仿射函数的最小值的分段函数时)。