Как указано в документации pyomo, BuildAction()
- это тема для продвинутого уровня, и, кроме того, в соответствии с документацией, ее несколько эффективнее построить / решить?ограничения с BuildAction()
.
Пример ограничения, сгенерированного с помощью BuildAction()
:
m.const1 = Constraint([(t, a) for t in m.TIME for a in m.AREA],
noruleinit=True)
def const1_rule(m):
for t in m.TIME:
for a in m.AREA:
lhs = (some_vars_1[t,a])
rhs = (some_vars_2[t,a])
m.const1.add((t,a), (lhs == rhs))
m.const1_build = BuildAction(rule=const1_rule)
Итак, m.const1 = Constraint()
строит ограничение pyomo без какого-либо правила с помощью noruleinit=True
.
Затем m.const1_build = BuildAction()
запускает функцию const1_rule
, и в этой функции ограничения добавляются к m.const1
через .add()
.
Пример ограничения, сгенерированный обычным способом:
def const1_rule(m, t, a):
lhs = (some_vars_1[t,a])
rhs = (some_vars_2[t,a])
return lhs == rhs
m.const1 = Constraint(m.TIME, m.AREA, rule=const1_rule)
ВОПРОСЫ:
Другим применением BuildAction может быть инициализация данных модели Pyomo из структур данных Python или эффективная инициализацияДанные модели Pyomo из других данных модели Pyomo.
1) Каким образом это более эффективно?
2) В чем разница при построении ограничений с BuildAction()
?
3) Должен ли я его использовать, да-нет-почему?
4) Если BuildAction()
лучше, как бы я воспользовался этим?(например, предположим, что существует другой принцип работы BuildAction()
, и, возможно, из-за этого мне не нужно создавать некоторые pyomo Set
s или Param
s.)