Pyomo:从json存档中加载三维集数据错误:无法为具有索引集的组件建立索引

时间:2019-12-13 11:46:32

标签: python pyomo

在pyomo库的抽象模型中,我有三个不同的Set,每个Set取决于前一个Set,并且具有不同的尺寸大小。

model.V = pyo.Set()
model.P = pyo.Set(model.V)
model.m = pyo.Set(model.V, model.P)

当我尝试从JSON文件加载Set值时,引发以下异常:

TypeError: Cannot index a component with an indexed set

这是JSON文件中的代码:

{
"V" : [1, 2, 3],
"P" : {"1": [1, 2],
       "2": [1, 2, 3],
       "3": [1]},
"m" : {"1": [{"1": [1, 2],
              "2": [1, 2, 3, 4]}],
       "2": [{"1": [1],
              "2": [1, 2],
              "3": [1, 2, 3]}],
       "3": [{"1": [1, 2, 3, 4, 5, 6]}]}
}

我认为问题是由于JSON文件中的m定义所致,因为回溯将我带到了model.m = pyo.Set(model.V, model.P)行。

我已经检查过documentation of Pyomo Data Portals,但没有3D JSON数据的信息。

有人知道3维m集定义中的哪个错误吗?

2 个答案:

答案 0 :(得分:0)

我没有引起异常的根本原因,但这不是由于数据引起的。 您可以通过创建AbstractModel而不传递任何数据来轻松验证这一点:

from pyomo import environ as pyo

def create_model():
    model = pyo.AbstractModel()
    model.V = pyo.Set()
    model.P = pyo.Set(model.V)
    model.m = pyo.Set(model.P)
    return model

通过create_model呼叫TypeError: Cannot index a component with an indexed set已失败。注意,我什至从model.V的索引中删除了model.m

我不确定为什么不允许使用索引集来索引另一个组件(我尝试索引一个参数,但它也失败了)。 This reply from one of the core developers明确声明这是一个设计决定。

话虽这么说,以我的经验来看,您有95%的时间使用索引集,但您可以找到一种更直接的解决方案,根本不需要索引集。 我不知道您要建模/解决什么问题,但是有一个集合(m索引了一个集合(V)和一个索引了索引本身的索引集(PV看起来很复杂。 您可能可以将其移动到类似(3D)矩阵的表示法中。

如果您需要更多支持,请分享您将在这些集合上建立索引的数据的样子(json文件的内容应该可以)。

答案 1 :(得分:0)

我解决了我的问题的错误。我发现您必须证明集合的所有可能索引。

这是集合定义

model.V = pyo.Set()
model.P = pyo.Set(dimen=2)
model.m = pyo.Set(dimen=3)

这是JSON文件:

{
"V" : [1, 2],
"P" : [[1, 1], [1, 2],
       [2, 1], [2, 2]],
"m" : [[1, 1, 1], [1, 1, 2],
       [1, 2, 1],
       [2, 1, 1], [2, 1, 2],
       [2, 2, 1]]
}