在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的定义,因为Traceback将我带到了model.m = pyo.Set(model.V, model.P)
行。
我已经检查了documentation of Pyomo Data Portals,但是没有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.V
。
我不确定为什么不允许使用索引集来索引另一个组件(我尝试索引一个参数,但它也失败了)。 model.m
明确声明这是设计决定。
话虽这么说,以我的经验,您有95%的时间使用索引集,但您可以找到一种更直接的解决方案,根本不需要索引集。我不知道您要建模/解决什么问题,但是让一个集合(This reply from one of the core developers)在一个集合(m
)上建立索引,而一个索引集合(V
)本身在P
上建立索引,则看起来太复杂了。您可能可以将其移动到类似(3D)矩阵的表示法中。
如果需要更多支持,请共享您将在这些集合上建立索引的数据的样子(json文件的内容应该可以。)>]