在 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 - + + +