Pyomo ValueError: 约束表达式无效

8

我正在编写一个带有以下形式约束条件的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个回答

10
你是否有这样的情况,其中对于特定t的所有i,util[i][t]都为零?与零相乘的术语将自动从表达式中删除,因此我猜测你的错误是由'value'最终变成零的情况引起的,在这种情况下,0 <= value <= 1将返回一个平凡的布尔值。
最简单的解决方法是正式声明util为Param组件,并在声明中添加mutable=True。这向Pyomo发出信号,表明您可能会更改util参数的值,从而避免了零值的自动简化。
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)

谢谢@Bethany-Nicholson,那似乎就是问题所在。我不知道该怎么解决它...你有什么想法吗?我尝试过,如果总和为0,则将值设置为1,但它不接受那个值。 - fishy321
这对我来说仍然毫无意义 :-( 在解决了这个特定错误后(使用我下面答案中的方法...我不知道为什么那样会起作用),我遇到了另一个约束问题。但这次,我的答案并没有解决问题。我不明白为什么0个约束会自动被删除?有没有办法关闭这个选项? - fishy321
@fishy321 我编辑了我的答案,展示了两种可能的修复方法。 - Bethany Nicholson

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)

很遗憾,我不知道为什么这个有效而之前的没有!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接