Как отобразить разные индексы в Pyomo? - PullRequest
0 голосов
/ 29 декабря 2018

Я новый пользователь 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'"

Я знаю, что это неправильный путь, поэтому мне интересно, есть ли хороший способ отобразить их отношения.Заранее спасибо!

Габриэль

1 Ответ

0 голосов
/ 11 января 2019

Я просто забыл опубликовать свой ответ на свой вопрос, когда решил это неделю назад.Ключевым моментом в решении этой проблемы является настройка индекса карты.

Позвольте мне просто изменить код в вопросе.Во-первых, нам нужно изменить фрейм данных, включив в него информацию о сопоставленных индексах.Затем можно построить набор для сопоставленного индекса, используя в качестве примера 2 сопоставленных индекса:

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

Имена двух сопоставленных индексов - «альфа» и «бета» соответственно.Затем можно сформулировать ограничение на основе переменных, объявленных в начале:

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 с набором сопоставленных индексов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...