2017-01-04 1 views
1

Ich bin ziemlich neu in Pyomo und ich versuche, die Zielfunktion und eine Einschränkung meines Modells mit mehreren Methoden zu schreiben. Eigentlich möchte ich die objektive Funktion/Abhängigkeit auf der Grundlage verschiedener Beiträge verschiedener Objekttypen konstruieren, die in verschiedenen Python-Skripten implementiert sind.In Pyomo, ist es möglich, eine objektive Funktion oder eine Beschränkung basierend auf mehreren Ausdrücken zu schreiben?

Dafür habe ich pyomo Expression-Objekte verwendet. Ich weiß nicht, ob dies das richtige Objekt ist.

meine Frage zu verdeutlichen, hier ist eine Ausführungsbeispielcode, was ich tun möchte:

import pyomo.environ 
model = pyomo.environ.ConcreteModel() 

model.market = pyomo.environ.Set(initialize=['market']) 

model.ask_price = pyomo.environ.Param(model.market, initialize={'market' : 12}) 
model.bid_price = pyomo.environ.Param(model.market, initialize={'market' : 10}) 
model.ask_liquidity = pyomo.environ.Param(model.market, initialize={'market' : 100}) 
model.bid_liquidity = pyomo.environ.Param(model.market, initialize={'market' : 100}) 

model.VOLUME_BUY = pyomo.environ.Var(model.market, within = pyomo.environ.NonNegativeReals) 
model.VOLUME_SELL = pyomo.environ.Var(model.market, within = pyomo.environ.NonNegativeReals) 

def max_buy(model, market): 
    return model.VOLUME_BUY[market] <= model.ask_liquidity[market] 

model.max_buy_equation = pyomo.environ.Constraint(model.market, rule=max_buy) 

def max_sell(model, market): 
    return model.VOLUME_SELL[market] <= model.bid_liquidity[market] 

model.max_sell_equation = pyomo.environ.Constraint(model.market, rule=max_sell) 

ich dann versuche, meine Zielfunktion zu implementieren. Wenn ich versuche, es im Grunde zu implementieren, funktioniert alles richtig:

def total_objective(model): 
    return sum(model.VOLUME_BUY[market] * model.ask_price[market] for market in model.market) \ 
      - sum(model.VOLUME_SELL[market] * model.bid_price[market] for market in model.market) 

model.objective = pyomo.environ.Objective(rule=total_objective, sense=-1) 

Aber wenn ich versuche, Ausdruck Objekte zu verwenden:

def objective_component1(model): 
    return sum(model.VOLUME_BUY[market] * model.ask_price[market] for market in model.market) 

model.obj_component1 = pyomo.environ.Expression(rule=objective_component1) 

def objective_component2(model): 
    return - sum(model.VOLUME_SELL[market] * model.bid_price[market] for market in model.market) 

model.obj_component2 = pyomo.environ.Expression(rule=objective_component2) 

model.objective = pyomo.environ.Objective(rule=model.obj_component1 + model.obj_component2, sense=-1) 

Ich erhalte eine Fehlermeldung:

ValueError: No value for uninitialized NumericValue object VOLUME_BUY[market] 

ich auch versuchen um den Ausdruck wie folgt zu schreiben:

obj1 = sum(model.VOLUME_BUY[market] * model.ask_price[market] for market in model.market) 
obj2 = - sum(model.VOLUME_SELL[market] * model.bid_price[market] for market in model.market) 
model.objective = pyomo.environ.Objective(rule=obj1 + obj2, sense=-1) 

Aber ich bekomme den gleichen Fehler.

Ich verstehe nicht, warum ich eine nicht initialisierte Fehlermeldung für ein variables Objekt erhalten. Vielleicht ist der Ausdruck pyomo object nicht das richtige Objekt, um meine Zielfunktion zu konstruieren?

Beachten Sie, dass ich auch die Balance-Einschränkung meines Modells mit verschiedenen Ausdrücken konstruieren möchte und es mir auch nicht gelingt.

Ich benutze Python 2.7 und pyomo 4.4.1.

Vielen Dank im Voraus für Ihre Hilfe!

Antwort

1

Ich glaube, das Problem besteht darin, dass Sie das Schlüsselwort rule verwenden, um das Objective-Objekt zu initialisieren. Sie müssen dies nur tun, wenn Sie mit einem AbstractModel beginnen (oder eine indizierte Komponente deklarieren). Da Pyomo-Ausdrücke aufrufbar sind, unterscheidet sie nicht, was Sie von einer Standardfunktion übergeben (also ruft sie auf, erwartet, dass sie einen Ausdruck zurückgibt, evaluiert aber nur den Ausdruck).

Ändern rule= zu expr= sollte Dinge beheben.

+0

Danke Gabe, es löst effektiv das Problem! –

Verwandte Themen