КАК ПОДВЕСТИ ИТОГ В НАБОРЕ СТРОК В PYOMO

#string #sum #set #pyomo

Вопрос:

У меня есть ограничение,которое я назвал Prod_H2, и оно зависит от (i, s). Это уравнение имеет сумму некоторых переменных, FIJ (i,j) и FIK (i,k).

 ***i=['U4241', 'U241', 'U241A']
HN_model.i=Set(initialize=[(len(i))])
j=['U4283', 'U283', 'U283A', 'U3283', 'U2280', 'U1280']
HN_model.j=Set(initialize=[(len(j))])
k=['PSA4241', 'PSA241', 'PSA241A', 'PSA3241']
HN_model.k=Set(initialize=[(len(k))])
s=[1]
HN_model.s=Set(initialize=range(len(s)))

HN_model.FIJ=Var(HN_model.i, HN_model.j, HN_model.s,domain=PositiveReals)
HN_model.FIW=Var(HN_model.i, HN_model.s, within=PositiveReals)
HN_model.FIK=Var(HN_model.i, HN_model.k, HN_model.s,within=PositiveReals)***

HN_model.Prod_H2=Constraint(HN_model.i, HN_model.s, expr=sum(HN_model.FIJ[i,j] for j in [len(HN_model.j)])   sum(HN_model.FIK for k in [len(HN_model.k)])   HN_model.FIW)
 

Я думаю, что ошибка заключается в том, что сумма находится в j, чтобы уравнение оставалось в функции i.

Ошибка разработчика: Внутренняя ошибка реализации Pyomo: «Неизвестная проблема, возникшая при попытке получить индекс для компонента FIJ» Пожалуйста, сообщите об этом разработчикам Pyomo.

Комментарии:

1. Я думаю, что ваши наборы и ограничения построены неправильно. Почему вы используете len() везде? Взгляните на некоторые примеры, которые я опубликовал с pyomo тегом для некоторых идей. прокомментируйте/отредактируйте свой пост, если вы все еще застряли.

Ответ №1:

Как сказал @AirSquid в своем комментарии, вы неправильно строите модель. Во-первых, Pyomo позволяет индексировать любой тип данных, int , float , str или даже datetime . Таким образом, нет никаких проблем с использованием фактических значений вашего списка i , j , k и s . Вам не нужно использовать len для построения набора или индекса ограничений

Итак, у вас есть некоторые ошибки в моделировании, помимо предыдущих комментариев. Я постараюсь показать тебе:

  1. В моделировании ограничений у вас нет знака равенства или неравенства. В pyomo вам нужно использовать знак равенства/неравенства ( == , <= или >= ) или использовать другой класс для моделирования такого равенства или неравенства ( pyomo.environ.Expression.inequality(2, model.x) эквивалентно 2 <= model.x )
  2. Когда вы объявляете переменные, вы моделируете переменные с некоторым индексом и вызываете их в ограничении с меньшим индексом. Например: HN_model.FIJ моделируется с помощью индекса i,j,s , но вы используете i,j индекс в ограничении

Наконец, я призываю вас, как сказал вам AirSquid, проверить несколько примеров того, как правильно моделировать задачи оптимизации с помощью Pyomo. Если вам нужна какая-либо помощь, StackOverflow всегда рядом.

Я оставляю вам пример того, как смоделировать проблему, которую вы только что опубликовали

 from pyomo.environ import *
#set the model
HN_model = ConcreteModel()
i=['U4241', 'U241', 'U241A']
HN_model.i=Set(initialize=i)
j=['U4283', 'U283', 'U283A', 'U3283', 'U2280', 'U1280']
HN_model.j=Set(initialize=j)
k=['PSA4241', 'PSA241', 'PSA241A', 'PSA3241']
HN_model.k=Set(initialize=k)
s=[1]
HN_model.s=Set(initialize=s)

HN_model.FIJ=Var(HN_model.i, HN_model.j, HN_model.s,domain=PositiveReals)
HN_model.FIW=Var(HN_model.i, HN_model.s, within=PositiveReals)
HN_model.FIK=Var(HN_model.i, HN_model.k, HN_model.s,within=PositiveReals)

def constraint(HN_model, i, s):
    '''Constraint modeling. I assume you are using the >='''
    return sum(HN_model.FIJ[i,j,s] for j in HN_model.j)   sum(HN_model.FIK[i,k,s] for k in HN_model.k)   HN_model.FIW[i,s] >= 0
HN_model.Prod_H2=Constraint(HN_model.i, HN_model.s, rule=constraint)
 

Комментарии:

1. Большое спасибо!