0

Est-il possible (et si oui comment) d'utiliser une fonction objectif qui a une expression conditionnelle?Pyomo et fonction objectif conditionnelle

Changer l'exemple de la documentation, je voudrais une expression comme:

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) 

peut-il être modélisé directement comme ceci ou dois-je envisager une sorte de transformation (et si oui, comment ce regard comme)?

Juste exécuter ce qui précède donne un message d'erreur comme:

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): 

que je pense parce que Pyomo pense que je voudrais obtenir une valeur, au lieu d'une expression à la variable.

Répondre

0

Une façon de formuler cela en utilisant une disjonction logique. Vous pouvez regarder dans la documentation Pyomo.GDP pour l'utilisation, mais il ressemblerait à ceci:

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) 

Vous pouvez également formuler cela en utilisant des contraintes de complémentarité.