约束条件
大多数约束是使用通过规则创建的等式或不等式表达式来指定的,规则是一个Python函数。例如,如果变量model.x有索引'butter'和'scones',那么这个约束限制这些索引的总和恰好为三:
def teaOKrule(model):
return model.x['butter'] + model.x['scones'] == 3
model.TeaConst = Constraint(rule=teaOKrule)
除了涉及等式(==)或不等式(<= 或 >=)的表达式外,约束也可以使用三元组的形式(lb, expr, ub)来表示,其中 lb 和 ub 可以是 None,这被解释为 lb <= expr <= ub。变量只能出现在中间的 expr 中。例如,以下两个约束声明具有相同的含义:
model.x = Var()
def aRule(model):
return model.x >= 2
model.Boundx = Constraint(rule=aRule)
def bRule(model):
return (2, model.x, None)
model.boundx = Constraint(rule=bRule)
对于这个简单的例子,也可以通过声明model.x并使用bounds选项来实现相同的效果。
约束(和目标)可以通过列表或集合进行索引。当声明中包含列表或集合作为参数时,元素会迭代传递给规则函数。如果有多个列表或集合,则会发送它们的笛卡尔积。例如,以下约束可以解释为在第\(i\)个购买项目上放置预算\(i\),其中每个项目的成本由参数model.a给出:
model.A = RangeSet(1, 10)
model.a = Param(model.A, within=PositiveReals)
model.ToBuy = Var(model.A)
def bud_rule(model, i):
return model.a[i] * model.ToBuy[i] <= i
aBudget = Constraint(model.A, rule=bud_rule)
注意
Python 和 Pyomo 是区分大小写的,所以 model.a 与 model.A 是不同的。