[PYTHON] La puissance des solveurs d'optimisation combinée

Qu'est-ce que c'est

Essayons la puissance (performance) du solveur qui résout le problème d'optimisation en utilisant un problème aléatoire et simple (problème de sac à dos).

Créer un problème de sac à dos aléatoire

Créez un problème de sac à dos [^ 1] avec n articles. La solution optimale est ajustée à environ 80% du nombre total d'articles.

python


import numpy as np
from pulp import *
def make(n):
    np.random.seed(1)
    w = 1 + np.random.rand(n)
    p = w + np.random.randn(n)*0.1
    m = LpProblem(sense=LpMaximize)
    v = [LpVariable('x%d'%i, cat=LpBinary) for i in range(n)]
    m += lpDot(p, v)
    m += lpDot(w, v) <= int(n*1.25)
    return v, m

Vérifiez le temps de calcul

Voyons le temps de calcul tout en modifiant le nombre d'éléments. Le solveur d'optimisation utilise GUROBI 6.51.

python


v, m = make(10000)
%timeit -n 3 m.solve(GUROBI_CMD())
sum(value(x) for x in v)
>>>
3 loops, best of 3: 222 ms per loop
8254.0

python


v, m = make(20000)
%timeit -n 3 m.solve(GUROBI_CMD())
sum(value(x) for x in v)
>>>
3 loops, best of 3: 486 ms per loop
16470.0

python


v, m = make(50000)
%timeit -n 3 m.solve(GUROBI_CMD())
sum(value(x) for x in v)
>>>
3 loops, best of 3: 1.38 s per loop
41237.0

python


v, m = make(100000)
%timeit -n 3 m.solve(GUROBI_CMD())
sum(value(x) for x in v)
>>>
3 loops, best of 3: 2.64 s per loop
82458.0

Résumé

Lorsqu'il y a n éléments, il y a $ 2 ^ n $ choix possibles. Aussi, puisque ce temps de calcul est le temps de trouver la solution exacte, nous étudions (presque) toute cette possibilité [^ 2].

Nombre d'éléments Temps de calcul(Secondes) Nombre de solutions possibles
10000 0.22 2.00 * 10^{3010}
20000 0.49 3.98 * 10^{6020}
50000 1.38 3.16 * 10^{15051}
100000 2.64 9.99 * 10^{30102}

――Le nombre de solutions possibles augmente de façon exponentielle avec le nombre d'éléments. Cependant, le temps de calcul est presque linéaire. «Il a fallu moins de 3 secondes pour découvrir la formidable combinaison de 10 à la 30 000e puissance [^ 3].

Vous pouvez voir à quel point ces solveurs récents sont performants. Cependant, il est à noter que les performances peuvent être significativement dégradées en fonction du type de problème d'optimisation de combinaison et de la méthode de formulation.

Le problème du sac à dos est NP-complet, mais vous pouvez voir la haute performance du solveur même dans le problème de correspondance de poids maximum avec la classe P (Comparaison des solutions dans le problème de correspondance de poids. 7fd199a95d78a6f3b741)).

référence

c'est tout

[^ 1]: Le problème du sac à dos est un problème NP difficile et on pense qu'il n'y a pas de solution de l'ordre du polymorphisme, mais il peut être résolu efficacement par un solveur. [^ 2]: Nous trouvons une solution dans laquelle la différence de rapport est inférieure ou égale à ε par rapport à la valeur de la fonction objectif de la solution optimale exacte. Par défaut, il semble être ε = 0,0001 (Référence Note sur la programmation d'entiers). [^ 3]: Même le nombre d'atomes dans l'univers est d'environ 10 $ ^ {80} $, ce qui est beaucoup plus petit.

Recommended Posts

La puissance des solveurs d'optimisation combinée
Trouver la main de "Millijan" par l'optimisation des combinaisons
Minimisez le nombre de polissages en optimisant la combinaison
Juger la finition du mahjong par l'optimisation des combinaisons
Le pouvoir des pandas: Python
Décidons la conférence de PyCon JP 2016 par optimisation de combinaison
Décidons la position du service d'incendie par optimisation combinée
Paver la route avec l'optimisation des combinaisons
Méthode de planification des expériences et optimisation des combinaisons
Résolution des problèmes de sac à dos avec les outils OR de Google - Pratiquer les bases des problèmes d'optimisation combinée
Utiliser l'optimisation des combinaisons
Problème de fractionnement typique de la combinaison de problèmes
Résolution du problème N Queen avec l'optimisation continue / combinée
Résolution du problème N Queen avec l'optimisation des combinaisons
Le début de cif2cell
○○ Résolution de problèmes dans le département de mathématiques avec optimisation
le zen de Python
L'histoire de sys.path.append ()
Optimisation du regroupement par combinaison
Lisez la puissance du compteur intelligent avec M5StickC (édition BP35C0-J11-T01)
La vengeance des types: la vengeance des types
Découvrez la puissance de l'accélération avec NumPy / SciPy
(Peut-être) Vous n'avez pas encore exploité la vraie puissance de tmux
Grattage du résultat de "Schedule-kun"
L'histoire de la construction de Zabbix 4.4
Vers la retraite de Python2
Enquête Star avec optimisation des combinaisons
Comparez les polices de jupyter-themes
Jeux de regroupement avec optimisation des combinaisons
Expliquez le code de Tensorflow_in_ROS
Réutiliser les résultats du clustering
Optimisation combinée avec recuit quantique
GoPiGo3 du vieil homme
Calculez le nombre de changements
Changer le thème de Jupyter
La popularité des langages de programmation
Changer le style de matplotlib
Visualisez la trajectoire de Hayabusa 2
À propos des composants de Luigi
Composants liés du graphique
Filtrer la sortie de tracemalloc
À propos des fonctionnalités de Python
Simulation du contenu du portefeuille