Pyomo ValueError:无效的约束表达式

时间:2017-08-10 14:48:19

标签: python pyomo

我正在编写一个带有以下形式约束的pyomo整数程序:

def example_rule(model, j, t):
    value = sum(model.x[j,i]*(util[i][t]) for i in model.F)
    return 0 <= value <= 1
model.onelateral = Constraint(model.L, model.T, rule=example_rule)

util[i][t]是一个包含始终为0或1的值的字典。 model.x[j,i]是二元决策变量。

有时当我运行我的模型时,它运行正常。但是,有时当我更改util[i][t]中的维度/值时,会抛出此错误:

ERROR: Constructing component 'example' from data=None failed:
    ValueError: Invalid constraint expression. The constraint expression resolved to a trivial Boolean (True) instead of a Pyomo object. Please modify your rule to return Constraint.Feasible instead of True.

Error thrown for Constraint 'example[L01]'

我找不到为什么它决定它不喜欢util[i][t]的输入值的任何一致性。那里永远不会有任何空值。

如果我在没有此约束的情况下运行模型,它始终可以正常工作。

我也尝试过以下形式编写约束:

def example_rule(model,j):
    a = 0
    for t in model.T:
        n = 0
        for i in model.F:
            if model.x[j,i].value == 1:
                a = model.x[j,i] * util[i][t]
            if a == 1:
                n = n + a
    return 0 <= n <= 1
model.example = Constraint(model.L, rule=example_rule)

但是我得到了同样的错误信息。

我看过这里:https://groups.google.com/forum/#!msg/pyomo-forum/hZXDf7xGnTI/_aiAUN5IwgQJ 但这对我没有帮助。

我使用cbc和glpk求解器尝试了这个。我正在使用Pyomo V5.2,Python V3.6.1。

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

对于特定的t,你有没有使用util [i] [t]为零的情况?从表达式中自动删除乘以零的术语,因此我猜测您的错误是由值&#39;值&#39;最终为零,在这种情况下,0&lt; = value&lt; = 1将返回一个普通的布尔值。

解决此问题的最简单方法是将util正式声明为Param组件,并将mutable=True添加到声明中。这向Pyomo发出信号,您可能会更改util参数的值,从而避免自动简化0值。

m.util = Param(m.F, m.T, initialize=util_init, mutable=True)

另一种方法是检查util的值并在整个列为零时跳过约束

def example_rule(model, j, t):
    if not any(util[i][t] for i in model.F):
        return Constraint.Skip
    temp = sum(model.x[j,i]*(util[i][t]) for i in model.F)
    return 0 <= temp <= 1
model.onelateral = Constraint(model.L, model.T, rule=example_rule)

答案 1 :(得分:0)

我通过将约束声明更改为:

来实现它
def example_rule(model,j,t):
    return (0,sum(model.x[j,i]*(util1[i][t]) for i in model.F),1)
model.example = Constraint(model.L, model.T, rule=example_rule)

不幸的是,我不知道为什么这有效,以前没有!