Pyomo:从 json 存档加载三维集数据 错误:无法使用索引集为组件编制索引



在pyomo库的抽象模型中,我有三个不同的集合,每个集合都取决于前一个集合,并且具有不同的维度大小。

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

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

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)行。

我已经检查了 Pyomo 数据门户的文档,但我没有得到 3D JSON 数据的信息。

有谁知道 3 维 m 集的定义中的错误是什么?

我没有异常的根本原因,但这不是由于数据。 您可以通过创建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.m的索引中删除了model.V

我不确定为什么不允许使用索引集来索引另一个组件(我尝试索引参数,但它也失败了(。一位核心开发人员的回复清楚地表明这是一个设计决策。

话虽如此,根据我的经验,95% 的情况下,您使用索引集时,您可以找到一个根本不需要索引集的更直接的解决方案。 我不知道你在建模/解决什么问题,但是将一个集合(m(索引在一个集合(V(和一个索引集(P(上索引,它本身被索引V看起来过于复杂。 你可以把它移动到一个(3D(矩阵状的符号或类似的东西。

如果您需要更多支持,请分享您将在这些集合上索引的数据(json 文件内容应该没问题(。

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

这是集合定义

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]]
}

最新更新