我正在编写一个具有以下形式约束的 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。

提前谢谢你的帮助。

最佳答案

你有没有 util[i][t] 在所有 i 对于特定 t 的情况下为零?乘以零的项会自动从表达式中删除,所以我猜你的错误是由“值”最终为零的情况引起的,在这种情况下 0
解决此问题的最简单方法是将 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)

关于python - Pyomo 值错误 : Invalid constraint expression,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45616967/

10-12 17:18