#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 для построения набора или индекса ограничений
Итак, у вас есть некоторые ошибки в моделировании, помимо предыдущих комментариев. Я постараюсь показать тебе:
- В моделировании ограничений у вас нет знака равенства или неравенства. В
pyomo
вам нужно использовать знак равенства/неравенства (==
,<=
или>=
) или использовать другой класс для моделирования такого равенства или неравенства (pyomo.environ.Expression.inequality(2, model.x)
эквивалентно2 <= model.x
) - Когда вы объявляете переменные, вы моделируете переменные с некоторым индексом и вызываете их в ограничении с меньшим индексом. Например:
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. Большое спасибо!