析取三种方式

时间:2018-10-02 13:53:00

标签: pyomo

我想为变量q设置一个约束。

(q <= -5) or (q == 0) or (q >= 5)

最好的编码方式是什么?

def _d (disjunct, flag):
    model = disjunct.model()
    if flag == -1:
        disjunct.c = Constraint (expr=model.q <= -5)
    elif flag == 0:
        disjunct.c = Constraint (expr=model.q == 0)
    else:
        disjunct.c = Constraing (expr.model.q >= 5)

model.d = Disjunct ([-1,0,1], rule=_d)

def _c (model):
    return [model.d[-1], model.d[0], model.d[1]
model.c = Disjunction (rule=_c)

我不确定这是正确的做法

谢谢

2 个答案:

答案 0 :(得分:1)

现在有更简单的语法,很快将在Pyomo在线文档中进行更新。

假设您已定义model.q,则可以执行以下操作: model.c = Disjunction(expr=[[model.q <= 5], [model.q == 0], [model.q >= 5]])

答案 1 :(得分:1)

有很多定义析取的方法。最后,您要最终定义3个Disjunct块,并用一个Disjunction链接它们。您的方法肯定是有效的(并且对于抽象模型和具体模型都有好处)。还有许多其他方法可以达到相同的最终状态,包括:

1)明确的具体析取(仅限具体模型):

model.d = Disjunct([-1,0,1])
model.d[-1].c = Constraint (expr=model.q <= -5)
model.d[0].c = Constraint (expr=model.q == 0)
model.d[1].c = Constraint (expr=model.q >= 5)
model.c = Disjunction(expr=[model.d[i] for i in (-1,0,1)])

1a)明确的未索引混凝土析取物(仅适用于混凝土模型):

model.d1 = Disjunct()
model.d1.c = Constraint (expr=model.q <= -5)
model.d2 = Disjunct()
model.d2.c = Constraint (expr=model.q == 0)
model.d3 = Disjunct()
model.d3.c = Constraint (expr=model.q >= 5)
model.c = Disjunction(expr=[model.d1, model.d2, model.d3])

2)隐式析取(具体模型或抽象模型;自Pyomo 5.5起):

def _c(m):
    return [m.q <= -5, m.q == 0, m.q >= 5]
model.c = Disjunction(rule=_c)

3)隐式析取(仅混凝土;自Pyomo 5.5起)

model.c = Disjunction(expr=[model.q <= -5, model.q == 0, model.q >= 5])

请注意,与@ qi-chen的答案一样,您可以将每个Disjunct的约束包含在另一个列表中(允许您为每个disjunct指定多个约束):

model.c = Disjunction(expr=[[model.q <= -5, model.r <= -4],
                            [model.q == 0, model.r == 0],
                            [model.q >= 5, model.r >= 4]])