2016-06-11 3 views
0

У меня есть модель Pyomo, которая имеет вид:Pyomo: Как использовать конечную точку данных в объекте абстрактной модели?

from pyomo.environ import * 
from pyomo.dae import * 

m  = AbstractModel() 
m.t = ContinuousSet(bounds=(0,120)) 
m.T = Param(default=120) 
m.S = Var(m.t, bounds=(0,None)) 
m.Sdot = DerivativeVar(m.S) 
m.obj = Objective(expr=m.S[120],sense=maximize) 

Обратите внимание, что цель m.obj опирается на параметр m.T. Попытка запустить это дает ошибку:

TypeError: unhashable type: 'SimpleParam' 

Используя значение, например expr=m.S[120] выдает ошибку:

ValueError: Error retrieving component S[120]: The component has not been constructed. 

В обоих случаях моя цель состоит в том же: оптимизировать для наибольшего возможного значения от S на горизонте.

Как создать абстрактную модель, которая выражает это?

ответ

1

Вы ударяют по двум несколько отдельных вопросов:

TypeError: unhashable type: 'SimpleParam' 

ли из-за ошибки в Pyomo 4.3, где вы не можете напрямую использовать простые Param S в качестве индексов других компонентов. Тем не менее, исправление для этой конкретной проблемы не устранит вашу примерную модель.

Хитрость фиксации вашего Objective декларации является инкапсуляция выражение Objective внутри правила:

def obj_rule(m): 
    return m.S[120] 
    # or better yet: 
    # return m.S[m.T] 
    # or 
    # return m.S[m.t.last()] 
m.obj = Objective(rule=obj_rule,sense=maximize) 

Проблема заключается в том, что когда вы пишете абстрактную модель, каждый компонент только будучи объявлен, но не . Итак, Var S объявлен как существующий, но не определен (это пустая оболочка без элементов). Это вызывает проблему, поскольку Python (а не Pyomo) пытается разрешить m.S[120] конкретной переменной непосредственно перед вызовом конструктора Objective. Использование правил (функций) в абстрактных моделях позволяет отложить разрешение выражения до тех пор, пока Pyomo фактически не построит экземпляр модели. Pyomo конструирует компоненты экземпляра в том же порядке, что и вы объявили их в абстрактной модели, поэтому, когда он запускает obj_rule, все компоненты (S, T и t) сконструированы и S имеет действительные члены в известных точках ContinuousSet (в данном случае, границы).

Смежные вопросы