如何在 Pyomo 中声明由集合数组中的子集索引的参数/变量?



在 Pyomo 中,可以使用以下命令声明一个集合数组(一组集合或由另一个集合索引的子集((根据文档(:

model.A=Set()
model.B=Set()
model.C=Set(model.B, within=model.A)

我想知道如何声明一个变量或参数,由抽象模型中集合数组中的一个(子(集索引?例如,如何声明由两个模型索引的参数"model.d"。B 和模型。C[型号。B],其中模型中的每个元素。B 标识模型的子集。一个?

当我这样声明时:

model.d=Param(model.B, model.C[model.B])

我收到一个错误,说:

ValueError: Error retrieving component C[B]: The component has not been constructed.

如果我理解正确,简单地model.d=Param(model.B, model.C)可能是你要找的。

看起来您正在使用AbstractModel。我知道很多例子都使用抽象模型,但通常ConcreteModel行为对于刚起步的人来说更直观。您的用例是否涉及使用不同的数据多次求解相同的模型结构?

我声明了一个包含元组(i,j(的二维集合,而不是索引一个集合。第一个索引 i 是指索引集(模型。B( 和第二个索引 j 是指子集的元素(模型中的 j。C[i](。

因此,我的代码是:

model.A = Set()
model.B = Set()
model.C = Set(dimen=2)
model.d = param(model.C)

我加载模型的数据。C 作为set_array,即带有 + 和 - 的矩阵。参数 model.d 现在在两个集合上编制索引:model。B 和模型的子集。一个:

data.load(filename='Sets.xlsx',range='C',using='xlsx',format="set_array", set=model.C)

加载的表如下所示:

SetC   b1   b2   b3   b4
a1      +    -    -    +
a2      +    +    +    -
a3      -    +    +    +

最新更新