参数

“参数”这个词在许多场合中使用。在讨论Pyomo模型时,我们使用这个词来指代必须提供的数据,以便找到决策变量的最优(或良好)值分配。参数被声明为Param类的实例,该类接受的参数与Set类有些相似。例如,以下代码片段声明了集合model.Amodel.B,然后声明了一个由model.Amodel.B索引的参数model.P

model.A = pyo.RangeSet(1,3)
model.B = pyo.Set()
model.P = pyo.Param(model.A, model.B)

除了用作索引的集合外,Param 还接受以下选项:

  • default = 参数值在没有其他指定时的默认值。

  • doc = 描述参数的字符串。

  • initialize = 一个函数(或Python对象),用于返回初始化参数值所需的数据。

  • mutable = 布尔值,指示在参数初始化后是否允许更改参数值。

  • validate = 一个回调函数,该函数接收模型、提议的值以及提议值的索引;如果值有效则返回 True。返回 False 将生成一个异常。

  • within = 用于验证的集合;它指定了有效参数值的域。

这些选项的执行方式与Set相同。例如,给定model.A的值为{1, 2, 3},那么有许多方法可以创建一个表示主对角线上有9、16、25,其他地方为零的方阵的参数,以下是两种方法。首先使用Python对象进行初始化:

v={}
v[1,1] = 9
v[2,2] = 16
v[3,3] = 25
model.S1 = pyo.Param(model.A, model.A, initialize=v, default=0)

现在使用一个初始化函数,该函数会自动为每个索引元组调用一次(请记住,我们假设model.A包含{1, 2, 3}

def s_init(model, i, j):
    if i == j:
        return i*i
    else:
        return 0.0
model.S2 = pyo.Param(model.A, model.A, initialize=s_init)

在这个例子中,索引集包含整数,但索引集不必是数字。使用字符串是非常常见的。

注意

在输入文件中指定的数据将覆盖由initialize选项指定的数据。

参数值可以通过验证函数进行检查。在以下示例中,参数T(由model.A索引)的每个值都被检查是否大于3.14159。如果提供的值小于该值,模型实例化将被终止并发出错误消息。验证函数应编写为如果数据有效则返回True,否则返回False

t_data = {1: 10, 2: 3, 3: 20}

def t_validate(model, v, i):
    return v > 3.14159

model.T = pyo.Param(model.A, validate=t_validate, initialize=t_data)

这个例子将产生以下错误,表明为 T[2] 提供的值未能通过验证:

Traceback (most recent call last):
  ...
ValueError: Invalid parameter value: T[2] = '3', value type=<class 'int'>.
    Value failed parameter validation rule