Que faire face à un problème difficile ? Frédéric Meunier 23 novembre 2016 Ecole des Ponts, France Contexte Soit le problème suivant, avec X fini. Min f (x) s.c. x ∈ X . Exemples 1. X est l’ensemble des s-t chemins d’un graphe avec une longueur ≥ 0 associée à chaque arc, et f (x) est la longueur du chemin x. 2. X est l’ensemble des couplages parfaits d’un graphe biparti, dont les arêtes sont pondérées, et f (x) est le poids total d’un couplage x. 3. X est l’ensemble des cycles hamiltoniens d’un graphe pondéré, et f (x) est le poids d’un cycle hamiltonien x. Résoudre ? Pour le moment, nous avons vu le cas des problèmes polynomiaux, et nous avons donné des algorithmes qui les résolvent. C’est le cas des deux premiers problèmes, mais pas du troisième. Les problèmes industriels sont souvent NP-difficiles. Que fait-on dans ces cas là ? Quelques méthodes Si on veut un algorithme rapide, mais ne donnant pas forcément la solution optimale : heuristique ou métaheuristique (algorithme approché) Si on veut un algorithme donnant la solution optimale, mais sans être nécessairement rapide algorithme exact Branch-and-Bound Description Branch-and-Bound On dispose d’une “borne inférieure” λ : P(X ) → R qui a toute partie Y de X , associe λ(Y ) ≤ min f (x). x∈Y On suppose que λ se calcule “facilement” (par exemple, en temps polynomial). L’algorithme maintient I une collection Y de parties de X telle que minimum de f (x) sur X I la meilleure solution courante x̃. S Y contient un Idée principale. On peut se débarrasser de Y ∈ Y si λ(Y ) ≥ f (x̃). Itération On part d’une solution réalisable quelconque x̃. Une itération est 1. Choisir une partie Y de Y. 2. Partitionner Y en parties Y10 , Y20 , . . . , Ys0 . 3. Supprimer Y de Y. 4. Faire pour i = 1, . . . , s : • si l’on trouve directement y ∈ Yi0 minimisant f (y) et si f (y) < f (x̃), poser x̃ := y • si λ(Yi0 ) < f (x̃), poser Y := Y ∪ {Yi0 }. Calcul d’une solution réalisable On trouve directement y ∈ Yi0 minimisant f (y) par exemple • quand Yi0 est un singleton, ou • quand par chance le calcul de λ(Yi0 ) fournit une solution dans Yi0 (cas de la PLNE et de la relaxation linéaire ci-après). Schéma en arbre probl eme de minimisation de f sur X X λ(Y ) ≤ minx∈Y f (x) pour tout Y ⊆ X Y1 Y2 Y3 Y4 Y20 Y10 x̃ si λ(Y10 ) ≥ f (x̃), il ne sert a rien d’explorer cette région. Y5 Y30 meilleure solution courante Performances Les perfomrances seront d’autant plus grandes que la borne est de bonne qualité : pour un problème de minimsation, plus elle grande, plus elle permettra de “couper”. La façon de choisir et partitionner Y (le branchement) est également d’une grande importance. Exemple : programmation linéaire en nombres entiers La programmation linéaire en nombre entiers (PLNE) se modélise, avec A une matrice m × n à coefficients rationnels, et b ∈ Qm et c ∈ Qn Min s.c. c·x Ax ≤ b x ∈ Zn . Contrairement à la programmation linéaire usuelle, ce problème est NP-difficile. Application du branch-and-bound pour la PLNE Une borne inférieure à la valeur optimale vplne d’un PLNE s’obtient en relâchant la contrainte d’intégrité : Min s.c. c·x Ax ≤ b x ∈ Rn , et notons vpl sa valeur optimale. On a vplne ≥ vpl . Exemple Min s.c. x1 + 5x2 4x1 − 2x2 ≤ 13 2x1 + 8x2 ≥ 11 x1 , x2 ∈ Z. On commence par résoudre ce programme en ne demandant que x1 , x2 ∈ R (on relâche la contrainte d’intégrité). On obtient : x1 = 3, 5; x2 = 0, 5; v = 6. On “branche alors sur x1 ” : Min s.c. x1 + 5x2 4x1 − 2x2 ≤ 13 2x1 + 8x2 ≥ 11 x1 ≤ 3 x1 , x2 ∈ Z. Min s.c. x1 + 5x2 4x1 − 2x2 ≤ 13 2x1 + 8x2 ≥ 11 x1 ≥ 4 x1 , x2 ∈ Z. Tout l’algorithme En commençant toujours par la branche de gauche. x1 = 3, 5 x2 = 0, 5 v=6 x1 ≤ 3 x1 ≥ 4 x1 = 3 x2 = 0, 625 v = 6, 125 x2 ≥ 1 x1 = 1, 5 x2 = 1 v = 6, 5 x1 ≥ 2 x2 ≤ 0 Non réalisable x1 ≤ 1 x1 = 1 x2 = 1, 125 v = 6, 625 x1 = 2 x2 = 1 v=7 x2 ≥ 2 x1 = −2, 5 x2 = 2 v = 7, 5 abandon x2 ≤ 1 Non réalisable x1 = 4 x2 = 1, 5 v = 11, 5 abandon Remarques sur la PLNE Pour la PLNE, on choisit souvent de brancher sur la variable la “moins” entière, en partant du nœud de l’arbre pour lequel la relaxation est la meilleure. En pratique : ne jamais reprogrammer un branch-and-bound pour la PLNE. Il existe de nombreux solvers – libres ou payants – extrêmement performants. Exemple de solver libre : GLPK. Heuristiques et métaheuristiques Heuristiques Heuristique = algorithme ad hoc pour un problème donné, qui donne en général de bonnes solutions pour le problème. On demande souvent aux heuristiques d’être rapide. Il n’y a pas de méthode générale pour les concevoir. Exemple : plus proche voisin pour le voyageur de commerce. Métaheuristiques Métaheuristique = méthode générique qui peut s’appliquer à la plupart des problèmes. On distingue deux grandes familles : les recherches locales et les métaheuristiques à population. Recherche locale On part d’une bonne solution réalisable de départ (trouvée par heuristique par exemple). On essaie d’améliorer la solution courante en procédant à des “modifications” locales. Exemple : coloration de graphe Soit G = (V , E) un graphe, k un entier. Trouver la coloration c : V → [k ] telle que le nombre d’arêtes uv avec c(u) = c(v) soit minimal. I I Colorer arbitrairement G avec k couleurs. Répéter : • Chercher une arête monochromatique dont la modification de couleur d’une de ses extrémités conduit à diminuer le nombre total d’arêtes monochromatiques ; • Si une telle arête existe, faire cette modification. • Sinon, c’est fini. Recherche locale : version naïve I Partir d’une solution réalisable x. I Répéter : S’il existe une modification locale qui permette d’améliorer x, exécuter cette modification locale et appeler x cette nouvelle solution. Problème. Minimum local ! Méthode tabou Objectif. Éviter de plonger trop vite vers un minimum local. Idée. Maintenir une liste L de solutions réalisables tabous de taille constante. I I Partir d’une solution réalisable x. Répéter : S’il existe une modification locale qui permette d’améliorer x sans générer une solution dans L : I I I I mettre x à la fin de L exécuter cette modification locale, appeler x cette nouvelle solution retirer le premier élément de la liste L On retourne la meilleure solution visitée. Problème. Minimum local ! (mais meilleur) Recuit simulé Objectif. Éviter de plonger trop vite vers un minimum local. Idée. Tirer au hasard la modification locale ; accepter une solution moins bonne, avec une probabilité qui décroît au cours du temps I I Partir d’une solution réalisable x. Répéter : I I I Tirer au hasard la modification locale. Soit y la solution obtenue par celle-ci. Si y est meilleure : exécuter cette modification locale et appeler x cette nouvelle solution. Sinon, exécuter cette modification locale avec une certaine probabilité et appeler x cette nouvelle solution. On retourne la meilleure solution visitée. Problème. Minimum local ! (mais meilleur) Exemple de probabilité On veut une probabilité décroissante en fonction du temps et de |f (x) − f (y)|. f est la fonction objectif. Exemple typique : à la ième itération, accepter y quand f (y) > f (x) avec probabilité e avec Ti de la forme − f (y)−f (x) Ti Ti = T0 β i ou Tk := 1 α + si . Autres métaheuristiques Algorithmes évolutionnaires : • solution réalisable = chromosome. • on maintient une population de chromosomes. • on autorise les chromosomes à se croiser avec une probabilité d’autant plus grande que les chromosomes sont de qualité. • les chromosomes peuvent muter. • les plus mauvais chromosomes meurent, laissant la taille de la population constante Crucial : codage d’une solution réalisable sur un chromosome, nature du croisement (qui doit maintenir les avantages compétitifs de ses parents). Autres métaheuristiques Colonie de fourmis : • une population de fourmis explore l’espace des solutions. • une fourmi dépose d’autant plus de phéromones qu’elle a visité récemment une bonne solution. • une fourmi va privilégier des explorations dans des régions plus marquées par les phéromones. • les phéromones s’évaporent au bout d’un moment. Evaluation Ces métaheuristiques ne dispensent pas d’évaluation scientifique de la qualité de la solution. En particulier, I par le calcul de bornes. I par l’expérimentation sur des familles d’instances.