2016-06-11 2 views
0

Ich habe ein Pyomo Modell, das die Form hat:Pyomo: Wie wird der letzte Datenpunkt in einem abstrakten Modell verwendet?

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) 

Beachten Sie, dass das Ziel m.obj verlässt sich auf die Parameter m.T. Der Versuch, dies zu laufen gibt den Fehler:

TypeError: unhashable type: 'SimpleParam' 

Wert verwenden, wie expr=m.S[120] die Fehler gibt:

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

In beiden Fällen ist es mein Ziel ist das gleiche: die Optimierung für den grösstmöglichen Wert von S am Horizont.

Wie kann ich ein abstraktes Modell erstellen, das dies ausdrückt?

Antwort

1

Sie sind auf zwei etwas getrennte Fragen treffen:

TypeError: unhashable type: 'SimpleParam' 

Ist aufgrund eines Fehlers in Pyomo 4.3, wo man nicht direkt einfach Param s als Indizes in andere Komponenten verwenden können. Das heißt, die Fehlerbehebung für dieses spezielle Problem wird Ihr Beispielmodell nicht beheben.

Der Trick Ihre Objective Erklärung zu der Festsetzung des Objective Ausdruck in der Regel kapseln:

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) 

Das Problem ist, dass, wenn Sie ein abstraktes Modell schreiben, jede Komponente nur deklariert wird, aber nicht definiert. Daher wird der Var S als vorhanden deklariert, wurde aber nicht definiert (es ist eine leere Shell ohne Mitglieder). Das verursacht ein Problem, da Python (nicht Pyomo) versucht, das m.S[120] zu einer bestimmten Variablen unmittelbar vor dem Aufrufen des -Konstruktors aufzulösen. Die Verwendung von Regeln (Funktionen) in abstrakten Modellen ermöglicht es Ihnen, die Auflösung des Ausdrucks zu verschieben, bis Pyomo tatsächlich die Modellinstanz konstruiert. Pyomo konstruiert die Instanzkomponenten in der gleichen Reihenfolge, in der Sie sie im Abstract-Modell deklariert haben. Wenn also die S, T und t ausgelöst werden, werden S gültige Member an den bekannten Punkten des ContinuousSet (in diesem Fall die Grenzen).

Verwandte Themen