2016-10-07 2 views
0

Je voudrais obtenir les suffixes .rc ou .urc pour mes variables du solveur cplex, en utilisant Pyomo avec l'interface NL/ASL. Cette interface est généralement plus rapide que l'interface cplex par défaut pour mes modèles. Cependant, je n'arrive pas à obtenir l'interface NL pour retourner ces suffixes. Si j'utilise le solveur cplex avec les options par défaut, j'obtiens des valeurs pour le suffixe rc. Cependant, si j'utilise solver_io = 'nl' ou que je mets le solveur à 'cplexamp' (ce que je pense faire la même chose), alors je n'obtiens aucune valeur rc. (Je suis en mesure d'obtenir duales, mais pas rc de.)Réception du suffixe .rc de cplex lors de l'utilisation de Pyomo avec l'interface de résolution NL/ASL

Voici quelques exemples de code:

from pyomo.environ import * 
from pyomo.opt import SolverFactory 

def show_rc(m, *args, **kwargs): 
    opt = SolverFactory(*args, **kwargs) 
    results = opt.solve(m, suffixes=['rc']) 
    m.solutions.load_from(results) 
    m.rc.pprint() 

m = ConcreteModel() 
m.X = Var(bounds=(0, 1)) 
m.obj = Objective(rule=lambda m: 3.14 * m.X, sense=maximize) 
m.rc = Suffix(direction=Suffix.IMPORT, datatype=Suffix.FLOAT) 

show_rc(m, "cplex")     # has value 3.14 
show_rc(m, "cplex", solver_io="nl") # no value returned 
show_rc(m, "cplexamp")    # no value returned 

Les documentation mentionne spécifiquement obtenir une réduction des coûts par un suffixe, et le suffixe .rc semble être la norme place pour cela dans AMPL, mais je n'ai pas de chance en lisant cela via l'interface NL de Pyomo. Est-ce que quelqu'un peut-il me montrer la bonne direction?

Répondre

1

Malheureusement, l'exécutable cplexamp ne renvoie pas de coûts réduits dans le fichier de solution (je viens de vérifier). Je suppose que AMPL doit les calculer en utilisant la solution double qui est retournée. Je voudrais ouvrir un ticket sur GitHub. Peut-être pouvons-nous ajouter cette fonctionnalité à notre interface ASL.

En termes de rapidité, vous devriez essayer l'interface Python basée sur Python pour Cplex (solver_io = "python"). Ceci est généralement beaucoup plus rapide car il ne nécessite aucune E/S de fichier. Vous devrez installer les liaisons Cplex-Python avant de pouvoir utiliser cette interface via Pyomo. Si vous pouvez "importer cplex", alors il devrait être bon d'y aller.

Editer: J'ai oublié de mentionner que solver_io = "python" renvoie des coûts réduits pour Cplex.

+0

Merci beaucoup pour votre aide. J'ai essayé l'interface python, mais j'ai trouvé que c'était beaucoup plus lent. Pour une petite version de mon vrai modèle, l'étape 'opt.solve()' prend 5.0 secondes avec 'solver_io =" nl "', 5.3 secondes sans 'solver_io' spécifié, ou 22 secondes avec solver_io =" python ". Donc je suppose que je vais poster un ticket sur l'interface ASL et laisser solver_io non spécifié pour l'instant. –

+0

Il y avait une correction à l'interface Cplex-Python de Pyomo dans la version 4.3.11323 qui était censée avoir un impact énorme sur les performances (dans le bon sens). Pouvez-vous confirmer que vous n'utilisez pas une version antérieure à cette version? –

+0

Je viens de vérifier, et j'utilisais déjà Pyomo 4.3.11377. J'ai mis à jour à 4.4.1 et les temps se sont améliorés, mais les liaisons python sont toujours lentes. Je viens de publier un problème sur https://github.com/Pyomo/pyomo/issues/51. Encore besoin d'en poster un sur le problème ASL/rc. –