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

时间:2018-06-19 14:37:45

标签: arrays linear-programming variable-declaration pyomo

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

2 个答案:

答案 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      -    +    +    +