变量

变量的目的是最终由优化包赋予值。它们被声明并可选择性地被限制,给定初始值,并使用Pyomo的Var函数进行文档化。如果索引集作为参数提供给此函数,它们将用于索引变量。其他可选的指令包括:

  • bounds = 一个函数(或Python对象),它为变量提供(下限,上限)的边界对

  • domain = 变量可以取值的超集。

  • initialize = 一个函数(或Python对象),它为变量提供初始值;这对于非线性模型尤为重要

  • within = (domain 的同义词)

以下代码片段通过声明一个名为model.LumberJack单例(即未索引)变量来说明这些选项的一些方面,该变量将取零到6之间的实数值,并初始化为1.5:

model.LumberJack = Var(within=NonNegativeReals, bounds=(0, 6), initialize=1.5)

代替initialize选项,初始化有时通过Python赋值语句完成,如下所示

model.LumberJack = 1.5

对于索引变量,边界和初始值通常由一个规则(一个Python函数)指定,该规则本身可能引用参数或其他数据。这些规则的正式参数以模型开始,后跟索引。这在以下代码片段中得到了说明,该代码片段使用了声明为lb和ub的Python字典,这些字典由函数用于提供边界:

model.A = Set(initialize=['Scones', 'Tea'])
lb = {'Scones': 2, 'Tea': 4}
ub = {'Scones': 5, 'Tea': 7}


def fb(model, i):
    return (lb[i], ub[i])


model.PriceToCharge = Var(model.A, domain=PositiveIntegers, bounds=fb)

注意

许多预定义的虚拟集用作域时暗示了边界。一个明显的例子是Boolean集,它暗示了零和一的边界。