使用 pyomo 的集合定义矩阵的正确方法
Proper way to define a matrix using pyomo's sets
我得到了一个 pyomo 确定性优化模型,我已使用随机配置方法将其转换为随机模型。
但是,我在保存输出时遇到了问题。我已经定义了随机节点的数量(状态变量值的数量)
m.particle_number = Param(initialize = count)
m.K = Set(initialize = range(1,value(m.particle_number)+1))
在此之后,模型定义了一系列长度为 m.n 的列表,其中评估模型的点数。这是一个例子。
position_phi = list(range(0,value(m.n)+1))
我需要将这些一维列表转换为 m.K
维度。我试着写
position_phi = list(range(0,value(m.n)+1), range(0,value(m.K)+1))
相反。但是,我收到以下错误:
TypeError: Cannot evaluate object with unknown type: SimpleSet
有人可以向我解释为什么我不能构造大小为 m.n*m.k 的矩阵吗?
我不完全清楚你的模型试图做什么,但你可以在 Pyomo 中通过将两者相乘来创建两个集合的叉积。
import pyomo.environ as pe
m = pe.ConcreteModel()
m.K = pe.Set(initialize=[1, 2, 3])
m.n = pe.Set(initialize=[4, 5, 6, 7])
m.position_phi = m.K * m.n
这将使 m.position_phi
的元素成为 [(1, 4), (1, 5), ...]
然后您可以按如下方式使用此集合:
m.whatever = pe.Param(m.position_phi, intitialize={(1, 4):4, (3, 6):6}, default=0)
然后当您调用 m.pprint()
时,您会看到如下内容:
3 Set Declarations
K : Dim=0, Dimen=1, Size=3, Domain=None, Ordered=False, Bounds=(1, 3)
[1, 2, 3]
n : Dim=0, Dimen=1, Size=4, Domain=None, Ordered=False, Bounds=(4, 7)
[4, 5, 6, 7]
position_phi : Dim=0, Dimen=2, Size=12, Domain=None, Ordered=False, Bounds=None
Virtual
1 Param Declarations
whatever : Size=12, Index=position_phi, Domain=Any, Default=0, Mutable=False
Key : Value
(1, 4) : 4
(3, 6) : 6
4 Declarations: K n position_phi whatever
此外,在 Python 中使用超过 1 个参数调用 list()
应该会抛出 TypeError。
我得到了一个 pyomo 确定性优化模型,我已使用随机配置方法将其转换为随机模型。
但是,我在保存输出时遇到了问题。我已经定义了随机节点的数量(状态变量值的数量)
m.particle_number = Param(initialize = count)
m.K = Set(initialize = range(1,value(m.particle_number)+1))
在此之后,模型定义了一系列长度为 m.n 的列表,其中评估模型的点数。这是一个例子。
position_phi = list(range(0,value(m.n)+1))
我需要将这些一维列表转换为 m.K
维度。我试着写
position_phi = list(range(0,value(m.n)+1), range(0,value(m.K)+1))
相反。但是,我收到以下错误:
TypeError: Cannot evaluate object with unknown type: SimpleSet
有人可以向我解释为什么我不能构造大小为 m.n*m.k 的矩阵吗?
我不完全清楚你的模型试图做什么,但你可以在 Pyomo 中通过将两者相乘来创建两个集合的叉积。
import pyomo.environ as pe
m = pe.ConcreteModel()
m.K = pe.Set(initialize=[1, 2, 3])
m.n = pe.Set(initialize=[4, 5, 6, 7])
m.position_phi = m.K * m.n
这将使 m.position_phi
的元素成为 [(1, 4), (1, 5), ...]
然后您可以按如下方式使用此集合:
m.whatever = pe.Param(m.position_phi, intitialize={(1, 4):4, (3, 6):6}, default=0)
然后当您调用 m.pprint()
时,您会看到如下内容:
3 Set Declarations
K : Dim=0, Dimen=1, Size=3, Domain=None, Ordered=False, Bounds=(1, 3)
[1, 2, 3]
n : Dim=0, Dimen=1, Size=4, Domain=None, Ordered=False, Bounds=(4, 7)
[4, 5, 6, 7]
position_phi : Dim=0, Dimen=2, Size=12, Domain=None, Ordered=False, Bounds=None
Virtual
1 Param Declarations
whatever : Size=12, Index=position_phi, Domain=Any, Default=0, Mutable=False
Key : Value
(1, 4) : 4
(3, 6) : 6
4 Declarations: K n position_phi whatever
此外,在 Python 中使用超过 1 个参数调用 list()
应该会抛出 TypeError。