我是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
答案 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都映射为索引集。