约束条件

大多数约束是使用通过规则创建的等式或不等式表达式来指定的,规则是一个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.amodel.A 是不同的。