0

Ist es möglich (und wenn ja, wie), eine Zielfunktion zu verwenden, die einen bedingten Ausdruck hat?Pyomo und bedingte Zielfunktion

ändern Beispiel aus den Dokumenten, würde ich einen Ausdruck wie mag:

def objective_function(model): 
    return model.x[0] if model.x[1] < const else model.x[2] 

model.Obj = Objective(rule=objective_function, sense=maximize) 

Kann diese direkt wie folgt modelliert werden oder muss ich eine Art von Transformation betrachten (und wenn ja, wie würde diese aussehen mögen)?

Gerade Ausführung die oben gibt eine Fehlermeldung wie:

Evaluating Pyomo variables in a Boolean context, e.g. 
    if expression <= 5: 
is generally invalid. If you want to obtain the Boolean value of the 
expression based on the current variable values, explicitly evaluate the 
expression using the value() function: 
    if value(expression) <= 5: 
or 
    if value(expression <= 5): 

, die ich denke, weil Pyomo denkt würde Ich mag einen Wert erhalten, anstelle einen Ausdruck mit den Variablen.

Antwort

0

Eine Möglichkeit, dies zu formulieren, ist die Verwendung einer logischen Disjunktion. Sie können die Pyomo.GDP Dokumentation für die Nutzung schauen, aber es würde wie folgt aussehen:

m.helper_var = Var() 
m.obj = Objective(expr=m.helper_var) 
m.lessthan = Disjunct() 
m.lessthan.linker = Constraint(expr=m.helper_var == m.x[0]) 
m.lessthan.constr = Constraint(expr=m.x[1] < const) 
m.greaterthan = Disjunct() 
m.greaterthan.linker = Constraint(expr=m.helper_var == m.x[2]) 
m.greaterthan.constr = Constraint(expr=m.x[1] >= const) 
m.lessthanorgreaterthan = Disjunction(expr=[m.lessthan, m.greaterthan]) 
# some kind of transformation (convex hull or big-M) 

Sie auch diese mit Komplementarität Einschränkungen formulieren können.