2016-06-11 2 views
0

J'ai un modèle Pyomo qui a la forme:Pyomo: Comment utiliser le point de données final dans l'objectif d'un modèle abstrait?

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) 

Notez que le m.obj objectif repose sur le paramètre m.T. Tenter d'exécuter ce qui donne l'erreur:

TypeError: unhashable type: 'SimpleParam' 

En utilisant une valeur, comme expr=m.S[120] donne l'erreur:

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

Dans les deux cas, mon objectif est le même: optimiser pour la plus grande valeur possible de S à l'horizon.

Comment puis-je créer un modèle abstrait qui exprime cela?

Répondre

1

Vous frappez sur deux questions un peu différentes:

TypeError: unhashable type: 'SimpleParam' 

est dû à un bogue dans Pyomo 4.3 où vous ne pouvez pas utiliser directement Param simples s comme des indices dans d'autres composants. Cela dit, le correctif pour ce problème particulier ne corrigera pas votre exemple de modèle.

L'astuce pour la fixation de votre déclaration Objective consiste à encapsuler l'expression Objective dans une règle:

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) 

Le problème est que lorsque vous écrivez un modèle abstrait, est que chaque composant déclaré, mais pas défini. Ainsi, le Var S est déclaré exister, mais n'a pas été défini (il s'agit d'un shell vide sans membres). Cela provoque un problème car Python (pas Pyomo) tente de résoudre le m.S[120] à une variable spécifique immédiatement avant d'appeler le constructeur Objective. L'utilisation de règles (fonctions) dans les modèles abstraits vous permet de différer la résolution de l'expression jusqu'à ce que Pyomo construise réellement l'instance du modèle. Pyomo construit les composants de l'instance dans le même ordre que celui que vous avez déclaré sur le modèle Abstract. Les composants précédents (S, T et t) sont tous construits et S a des membres valides aux points connus de la version obj_rule. ContinuousSet (dans ce cas, les limites).