Я новый пользователь Pyomo / Python.Теперь мне нужно сформулировать один набор ограничений с индексом «n», где все 3 компонента имеют разные индексы, но соотносятся с индексом «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'"
Я знаю, что это неправильный путь, поэтому мне интересно, есть ли хороший способ отобразить их отношения.Заранее спасибо!
Габриэль