如何在Pyomo中映射不同的索引?

时间:2018-12-29 03:36:37

标签: optimization modeling pyomo

我是Pyomo / Python的新用户。现在,我需要用索引“ n”来表达一组约束,其中所有三个组成部分都具有不同的索引,但是与索引“ n”相关。我很好奇如何映射这些集合之间的关系。

在我的情况下,我读取了csv文件,其中其索引与“ n”相关,以生成我的集合。例如:a1.n1,a2.n3,a3.n5 /// b1.n2,b2.n4,b3.n6,b4.n7 /// c1.n1,c2.n2,c3.n4,c4.n6 ///。索引n1和n2的约束表达式如下:

对于n1:P(a1.n1)+ L(c1.n1)== D(n1)
对于n2:-F(b1.n2)+ L(c2.n2)== D(n2)

现在让我们开始编码。设置的创建代码如下,它们在一个类中:

import pyomo
import pandas
import pyomo.opt
import pyomo.environ as pe

class MyModel:

    def __init__(self, Afile, Bfile, Cfile):
        self.A_data = pandas.read_csv(Afile)
        self.A_data.set_index(['a'], inplace = True)
        self.A_data.sort_index(inplace = True) 
        self.A_set = self.A_data.index.unique()

        ... ...

然后我尝试在约束构造中映射关系,如下所示:

    def createModel(self):

        self.m = pe.ConcreteModel()

        self.m.A_set = pe.Set( initialize = self.A_set )

        def obj_rule(m):
            return ...
        self.m.OBJ = pe.Objective(rule = obj_rule, sense = pe.minimize)

        def constr(m, n)
            As = self.A_data.reset_index()
            Amap = As[ As['n'] == n ]['a']
            Bs = self.B_data.reset_index()
            Bmap = Bs[ Bs['n'] == n ]['b']
            Cs = self.C_data.reset_index()
            Cmap = Cs[ Cs['n'] == n ]['c']

            return sum(m.P[(p,n)] for p in Amap) - sum(m.F[(s,n)] for s in Bmap) + sum(m.L[(r,n)] for r in Cmap) == self.D_data.ix[n, 'D']
        self.m.cons = pe.Constraint(self.m.D_set, rule = constr)

    def solve(self):
        ... ...

最后,运行此命令时会引发错误:

KeyError: "Index '(1, 1)' is not valid for indexed component 'P'"

我知道这是错误的方法,所以我想知道是否有一种很好的方法来映射他们之间的关系。预先感谢!

Gabriel

1 个答案:

答案 0 :(得分:1)

一个星期前解决此问题时,我只是忘了发表我对自己问题的回答。解决此问题的关键是设置地图索引。

让我修改问题中的代码。首先,我们需要修改数据框以包含映射索引的信息。然后,可以构造映射索引集,以2个映射索引为例:

self.m.A_set = pe.Set( initialize = self.A_set, dimen = 2 )

两个映射索引的名称分别为'alpha'和'beta'。然后可以根据开头声明的变量来制定约束条件:

def constr(m, n)
    Amap = self.A_data[ self.A_data['alpha'] == n ]['beta']
    Bmap = self.B_data[ self.B_data['alpha'] == n ]['beta']
    return sum(m.P[(i,n)] for i in Amap) + sum(m.L[(r,n)] for r in Bmap) == D.loc[n, 'D']
m.TravelingBal = pe.Constraint(m.A_set, rule = constr)

求和将所有关联的B到A都映射为索引集。