Pyomo:使用 if 语句进行约束

Posted

技术标签:

【中文标题】Pyomo:使用 if 语句进行约束【英文标题】:Pyomo: constraint with if statements 【发布时间】:2017-04-13 21:05:29 【问题描述】:

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

这是我目前拥有的代码:

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() 中,无论您在主表达式之外使用它即返回)。

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

【讨论】:

以上是关于Pyomo:使用 if 语句进行约束的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Pyomo 中声明目标函数和约束(抽象模型)

如何从 pyomo 的 ipopt 接口中找到违反了哪个约束?

TypeError PYOMO:基于 pandas 数据框定义约束

pyomo 写模型似乎很慢

sql语句 判断表是不是存在

Pyomo 无法在抽象 Set 构建之前对其进行迭代