If statement 如何使用包含Pyomo约束中变量的if条件

If statement 如何使用包含Pyomo约束中变量的if条件,if-statement,constraints,pyomo,If Statement,Constraints,Pyomo,我正在尝试向我的Pyomo模型添加一个简单约束: 最大值{x[1]-a,b}+最大值{x[2]-a,b}>=c 其中,a、b、c是给定的预定义参数,x是由集合模型I索引的决策变量,其初始化为[1,2] 为了实现这一点,我尝试了以下方法,但没有成功: from pyomo.environ import * from pyomo.opt import SolverFactory from pyomo.environ import * model = AbstractModel() model.I

我正在尝试向我的Pyomo模型添加一个简单约束:

最大值{x[1]-a,b}+最大值{x[2]-a,b}>=c

其中,a、b、c是给定的预定义参数,x是由集合模型I索引的决策变量,其初始化为[1,2]

为了实现这一点,我尝试了以下方法,但没有成功:

from pyomo.environ import *
from pyomo.opt import SolverFactory

from pyomo.environ import *
model = AbstractModel()
model.I = Set()  

model.a = Param()
model.b = Param()
model.c = Param()

model.x = Var(model.I)
def my_rule(model):
    total = 0
    for i in model.I:
        val = model.x[i] - model.a
        if val < model.b:
            val = model.b
        total = total + val            
    return total >= model.c
model.my_constraint = Constraint(rule=my_rule)

data = {None:{
    'I': {None: [1,2]},
    'a': {None: 3},
    'b': {None: 5},
    'c': {None: 4}}
}
real_model = model.create_instance(data)
从pyomo.environ导入*
从pyomo.opt导入SolverFactory
从pyomo.environ导入*
模型=抽象模型()
model.I=Set()
model.a=Param()
model.b=Param()
model.c=Param()
模型x=Var(模型I)
定义my_规则(型号):
总数=0
对于模型中的i.i:
val=模型.x[i]-模型.a
如果val<型号b:
val=型号b
总计=总计+val
返回总数>=model.c
model.my\u constraint=constraint(规则=my\u规则)
数据={None:{
'I':{None:[1,2]},
'a':{None:3},
'b':{None:5},
'c':{None:4}
}
real\u model=model.create\u实例(数据)
给出的错误是: 警告:已弃用:已弃用链式不等式。使用不等式() 函数来表示范围不等的表达式。 错误:为约束my_约束生成表达式时规则失败: TypeError:试图形成具有两个下界的复合不等式

        The inequality expression:
            x[1] - 3  <  5.0
        contains non-constant terms (variables) that were evaluated in an
        unexpected Boolean context at
          File '<ipython-input-11-e3a6c44c5b8e>', line 14:
    if val < model.b:

        Evaluating Pyomo variables in a Boolean context, e.g.
            if expression <= 5:
        is generally invalid.  If you want to obtain the Boolean value of
        the expression based on the current variable values, explicitly
        evaluate the expression using the value() function:
            if value(expression) <= 5:
        or
            if value(expression <= 5):
不等式表达式:
x[1]-3<5.0
包含在中计算的非常量项(变量)
发生意外的布尔上下文
文件“”,第14行:
如果val<型号b:
在布尔上下文中计算Pyomo变量,例如。
如果表达式耦合问题

  • 如果条件取决于变量的求值,则不能将“if”语句隐藏在约束构造中
  • 如果您正试图这样做,则不能在LP/IP中直接表示max和min函数。也许有办法重新制定……但是
你的约束有点荒谬。如果
b
c
是固定值,则您提出的约束始终为真,因为如上所述
b
c
,因此:

max(任意,
b
)+max(任意,
b
)>
c
始终为真

是时候重新检查您的问题公式了。:)

两个问题

  • 如果条件取决于变量的求值,则不能将“if”语句隐藏在约束构造中
  • 如果您正试图这样做,则不能在LP/IP中直接表示max和min函数。也许有办法重新制定……但是
你的约束有点荒谬。如果
b
c
是固定值,则您提出的约束始终为真,因为如上所述
b
c
,因此:

max(任意,
b
)+max(任意,
b
)>
c
始终为真

是时候重新检查您的问题公式了。:)