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.
3 Réponses :
for i in cpx.variables.get_names(): cplex_details_inp.append([i,cpx.solution.get_values(i)]) This code could help.
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.
En regardant le documentation de référence nous pouvons voir qu'il existe différentes options pour appeler cette fonction:
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.
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.
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]