1
votes

Comment lire les valeurs des variables dans Python cplex api?

J'ai modélisé un problème MIP dans l'API Python Cplex. Existe-t-il un moyen de lire les valeurs des variables - au niveau des variables?

Actuellement, je lis les valeurs des variables dans une liste et je mappe celles du fichier LP "

    for i, j in zip(cpx.variables.get_names(), cpx.solution.get_values()):
        cplex_details_inp.append((i, j))

Par ceci méthode, je suis capable de lire toutes les valeurs des variables à la fois, mais cette méthode pose des problèmes de mémoire en raison du fait qu'il y a 500k variables.

Comment lire les valeurs de manière variable? Je ne trouve aucun document ou exemple spécifique à ce sujet.


0 commentaires

3 Réponses :


3
votes
for i in cpx.variables.get_names():
           cplex_details_inp.append([i,cpx.solution.get_values(i)])
This code could help.

2 commentaires

Merci pour la réponse ... mais c'est encore la même chose que je fais maintenant. La taille de ma liste ne diminuera pas et rencontrera le même problème de mémoire. J'essaie de lire les valeurs de manière variable au lieu de lire toutes les valeurs dans une seule liste.


La lecture des valeurs du pool de solutions (comme indiqué ci-dessus) prendra également beaucoup de temps pour obtenir chaque valeur.



1
votes

En regardant le documentation de référence nous pouvons voir qu'il existe différentes options pour appeler cette fonction:

  • solution.get_values ​​() renvoie les valeurs de toutes les variables du problème.
  • solution.get_values ​​(i) Je dois être un nom ou un index de variable. Renvoie la valeur de la variable dont l'index ou le nom est i.
  • solution.get_values ​​(s) s doit être une séquence de noms de variables ou d'indices. Renvoie les valeurs des variables avec des indices les membres de s. Équivalent à [solution.get_values ​​(i) pour i en s]
  • solution.get_values ​​(début, fin) begin et end doivent être des indices de variables ou des noms de variables. Renvoie les valeurs des variables avec des indices entre le début et la fin, y compris la fin. Equivalent à solution.get_values ​​(range (begin, end + 1)).

Vous pouvez donc spécifier comme argument de la fonction uniquement les variables dont vous souhaitez lire les variables. Soit spécifiez les variables une par une, soit lisez les variables par blocs.


2 commentaires

Merci @Daniel Junglas, cela a fonctionné mais en utilisant cette méthode, le problème de mémoire a été résolu, mais cela prend beaucoup de temps. Le modèle précédent prenait 75 minutes, mais il prend maintenant plus de 3 heures pour les variables de 5,6 L.


Deux choses peuvent accélérer cela: 1. Essayez d'interroger autant de variables que possible en un seul appel. Il peut être préférable de créer d'abord une liste de toutes les variables pour lesquelles vous souhaitez interroger la valeur, puis de clal get_values ​​() seulement une fois avec cette liste. 2. N'interrogez pas les variables par nom. Recherchez-les par index.



0
votes

Toutes vos variables sont-elles des non-néros? Dans le cas où votre vecteur de solution est clairsemé, ce qui suit peut résoudre le problème de mémoire :

cplex_details_inp = [[i, cpx.solution.get_values(i)] for i in cpx.variables.get_names() if round(cpx.solution.get_values(i), precision) > 0]

Par rapport à ajouter à une liste tous les temps, cela pourrait même accélérer le processus. Pour traiter de très petites variables comme des zéros, vous pouvez utiliser round():

cplex_details_inp = [[i, cpx.solution.get_values(i)] for i in cpx.variables.get_names() if cpx.solution.get_values(i) > 0]


0 commentaires