Pyomo: Loading three dimension set data from json archive error: Cannot index a component with an indexed set
Pyomo: Loading three dimension set data from json archive error: Cannot index a component with an indexed set
在 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 定义,因为 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.m
.
的索引中删除了 model.V
我不确定为什么不允许使用索引集来索引另一个组件(我尝试索引参数但它也失败了)。 明确指出这是设计决定。
也就是说,根据我的经验,95% 的情况下您使用索引集,您可以找到更直接的解决方案,根本不需要索引集。
我不知道你是什么问题 modeling/solving,但是有一个集合 (m
) 在一个集合 (V
) 和一个索引集合 (P
) 上索引,它本身是indexed over 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]]
}
在 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 定义,因为 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.m
.
model.V
我不确定为什么不允许使用索引集来索引另一个组件(我尝试索引参数但它也失败了)。
也就是说,根据我的经验,95% 的情况下您使用索引集,您可以找到更直接的解决方案,根本不需要索引集。
我不知道你是什么问题 modeling/solving,但是有一个集合 (m
) 在一个集合 (V
) 和一个索引集合 (P
) 上索引,它本身是indexed over 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]]
}