我想为变量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)
我不确定这是正确的做法
谢谢
答案 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]])