将Pyomo集构建到Python词典中

将Pyomo集构建到Python词典中,python,anaconda,python-3.5,linear-programming,pyomo,Python,Anaconda,Python 3.5,Linear Programming,Pyomo,例如,我想从名为dictOfList的列表的Python词汇表中创建一个Pyomo集的词汇表口述列表构建如下: dictOfList= {} dictOfList[1] = [10,11,12] dictOfList[2] = [20,21] dictOfList[3] = [31,32,33,34] 现在,我希望将值[10,11,12]、[20,21]和[31,32,33,34]放入名为dictofset的Pyomo集合的Python字典中,如下所示: model.dictOfSets =

例如,我想从名为
dictOfList
的列表的Python词汇表中创建一个Pyomo集的词汇表<代码>口述列表构建如下:

dictOfList= {}
dictOfList[1] = [10,11,12]
dictOfList[2] = [20,21]
dictOfList[3] = [31,32,33,34]
现在,我希望将值
[10,11,12]
[20,21]
[31,32,33,34]
放入名为
dictofset
的Pyomo集合的Python字典中,如下所示:

model.dictOfSets = {}
for el in dictOfList:
    model.dictOfSets[el] = Set(initialize=dictOfList[el])
然后,如果我使用另一个简单的for循环显示集合的值:

for el in dictOfList:
    model.dictOfSets[el].display()
似乎这些集合没有正确构建,因为它在运行的控制台中显示:

_unknown_ : Dim=0, Dimen=1, Size=0, Domain=None, Ordered=False, Bounds=None
    Not constructed
_unknown_ : Dim=0, Dimen=1, Size=0, Domain=None, Ordered=False, Bounds=None
    Not constructed
_unknown_ : Dim=0, Dimen=1, Size=0, Domain=None, Ordered=False, Bounds=None
    Not constructed

有没有办法在Python词典中构建Pyomo集?现在,我已经使用了普通的Python列表,但它在更大的模型中导致了很长的处理时间,我知道最好使用Pyomo集,以便在构建约束时获得更快的性能

未完全构造
集合
s,因为它们从未分配给
或模型对象。虽然不完全是您想要的(您实际上不会在模型上得到
集合
dict
),但要获得您想要的效果,最简单的方法是实际创建一个索引的
集合

dictOfList= {}
dictOfList[1] = [10,11,12]
dictOfList[2] = [20,21]
dictOfList[3] = [31,32,33,34]
model.S = Set(dictOfList.keys(), initialize=dictOfList)
如果打印模型(
model.pprint()
),您将获得:

2 Set Declarations
    S : Dim=1, Dimen=1, Size=9, Domain=None, ArraySize=3, Ordered=False, Bounds=None
        Key : Members
          1 : [10, 11, 12]
          2 : [20, 21]
          3 : [31, 32, 33, 34]
    S_index : Dim=0, Dimen=1, Size=3, Domain=None, Ordered=False, Bounds=(1, 3)
        [1, 2, 3]
要实际创建
Set
s的Python
dict
,您还需要将每个
Set
分配给模型,以便正确构造它。类似这样的方法可能会奏效:

model.dictOfSets = {}
for el in dictOfList:
    model.dictOfSets[el] = Set(initialize=dictOfList[el])
    setattr(model, 'dictOfSets_member_%s' % (el,), model.dictOfSets[el])
for el in dictOfList:
    model.dictOfSets[el].display()
给予


编辑:如果显式创建已索引的
集合的
索引,则可以创建更复杂的索引。即:

model.S_IDX = Set(initialize=dictOfList.keys())
model.S = Set(model.S_IDX, initialize=dictOfList)
通过显式创建集合,可以拥有任意复杂的键。请注意,在某些情况下,您可能必须使用
dimen=
关键字显式设置索引集的“维度”:

dictOfList = { (1,2): [10,11,12],
               (2,3): [20,21],
               (1,3): [31,32,33,34],
}
model.S_IDX = Set(initialize=dictOfList.keys(), dimen=2)
model.S = Set(model.S_IDX, initialize=dictOfList)
如果希望元组具有不同的长度,则尤其如此:

dictOfList = { (1,): [10,11,12],
               (2,3): [20,21],
               (1,3,4): [31,32,33,34],
}
model.S_IDX = Set(initialize=dictOfList.keys(), dimen=None)
model.S = Set(model.S_IDX, initialize=dictOfList)
其中
model.pprint()
给出:

2 Set Declarations
    S : Dim=None, Dimen=1, Size=9, Domain=None, ArraySize=3, Ordered=False, Bounds=None
        Key       : Members
             (1,) : [10, 11, 12]
        (1, 3, 4) : [31, 32, 33, 34]
           (2, 3) : [20, 21]
    S_IDX : Dim=0, Dimen=None, Size=3, Domain=None, Ordered=False, Bounds=None
        [(1,), (1, 3, 4), (2, 3)]

未完全构造
集合
s,因为从未将其指定给
或模型对象。虽然不完全是您想要的(您实际上不会在模型上得到
集合
dict
),但要获得您想要的效果,最简单的方法是实际创建一个索引的
集合

dictOfList= {}
dictOfList[1] = [10,11,12]
dictOfList[2] = [20,21]
dictOfList[3] = [31,32,33,34]
model.S = Set(dictOfList.keys(), initialize=dictOfList)
如果打印模型(
model.pprint()
),您将获得:

2 Set Declarations
    S : Dim=1, Dimen=1, Size=9, Domain=None, ArraySize=3, Ordered=False, Bounds=None
        Key : Members
          1 : [10, 11, 12]
          2 : [20, 21]
          3 : [31, 32, 33, 34]
    S_index : Dim=0, Dimen=1, Size=3, Domain=None, Ordered=False, Bounds=(1, 3)
        [1, 2, 3]
要实际创建
Set
s的Python
dict
,您还需要将每个
Set
分配给模型,以便正确构造它。类似这样的方法可能会奏效:

model.dictOfSets = {}
for el in dictOfList:
    model.dictOfSets[el] = Set(initialize=dictOfList[el])
    setattr(model, 'dictOfSets_member_%s' % (el,), model.dictOfSets[el])
for el in dictOfList:
    model.dictOfSets[el].display()
给予


编辑:如果显式创建已索引的
集合的
索引,则可以创建更复杂的索引。即:

model.S_IDX = Set(initialize=dictOfList.keys())
model.S = Set(model.S_IDX, initialize=dictOfList)
通过显式创建集合,可以拥有任意复杂的键。请注意,在某些情况下,您可能必须使用
dimen=
关键字显式设置索引集的“维度”:

dictOfList = { (1,2): [10,11,12],
               (2,3): [20,21],
               (1,3): [31,32,33,34],
}
model.S_IDX = Set(initialize=dictOfList.keys(), dimen=2)
model.S = Set(model.S_IDX, initialize=dictOfList)
如果希望元组具有不同的长度,则尤其如此:

dictOfList = { (1,): [10,11,12],
               (2,3): [20,21],
               (1,3,4): [31,32,33,34],
}
model.S_IDX = Set(initialize=dictOfList.keys(), dimen=None)
model.S = Set(model.S_IDX, initialize=dictOfList)
其中
model.pprint()
给出:

2 Set Declarations
    S : Dim=None, Dimen=1, Size=9, Domain=None, ArraySize=3, Ordered=False, Bounds=None
        Key       : Members
             (1,) : [10, 11, 12]
        (1, 3, 4) : [31, 32, 33, 34]
           (2, 3) : [20, 21]
    S_IDX : Dim=0, Dimen=None, Size=3, Domain=None, Ordered=False, Bounds=None
        [(1,), (1, 3, 4), (2, 3)]

正如您所说,使用行
model.S=Set(dictOfList.keys(),initialize=dictOfList)
是有效的。我还喜欢你如何将场景链接到模型,这将是我的下一个问题。谢谢你的帮助!好吧,我有一个更难的问题:如果我们有一个单词键是元组的情况呢?如果它们都是相同长度的,那么显式地创建S_索引集。我将更新答案,以便获得合理的格式。正如您所说,使用行
model.S=Set(dictOfList.keys(),initialize=dictOfList)
工作正常。我还喜欢你如何将场景链接到模型,这将是我的下一个问题。谢谢你的帮助!好吧,我有一个更难的问题:如果我们有一个单词键是元组的情况呢?如果它们都是相同长度的,那么显式地创建S_索引集。我会更新答案,以便我们可以得到合理的格式。