用字典的求和值初始化pyomo参数

时间:2018-08-04 13:44:24

标签: python dictionary parameters initialization pyomo

我有一个pyomo参数,我想用python字典的值进行初始化。

字典(示例)如下所示:

dict
{('A', 'B', 'x', 'y'): 100, 
 ('A', 'C', 'x', 'y'): 10, 
 ('D', 'E', 'x', 'y'): 20,
 ('D', 'A', 'x', 'y'): 1}

并且我的参数由ABCD索引。

我想要实现的是创建一个参数,并使用以下值初始化:m.param[A] = 110m.param[B] = 0m.param[C] = 0m.param[D] = 21

m.param= pyomo.Param(
    m.index, # this has indexes {A,B,C,D}
    initialize= #sum???
    mutable=True)

PS:我不是要用m.param创建initialize=0,然后用for-loop设置值。而是使用initialize=some_command为正确的索引设置正确的值。

这样的事情(它不起作用,我使用pandas系列,而不是dict。但要讲到重点):

m.param = pyomo.Param(
    m.index,
    initialize=sum(dict_df.loc[m.index]),
    mutable=True)

2 个答案:

答案 0 :(得分:0)

initialize带有签名(parent_block, *indices)的函数。

也就是说,对于m.param = Param(m.index, initialize=init_func),您希望拥有:

mydict = {
    ('A', 'B', 'x', 'y'): 100, 
    ('A', 'C', 'x', 'y'): 10, 
    ('D', 'E', 'x', 'y'): 20,
    ('D', 'A', 'x', 'y'): 1}

def init_func(m, idx):
    return sum(val for tup, val in mydict.items() if tup[0] == idx)

答案 1 :(得分:-1)

部分答案:

以下操作有效,但仅当dict_df是熊猫obj时有效。我仍在寻找纯Python字典的方法。

m.param = pyomo.Param(
    m.index,
    default=dict_df.groupby(level=0).sum().to_dict(),
    mutable=True)

结果是initialize给出了一些错误,default更好。