在Pyomo中,可以使用以下命令(根据文档)声明一组数组(一组由另一组索引的子集或子集):
model.A=Set()
model.B=Set()
model.C=Set(model.B, within=model.A)
我想知道如何声明一个变量或参数,该变量或参数将由抽象模型的集合数组中的(子)集合之一索引吗?例如,如何声明由model.B和model.C [model.B]都索引的参数“ model.d”,其中model.B中的每个元素都标识model.A的子集?
当我这样声明时:
model.d=Param(model.B, model.C[model.B])
我收到一条错误消息:
ValueError: Error retrieving component C[B]: The component has not been constructed.
答案 0 :(得分:0)
如果我的理解正确,那么简单地model.d=Param(model.B, model.C)
就是您想要的。
您似乎也正在使用AbstractModel
。我知道很多示例都使用抽象模型,但是对于刚起步的人来说,ConcreteModel
的行为通常更直观。您的用例是否涉及用不同的数据多次解决相同的模型结构?
答案 1 :(得分:0)
我声明了一个包含元组(i,j)的二维集,而不是对一个集进行索引。第一个索引i指的是索引集(模型B),第二个索引j指的是子集的元素(model.C [i]中的j)。
因此我的代码是:
model.A = Set()
model.B = Set()
model.C = Set(dimen=2)
model.d = param(model.C)
我将model.C的数据加载为set_array,即带有+和-的矩阵。现在,将参数model.d分为两组索引:model.B和model.A的子集:
data.load(filename='Sets.xlsx',range='C',using='xlsx',format="set_array", set=model.C)
加载的表格如下所示:
SetC b1 b2 b3 b4
a1 + - - +
a2 + + + -
a3 - + + +