Algorithmes gloutons
Temps de lecture10 minEn bref
Résumé de l’article
Dans cet article, vous allez découvrir les algorithmes gloutons. Ces algorithmes sont des algorithmes heuristiques qui visent à approximer la solution d’un problème complexe. Pour ce faire, ils considèrent un problème d’optimisation global, et approximent sa solution en résolvant une série de sous-problèmes localement optimaux.
Points clés à retenir
-
Les algorithmes gloutons approximent une solution globale avec une série de solutions locales.
-
Le choix d’une telle optimisation locale est une heuristique.
-
Par exemple, un algorithme glouton pour approximer le TSP peut utiliser l’heuristique “toujours aller vers le voisin non visité le plus proche”.
-
Sur certains problèmes spécifiques, un algorithme glouton peut être optimal.
Contenu de l’article
Vidéo
Veuillez consulter la vidéo ci-dessous (en anglais, affichez les sous-titres si besoin). Nous fournissons également une traduction du contenu de la vidéo juste après, si vous préférez.
Information
Pour aller plus loin
Quand un algorithme glouton est-il optimal ?
Vous avez déjà rencontré des algorithmes gloutons optimaux, parfois sans le savoir :
- L’algorithme de Dijkstra (séance 3) choisit à chaque étape le sommet non exploré le plus proche de la source, et ne revient jamais sur ce choix. Avec des poids positifs, ce choix local est toujours le bon.
- Les algorithmes de Prim et de Kruskal construisent un arbre couvrant de poids minimal en ajoutant à chaque étape l’arête la plus légère possible : parmi celles qui ne créent pas de cycle pour Kruskal, et parmi celles qui étendent l’arbre en construction pour Prim.
- La planification d’intervalles : pour choisir le plus grand nombre possible de réunions qui ne se chevauchent pas, il suffit de prendre à chaque fois celle qui se termine le plus tôt (voir la vidéo dans la section suivante).
Pour prouver qu’un algorithme glouton est optimal, on utilise souvent un argument d’échange : on part d’une solution optimale quelconque, et on montre qu’on peut la transformer, sans la rendre moins bonne, en une solution qui fait le même premier choix que l’algorithme glouton. En répétant l’argument choix après choix, on obtient que la solution gloutonne est elle aussi optimale.
Attention, l’argument donné dans la vidéo pour le rendu de monnaie (chaque pièce vaut au moins le double de la précédente) ne suffit pas en général. Avec des pièces de 1, 4 et 9 centimes, cette condition est vérifiée, et pourtant, pour rendre 12 centimes, l’algorithme glouton rend $9 + 1 + 1 + 1$ (quatre pièces), alors que $4 + 4 + 4$ n’en utilise que trois. Les systèmes de pièces pour lesquels l’algorithme glouton est toujours optimal sont appelés canoniques, et c’est heureusement le cas des euros. Pour vérifier qu’un système est canonique, il n’est pas nécessaire de tester toutes les sommes : s’il existe une somme pour laquelle l’algorithme glouton n’est pas optimal, il en existe une plus petite que la somme des deux plus grandes pièces (Kozen et Zaks, 1994).
Quelle garantie pour le plus proche voisin ?
Pour le TSP, l’algorithme glouton du plus proche voisin n’est pas optimal. Mais à quel point peut-il se tromper ?
-
Sans hypothèse sur le graphe, il peut être aussi mauvais qu’on le souhaite. Prenons quatre sommets $s$, $a$, $b$ et $c$, avec $d(s, a) = 1$, $d(a, b) = 1$, $d(s, c) = 2$, $d(a, c) = 2$, $d(s, b) = 3$, et $d(b, c) = M$ très grand. Depuis $s$, l’algorithme glouton va en $a$, puis en $b$, et doit finir par l’arête de poids $M$ : son chemin a une longueur $M + 2$. Le chemin $(s, c, a, b)$, lui, a une longueur de 5. En augmentant $M$, le rapport entre les deux devient aussi grand qu’on le veut.
-
Si le graphe vérifie l’inégalité triangulaire, ce qui est le cas des méta-graphes PyRat (voir l’article sur le TSP), un tel piège n’est plus possible. On sait alors que le chemin glouton est au pire de l’ordre de $\log(n)$ fois plus long que le chemin optimal, pour $n$ sommets (Rosenkrantz, Stearns et Lewis, 1977), et qu’on ne peut pas garantir mieux en général.
En pratique, l’algorithme glouton fait bien mieux que ce pire cas : dans l’activité pratique, vous mesurerez qu’il fait de l’ordre de 10 à 20% de tours en trop dans un labyrinthe PyRat.
Un algorithme glouton avec une garantie
Il existe un algorithme simple, construit à partir d’un algorithme glouton, qui garantit un chemin au plus deux fois plus long que l’optimal, lorsque le graphe vérifie l’inégalité triangulaire :
- Calculer un arbre couvrant de poids minimal du méta-graphe, par exemple avec l’algorithme glouton de Prim.
La méthode
minimum_spanning_tree()de la classeGraphde PyRat le fait pour vous, avec l’algorithme de Prim. - Parcourir cet arbre en profondeur depuis la position de départ, et visiter les morceaux de fromage dans l’ordre où le parcours les découvre.
Pourquoi cela fonctionne-t-il ?
- Le chemin optimal passe par tous les sommets sans cycle : c’est donc lui-même un arbre couvrant. Son poids est donc au moins celui de l’arbre couvrant de poids minimal.
- Un parcours en profondeur de l’arbre emprunte chaque arête deux fois (une fois à l’aller, une fois au retour) : sa longueur est donc au plus deux fois le poids de l’arbre.
- Visiter les sommets dans l’ordre de découverte revient à prendre des raccourcis dans ce parcours, ce qui, grâce à l’inégalité triangulaire, ne peut pas l’allonger.
Le chemin obtenu est donc au plus deux fois plus long que l’arbre, et donc au plus deux fois plus long que le chemin optimal. L’algorithme de Christofides, présenté dans l’article sur le TSP, améliore cette garantie à 1,5 fois l’optimal pour les tournées, au prix d’un calcul plus complexe.
Pour aller encore plus loin
-
Voici quelques exemples de problèmes où les algorithmes gloutons peuvent être appliqués. Cet article est également une ressource intéressante pour en savoir plus sur les algorithmes gloutons en détail.
-
Une vidéo sur l’application des algorithmes gloutons à un problème particulier.










