Aller au contenu principal

GRASP et colonies de fourmis

Ce que ce chapitre apporte6 points
  • Expliquer en quoi répéter une construction au hasard diffère de retoucher une solution, et pourquoi ni GRASP ni les fourmis n'entrent dans le squelette chercher.
  • Écrire une construction gloutonne randomisée par liste restreinte de candidats, et dire ce que règle son paramètre alpha.
  • Enchaîner construction et recherche locale (GRASP), et mesurer l'effet de alpha : diversité des tournées, coût d'une répétition, résultat à budget égal.
  • Décrire une fourmi : la probabilité de choisir le trou suivant (phéromone et visibilité), le dépôt proportionnel à la qualité, l'évaporation.
  • Lire ce que la mémoire collective a retenu, et dire ce que changent alpha, bêta, l'évaporation et le nombre de fourmis.
  • Comparer GRASP, les fourmis, le recuit et les redémarrages à budget égal, sur plusieurs graines, et dire ce qui gagne et ce qui perd.
Chez Valdrome Mécanique, la règle du plus proche voisin du chapitre 4 est une recette : pour la plaque P-217, elle rend toujours la même tournée, 692,06 mm, et n'apprend rien de ses erreurs. Les chapitres suivants ont changé de méthode : une solution complète, qu'on retouche sans fin par la descente, le recuit ou le tabou. Ce chapitre prend un troisième chemin, qui ne retouche rien. Il garde l'idée de construire une tournée trou après trou, laisse au hasard une part du choix, et recommence. Deux manières d'en tirer parti. GRASP améliore chaque construction par une recherche locale et ne garde que la meilleure : il n'a aucune mémoire. Les colonies de fourmis laissent après chaque construction une trace qui guide les suivantes : leur mémoire est collective. Le chapitre mesure ce que chacune apporte, à budget égal avec les méthodes précédentes, et dit sans détour où elles gagnent et où elles perdent.

Reconstruire plutôt que retoucher

Le plus proche voisin du chapitre 4 est une règle sans hésitation : depuis un trou, elle va au plus proche. Aux égalités près, que le nom du trou départage, elle rend la même tournée à chaque exécution. Les chapitres 5, 6 et 7 ont gardé cette tournée comme point de départ et l'ont retouchée : une solution courante, un voisin tiré ou examiné, une décision de s'y déplacer.

Il y a une autre manière d'employer le hasard : ne plus retoucher, et recommencer à construire. Il suffit de rendre la règle moins catégorique. Au lieu du trou le plus proche, un trou tiré parmi les trous proches. Chaque exécution donne alors une tournée différente, plausible, dont la longueur varie d'un tirage à l'autre : la règle n'est plus une réponse, c'est une loi de tirage sur les tournées. Reste la vraie question du chapitre : que faire de ces tirages successifs ?

Deux réponses.

  • GRASP ne garde rien. Chaque tournée tirée est aussitôt améliorée par une recherche locale, comme au chapitre 5, puis le tirage suivant repart de zéro. Seule la meilleure tournée rencontrée survit.
  • Les colonies de fourmis gardent une trace. Une tournée tirée dépose une quantité de « phéromone » sur les arêtes qu'elle emprunte, d'autant plus grande qu'elle est courte, et les tirages suivants penchent vers les arêtes chargées. La mémoire n'est pas une solution : c'est une matrice de nombres, partagée par toutes les fourmis.

Une construction est bon marché. Sur P-217 elle examine 78 candidats (douze trous possibles au premier pas, puis onze, et ainsi de suite jusqu'à un), sur la plaque de soixante trous 1 830. Comme aux chapitres 6 et 7, le budget se compte en évaluations : un candidat examiné, ou un voisin évalué par une descente, compte pour une. C'est ce qui permettra de comparer honnêtement.

MéthodeCe qui reste d'un pas à l'autreCe qui se répète
Descente, recuit (chapitres 5 et 6)une solution courantetirer un voisin, l'accepter ou non
Tabou (chapitre 7)une solution courante et une liste d'interditsexaminer tout le voisinage
GRASPrien, sauf la meilleure tournée vueconstruire au hasard guidé, puis descendre
Fourmisune matrice de phéromoneconstruire m tournées guidées par la matrice, puis la mettre à jour
Deux alpha
Les deux méthodes ont un paramètre nommé alpha, et ce n'est pas le même. Dans GRASP, alpha est un nombre entre 0 et 1 qui règle la largeur de la liste des trous acceptables. Dans une colonie, alpha est un exposant qui règle le poids de la phéromone dans le choix d'une fourmi. Le texte écrit « alpha de la liste » quand une confusion est possible ; dans le code, chaque alpha est le paramètre de sa propre fonction.

GRASP : un glouton dont le choix est tiré au hasard

La liste restreinte

GRASP est l'acronyme anglais de Greedy Randomized Adaptive Search Procedure, « procédure de recherche gloutonne, randomisée et adaptative ». Chaque mot dit un morceau de la méthode. Gloutonne : elle construit un élément à la fois, en préférant ce qui paraît le mieux. Randomisée : ce « mieux » n'est pas appliqué à la lettre, le hasard choisit parmi les bons candidats. Adaptative : la liste des bons candidats est recalculée à chaque pas, d'après ce qui est déjà posé. Procédure de recherche : le tout est suivi d'une recherche locale, et répété.

Liste restreinte de candidats

À chaque pas de la construction, chaque trou restant est un candidat, dont le coût est sa distance au dernier trou percé (au départ de l'outil, pour le premier pas). Soient cmin⁡c_{\min} et cmax⁡c_{\max} le plus petit et le plus grand de ces coûts. Pour un réel α\alpha entre 0 et 1, la liste restreinte regroupe les candidats dont le coût est au plus

cmin⁡+α (cmax⁡−cmin⁡)c_{\min} + \alpha\,(c_{\max} - c_{\min})

Le trou percé est tiré au hasard dans cette liste, chaque trou avec la même probabilité.

Le paramètre alpha se lit comme un curseur. À 0, la liste ne garde que le plus proche : c'est la règle du chapitre 4, avec le même départage des égalités. À 1, elle garde tous les trous restants : c'est un ordre tiré au hasard. Entre les deux, plus alpha est grand, plus la liste est longue et plus le tirage est libre. Attention à l'échelle : la liste se mesure en fraction de l'écart cmax⁡−cmin⁡c_{\max} - c_{\min} des candidats qui restent, et cet écart vaut souvent plusieurs centaines de millimètres sur la grande plaque. Les valeurs de alpha qui comptent sont donc petites, quelques centièmes.

Une répétition de GRASP est une construction suivie de la descente 2-opt au meilleur voisin du chapitre 5, depuis la tournée construite, jusqu'à un optimum local. GRASP fait autant de répétitions que le budget en permet, et rend la meilleure tournée. Il n'y a ni solution courante ni voisin tiré : la construction fait l'exploration, la recherche locale fait la retouche.

Une répétition, pas à pas

La figure suivante rejoue une répétition sur la plaque P-217. Le lecteur règle alpha, pose les trous un par un en voyant à chaque pas la liste des candidats et celui que le hasard a tiré, puis regarde la recherche locale améliorer la tournée construite. Chaque répétition terminée s'ajoute à un histogramme et à un tableau qui garde les résultats de chaque valeur de alpha essayée. La meilleure tournée connue n'est donnée qu'à la demande.

GRASP : glouton randomisé, puis recherche locale12 trous, départ de l'outil : le losange
Trous posés
aucun
Chemin déjà parcouru
aucune
Candidats et voisins examinés
0
Graine de la répétition
pas encore tirée
T1T2T3T4T5T6T7T8T9T10T11T12

Trait plein : le chemin posé, puis la tournée. Cercle en pointillés et trait pointillé : les trous de la liste. Cercle plein : le trou tiré.

Un pas pose un trou : la liste des candidats s'affiche ici, avec celui que le hasard a tiré.
Résultats avec alpha = 0,2 : 0 répétition
Chaque répétition terminée ajoutera un résultat ici.

Chaque barre compte les répétitions dont la longueur, après recherche locale, tombe dans son intervalle.

Disponible après cinq répétitions terminées avec ce alpha.
Régler alpha, puis avancer d'un pas : chaque trou posé vient d'une liste de candidats, et le hasard choisit dans la liste.
La plaque P-217, une répétition de GRASP. Le losange est le départ de l'outil.
À manipuler
Avancer pas à pas avec alpha à 0,2. À chaque pas, le tableau classe les trous restants par distance au dernier trou percé, dit lesquels la liste retient et lequel le hasard a tiré ; sur la plaque, les trous de la liste sont cerclés en pointillés. Terminer la construction, puis avancer dans la recherche locale : la tournée construite reste en tirets fins sous la tournée améliorée. Lancer « Nouvelle répétition » plusieurs fois : deux répétitions ne posent pas les mêmes trous. Passer alpha à 0 : la liste n'a plus qu'un trou, il n'y a plus rien à tirer, et chaque répétition redonne la même tournée. Passer alpha à 1 : la liste contient tous les trous restants. Lancer dix répétitions d'un coup pour chaque valeur de alpha, et lire dans le tableau la colonne « Tournées distinctes ». Quand le résultat paraît satisfaisant, cliquer « Comparer à la meilleure connue », actif après cinq répétitions terminées avec la valeur de alpha en cours.

GRASP sur soixante trous

Douze trous se suivent à la main. Pour éprouver la méthode, voici la plaque P-600 des chapitres 5 à 7 : soixante trous engendrés par une formule, sur 600 par 400 mm. La liste des candidats y devient longue, et le tableau n'en montre que les plus proches. La figure garde les résultats de chaque valeur de alpha essayée, pour les comparer ; aucune référence n'est donnée avant l'essai.

GRASP : glouton randomisé, puis recherche locale60 trous, départ de l'outil : le losange
Trous posés
aucun
Chemin déjà parcouru
aucune
Candidats et voisins examinés
0
Graine de la répétition
pas encore tirée

Trait plein : le chemin posé, puis la tournée. Cercle en pointillés et trait pointillé : les trous de la liste. Cercle plein : le trou tiré.

Un pas pose un trou : la liste des candidats s'affiche ici, avec celui que le hasard a tiré.
Résultats avec alpha = 0,05 : 0 répétition
Chaque répétition terminée ajoutera un résultat ici.

Chaque barre compte les répétitions dont la longueur, après recherche locale, tombe dans son intervalle.

Disponible après cinq répétitions terminées avec ce alpha.
Régler alpha, puis avancer d'un pas : chaque trou posé vient d'une liste de candidats, et le hasard choisit dans la liste.
La plaque P-600, soixante trous. Chaque valeur de alpha essayée garde ses résultats dans le tableau.
À manipuler
Commencer avec alpha à 0 : lancer dix répétitions, puis dix de plus. Toutes donnent la même tournée. Passer alpha à 0,02, puis 0,05, 0,2 et 1, avec dix répétitions à chaque fois, et lire dans le tableau les colonnes « Tournées distinctes », « Construction moyenne » et « Médiane ». Comparer la longueur moyenne des constructions à la médiane après recherche locale : la première se dégrade beaucoup quand alpha grandit, la seconde beaucoup moins. Suivre ensuite une répétition pas à pas avec alpha à 1, puis avec alpha à 0,05, et comparer le compteur « Candidats et voisins examinés » à la fin : c'est ce que coûte une répétition. Chaque lecteur a ses propres tirages, la graine de chaque répétition s'affiche, et rien ne garantit de voir la meilleure tournée : il faut plusieurs répétitions pour que le hasard s'en approche.

Le code, et l'effet de alpha mesuré

Le code suivant réunit les deux plaques. La descente est celle du chapitre 5, écrite avec numpy : à chaque pas, les variations de tous les voisins 2-opt sont calculées d'un coup, puis le meilleur est retenu. Le résultat est le même que celui de la version à boucles (2 944,01 mm depuis le plus proche voisin de P-600), et le compte des évaluations aussi : un voisin évalué par mouvement du balayage, 1 769 par balayage sur soixante trous. Le budget de GRASP compte tout ce qui est examiné : les candidats de la construction, 1 830 par tournée sur soixante trous, et les voisins de la descente. Une répétition qui ne tient plus dans le budget est abandonnée.

main.py
Sortie
>_ Prêt à exécuter…

Les trois premiers pas, avec alpha à 0,2 et la graine 1, montrent la règle au travail. Depuis le départ, douze candidats : T1 est à 25 mm, T7 à 76 mm. Le seuil de la liste vaut 25+0,2×(208−25)25 + 0{,}2 \times (208 - 25), soit 62 mm : seul T1 y entre, et il est tiré. Au deuxième pas, depuis T1, T7 (52 mm) et T9 (67 mm) sont dans la liste, pas T10 (81 mm), et le hasard prend T7. Au troisième, T10 et T9 sont à égalité à 30 mm, T11 à 42 mm : les trois sont dans la liste, et le hasard tire T9. Sans le hasard, la règle aurait pris T10 (le nom départage l'égalité) : c'est ce que fait alpha nul.

Sur douze trous, le glouton pur suffit. Le tableau de la plaque P-217 porte sur cent répétitions par valeur de alpha. À alpha nul, il n'y a qu'une tournée distincte, et la recherche locale la mène à l'optimum, 633,23 mm, cent fois sur cent : depuis le plus proche voisin, le 2-opt y arrive en trois pas (chapitre 5). À alpha 0,1, les cent répétitions donnent 58 constructions différentes, et seules 32 arrivent à l'optimum ; à alpha 1, 52 sur 100. Le hasard est ici un handicap : il retrouve moins souvent ce que le glouton trouvait toujours. GRASP ne sert à rien quand le glouton suivi de la recherche locale arrive déjà au bout.

Sur soixante trous, il ne suffit plus. Le glouton pur suivi du 2-opt s'arrête à 2 944,01 mm, à 5,6 % de l'optimum démontré, 2 788,70 mm (chapitre 5), et il s'y arrête toujours : à alpha nul, les onze répétitions que permet le budget refont la même tournée, et 300 000 évaluations donnent un seul résultat. Le réglage de alpha se fait sur les graines 100 à 107, à 300 000 évaluations, et le jugement sur d'autres graines, 0 à 9 (règle du chapitre 6). Voici le tableau de réglage.

alphaMeilleureMédianePireRépétitionsConstruction moyenneAprès 2-opt (moyenne)Évaluations par répétition
02 944,02 944,02 944,011,03 5892 94426 596
0,022 840,42 849,02 923,010,83 4772 93526 678
0,052 812,52 835,42 909,57,83 6322 91136 525
0,22 806,42 873,62 938,63,95 3512 93070 479
12 844,72 881,22 916,22,014 8092 917107 638

Trois lectures. La construction se dégrade vite : de 3 589 mm à alpha nul à 14 809 mm à alpha 1, où elle n'est plus qu'un ordre au hasard. La recherche locale rattrape la qualité : la longueur moyenne après 2-opt reste entre 2 911 et 2 944 mm quelle que soit la valeur de alpha, l'écart entre deux lignes étant du même ordre que celui entre deux graines. Mais elle le paie : depuis un ordre au hasard, une descente demande 107 638 évaluations, quatre fois plus que depuis une construction proche du plus proche voisin (26 596), et à budget égal on ne fait que 2 répétitions au lieu de 11. Un alpha trop grand ne fait pas perdre en qualité par répétition, il fait perdre en nombre de répétitions. Un alpha nul n'en fait perdre aucune, mais elles sont toutes identiques : dès 0,02, la médiane (2 849,0) passe 95 mm sous celle du glouton pur.

Le meilleur des cinq réglages est 0,05, dont la médiane est la plus basse. Le plateau est large, de 0,02 à 0,2, et la médiane de 0,2 (2 873,6) n'est pas très loin de celle de 0,05 : ne pas lire ce tableau comme « 0,05 est le bon alpha ». Jugé sur les graines 0 à 9, alpha 0,05 donne une meilleure tournée à 2 797,4 mm, une médiane à 2 827,1 mm (1,4 % de l'optimum) et une pire à 2 881,8 mm ; alpha 1 donne 2 805,2, 2 901,4 (4,0 %) et 2 977,4 mm. Ce dernier résultat est celui des redémarrages du chapitre 5, qui étaient à 4,6 % dans la comparaison du chapitre 6 : construire un ordre entièrement au hasard puis descendre, en répétant, c'est exactement cela. GRASP à alpha 1 est les redémarrages ; le reste de l'intérêt de la méthode est dans la valeur intermédiaire de alpha.

Ce que règle alpha
Alpha règle un compromis entre la diversité des constructions et leur qualité de départ. À 0, aucune diversité : les répétitions se recopient. À 1, aucune qualité : la recherche locale fait tout le travail, et coûte quatre fois plus de pas. Entre les deux, la valeur utile est petite, elle se règle en mesurant, sur d'autres graines que celles qui jugent, et elle dépend du problème : sur douze trous, le meilleur alpha est 0.
Vérification rapideon peut se reprendre

1.À alpha nul, GRASP sur P-600 refait onze fois de suite la même tournée à 2 944,01 mm dans le budget. Pourquoi ?

2.À alpha 1, la longueur après 2-opt est à peu près la même qu'à alpha 0,05, et pourtant GRASP y fait moins bien à budget égal. Pourquoi ?

Une liste plus courte à écrire
Certaines versions de GRASP fixent la liste par un nombre de candidats (les k meilleurs) plutôt que par un seuil. L'idée est la même, la liste restreinte, mais son sens change : le seuil s'adapte à l'écart entre les candidats, le nombre non. Sur des distances très inégales, comme celles d'une plaque de trous, le seuil suit mieux la géométrie.

Les colonies de fourmis

La fourmi et la trace

Les fourmis réelles cherchent leur nourriture au hasard, et rentrent en laissant derrière elles une trace chimique, la phéromone. Les suivantes penchent pour les pistes marquées. Une piste courte est parcourue plus souvent dans le même temps : elle se renforce. La phéromone s'évapore, et les pistes qu'on cesse d'emprunter s'effacent. Personne ne décide de rien, et la colonie finit par emprunter le chemin court. L'optimisation retient de cette histoire trois ingrédients : des constructions tirées au hasard, une trace laissée en proportion de la qualité, une trace qui s'efface.

Colonie de fourmis (Ant System)
  • La phéromone τij\tau_{ij} est un nombre par arête entre deux points (le départ de l'outil est un point), le même dans les deux sens. Au départ, c'est la même valeur partout.
  • La visibilité ηij=1/dij\eta_{ij} = 1 / d_{ij} est l'inverse de la distance. Elle ne change jamais.
  • À chaque itération, mm fourmis construisent chacune une tournée complète depuis le départ. Depuis un trou ii, une fourmi choisit le trou suivant jj parmi les trous restants avec la probabilité
pij=τijα ηijβ∑kτikα ηikβp_{ij} = \frac{\tau_{ij}^{\alpha}\,\eta_{ij}^{\beta}}{\sum_{k} \tau_{ik}^{\alpha}\,\eta_{ik}^{\beta}}
  • Puis la phéromone s'évapore : τij←(1−ρ) τij\tau_{ij} \leftarrow (1 - \rho)\,\tau_{ij} sur toutes les arêtes.
  • Puis chaque fourmi dépose 1/L1 / L sur chaque arête de sa tournée, LL étant la longueur de cette tournée : plus elle est courte, plus le dépôt est grand.

Quatre réglages, dont chacun a un rôle et un extrême qui casse quelque chose.

RéglageCe qu'il règleTrop basTrop haut
alphale poids de la phéromoneles fourmis ignorent la trace : ce sont des plus proches voisins randomisésles fourmis suivent la trace sans plus rien tenter : la colonie se fige
bêtale poids de la visibilité, 1/d1/dles fourmis ignorent les distances : au début, un ordre au hasardla fourmi prend presque toujours le trou le plus proche
évaporation ρ\rhola part de phéromone perdue à chaque itérationrien ne s'efface : une mauvaise piste trouvée tôt reste attirantetout s'efface : la colonie n'a plus de mémoire
nombre de fourmis mmles tournées construites par itérationpeu d'exploration par itérationbeaucoup d'exploration, mais chaque fourmi coûte

Au départ, la phéromone vaut m/L0m / L_0 sur toute arête, où L0L_0 est la longueur de la tournée du plus proche voisin : mm fourmis aussi bonnes que la règle gloutonne, toutes d'accord sur une arête, y déposeraient exactement cette quantité. Le nombre exact compte moins que ce rapport, celui d'un dépôt à ce qui est déjà sur l'arête : il décide de la vitesse à laquelle la colonie apprend.

Le choix d'une fourmi, en chiffres

Un exemple à la main, sur la plaque de Valdrome. Une fourmi est au trou T7 en (70 ; 30), et il lui reste trois trous à choisir : T10 en (100 ; 30), à 30 mm, T9 en (70 ; 60), à 30 mm, et T11 en (100 ; 60). La phéromone vaut 0,02 sur l'arête vers T10, 0,05 vers T9 et 0,01 vers T11.

Le choix d'une fourmi

  • 1.

    Avec alpha = 1 et bêta = 2, quelle est la probabilité que la fourmi choisisse T9 ? (Distances : 30 mm pour T10 et T9, et racine de 1800, soit environ 42,43 mm, pour T11.)

  • 2.

    Avec bêta = 0, la visibilité disparaît. Quelle est alors la probabilité de T9 ?

  • 3.

    Avec alpha = 0 et bêta = 2, la phéromone disparaît. Quelle est la probabilité de T9 ?

  • 4.

    La phéromone initiale vaut m divisé par la longueur du plus proche voisin. Pour 10 fourmis et 692,06 mm, quelle est-elle ?

  • 5.

    Après une itération à évaporation 0,5, une arête empruntée par une seule fourmi, dont la tournée mesure 640 mm, porte combien de phéromone ?

Trois probabilités pour un même choix. Avec les deux ingrédients, T9 l'emporte deux fois sur trois, et T11, plus loin et moins chargé, a une chance sur quinze. Sans la visibilité, la phéromone seule donne 62,5 % à T9. Sans la phéromone, T9 et T10 sont à égalité et T11 vaut 20 %. C'est le produit des deux qui décide, et les exposants qui règlent lequel des deux pèse le plus.

Douze trous, itération après itération

La figure suivante fait mener une colonie sur la plaque P-217. Chaque arête est d'autant plus épaisse qu'elle porte de phéromone : c'est la mémoire collective qui se forme, et on la voit se former. Les tournées des fourmis de la dernière itération sont tracées en fins pointillés, et la meilleure tournée vue en tirets épais. La courbe suit la longueur des tournées ; la seconde courbe suit la part de la phéromone qui repose sur les arêtes de la meilleure tournée, quantité qui vaut 17 % quand elle est répartie également et 100 % si tout est sur elle.

Une colonie de fourmis, réglée et regardée12 trous, départ de l'outil : le losange
Variante
Itération
0
Meilleure vue
aucune
Moyenne de l'itération
aucune
Phéromone sur la meilleure
pas encore
Candidats examinés
0
Graine
pas encore tirée
T1T2T3T4T5T6T7T8T9T10T11T12

Épaisseur des traits pleins : la phéromone de l'arête. Traits fins pointillés : les tournées des fourmis de la dernière itération. Tirets épais : la meilleure tournée vue.

Les longueurs se tracent ici.

Longueur en mm. Tirets épais : meilleure tournée vue. Points : meilleure de l'itération. Trait fin : moyenne des fourmis de l'itération.

Part de la phéromone sur les arêtes de la meilleure tournée

100 %0

Trait plein : la part sur la meilleure tournée. Pointillés : la part quand la phéromone est répartie également (17 %).

Disponible après 5 itérations.
Avancer d'une itération : les fourmis construisent chacune une tournée, la phéromone s'évapore, puis chaque fourmi dépose. Chaque colonie tire sa propre graine.
Une colonie de fourmis sur la plaque P-217. Chaque colonie tire sa propre graine, affichée dans les compteurs.
À manipuler
Avancer d'une itération, puis de dix, en regardant les traits épais s'accrocher aux arêtes que les bonnes tournées partagent, et le compteur « Phéromone sur la meilleure » monter. Puis changer un réglage à la fois, la colonie repartant de zéro. Passer bêta à 0 : la fourmi ignore les distances, et les tournées de l'itération sont longues. Passer alpha à 0 : les traits s'épaississent toujours, puisque les fourmis déposent, mais aucune n'en tient plus compte, et la moyenne des fourmis n'a plus de raison de descendre. Baisser l'évaporation à 5 % : les traces durent, les premiers chemins s'incrustent. La monter à 95 % : la colonie oublie presque tout. Comparer un nombre de fourmis de 2, de 10 et de 40, en lisant « Candidats examinés », qui dit ce que chaque itération coûte. « Rejouer cette graine » refait exactement la même colonie ; « Recommencer, autre graine » en tire une neuve. Essayer enfin les deux variantes : dans « Max-Min », seule la meilleure fourmi de l'itération dépose et la phéromone reste entre deux bornes ; dans « Max-Min avec 2-opt », sa tournée est d'abord améliorée par la descente du chapitre 5. Quand le résultat paraît satisfaisant, cliquer « Comparer à la meilleure connue », actif après cinq itérations.

Le code, et ce que les réglages changent

Le code suivant est l'Ant System sur les douze trous. La fonction roulette tire un rang avec une probabilité proportionnelle à son poids : un nombre entre 0 et le total, puis on cumule les poids jusqu'à le dépasser. La fonction colonie suit exactement les quatre étapes de la définition, et son journal garde, à chaque itération, la meilleure longueur, la moyenne de l'itération et la part de la phéromone sur la meilleure tournée.

main.py
Sortie
>_ Prêt à exécuter…

Le premier constat porte sur la visibilité. Depuis le départ, avec une phéromone uniforme, la probabilité de T1, à 25 mm, vaut 8 % à bêta 0 (tous les trous sont équiprobables), 31 % à bêta 1 et 90 % à bêta 3 : la visibilité tire les fourmis vers le plus proche, et bêta règle la force de cette traction.

Le deuxième constat est la mémoire qui se forme. Sur les trente itérations de la graine 0, la meilleure tournée vaut 683,8 mm jusqu'à la cinquième itération, 635,8 mm à la dixième, et n'en bouge plus. La part de la phéromone sur ses arêtes est de 17 % au départ (13 arêtes sur 78), de 24 % après la première itération, de 47 % à la cinquième et de 66 % à la trentième. En revanche, sur les itérations affichées, la moyenne des fourmis reste entre 744 et 828 mm : les fourmis explorent encore, la colonie ne s'est pas réduite à une tournée. La mémoire est un biais, pas une décision.

Le troisième est le tableau des réglages, où chaque ligne change un seul réglage de la ligne de référence, sur huit graines.

RéglageMeilleure tournée (médiane)PireCandidats examinés
référence : 10 fourmis, alpha 1, bêta 3, évaporation 0,5649,1672,823 400
alpha 0, sans mémoire667,4691,523 400
bêta 0, sans visibilité780,4837,823 400
évaporation 0,05652,7669,523 400
évaporation 0,9664,1702,723 400
2 fourmis700,0729,24 680

Ce qu'on peut lire, et ce qu'on ne peut pas. La visibilité est le levier le plus fort : sans elle, la colonie perd 130 mm sur la médiane, elle tire des ordres presque au hasard. La mémoire compte : alpha 0 perd 18 mm, soit 2,9 % de l'optimum de P-217, 633,23 mm (chapitre 4). Une évaporation trop forte fait oublier : à 0,9, la colonie perd 15 mm. Deux fourmis ne suffisent pas : elles coûtent cinq fois moins et perdent 51 mm. En revanche, la différence entre 649,1 et 652,7 mm, entre une évaporation de 0,5 et de 0,05, n'est pas un résultat : une médiane de huit graines bouge de quelques millimètres d'un jeu de graines à l'autre. Et aucun réglage n'atteint l'optimum dans ce tableau : une colonie sans recherche locale reste à 2,5 % de lui en médiane, alors que GRASP à alpha nul l'atteignait cent fois sur cent. (Un essai plus long, 300 itérations sur vingt graines, ne l'atteint pas davantage : la meilleure colonie s'arrête à 635,83 mm.)

La même idée sur les postes des opérateurs

Rien n'oblige la fourmi à construire une tournée. Pour les huit opérateurs et les huit postes du chapitre 1, la représentation est poste_de[i], une permutation. Une fourmi affecte les opérateurs un par un, dans l'ordre 0 à 7, chacun à un poste encore libre ; la phéromone est sur les couples (opérateur, poste), une matrice de huit lignes et huit colonnes, non symétrique cette fois ; la visibilité est l'inverse du temps. Ce sont les mêmes quatre étapes, et seules changent la construction et la place du dépôt, comme seuls le voisin et le coût changeaient d'un problème à l'autre au chapitre 5. La roulette est ici celle de la bibliothèque : hasard.choices(libres, poids) tire un élément avec une probabilité proportionnelle à son poids, comme la fonction roulette du code précédent.

main.py
Sortie
>_ Prêt à exécuter…

Les 600 fourmis de la graine 0 (soixante itérations de dix) rendent une affectation à 98 minutes, pour un optimum de 95. Le plus instructif est la matrice : pour six opérateurs sur huit, plus de 97 % de la phéromone de la ligne repose sur un seul poste. La colonie s'est figée : une ligne dont la phéromone est presque entièrement sur un poste ne laissera plus jamais une fourmi en choisir un autre, et l'exploration s'est éteinte sur une affectation qui n'est pas la meilleure. C'est le risque de toute mémoire qui ne s'efface pas assez vite, et c'est la raison d'être des bornes de la variante Max-Min.

À budget égal, le résultat est net. À 1 000 évaluations, les colonies réglées sur les graines 100 à 109 ne trouvent l'optimum sur aucune des vingt graines, avec une médiane à 105 minutes et une pire à 115. À 3 000, la médiane est de 101 minutes, la pire de 109, toujours 0 fois sur 20. Les redémarrages du chapitre 6, à budget égal, l'atteignent 15 fois sur 20 à 1 000 évaluations et 20 fois sur 20 à 3 000, avec une médiane de 95. Les fourmis perdent, et nettement. L'espace ne compte que 40 320 affectations, les descentes y sont bon marché, et une mémoire n'a pas le temps de se former en quelques dizaines de fourmis. L'ordonnancement de la machine se traiterait de la même façon, avec la phéromone sur les couples (position, ordre de fabrication) ; il n'est pas repris ici, l'affectation suffit à montrer que la représentation change et que les quatre étapes restent.

Les fourmis sur la grande plaque

Sur P-600, une fourmi examine 1 830 candidats : un budget de 300 000 évaluations ne permet que 163 fourmis, seize itérations de dix. C'est peu pour qu'une mémoire se forme. Le code suivant compare l'Ant System à ses deux variantes, sur dix graines, à budget égal. La variante Max-Min (MMAS en anglais) change deux choses : seule la meilleure fourmi de l'itération dépose, et la phéromone est bornée entre h/(2n)h / (2n) et h=1/(ρL∗)h = 1 / (\rho L^*), où L∗L^* est la meilleure longueur vue. Une arête ne tombe donc jamais à zéro, et aucune ne domine sans partage : la colonie ne peut pas se figer comme celle des opérateurs. La phéromone y démarre à sa borne haute. La troisième ligne, Max-Min et 2-opt, améliore la meilleure tournée de l'itération par la descente 2-opt du chapitre 5 avant de la déposer. La dernière remet alpha à 0 dans cette version : la même colonie, sans mémoire, pour mesurer ce que la phéromone apporte. Les poids d'une itération sont calculés une fois, puisque la phéromone ne bouge pas pendant que les fourmis construisent, et le budget compte les candidats des fourmis et les voisins de la descente. Le début du code (la plaque, la matrice des distances, la descente) est celui du bloc de GRASP, repris tel quel : chaque bloc s'exécute seul, il faut donc le répéter.

main.py
Sortie
>_ Prêt à exécuter…

Le tableau donne, à 300 000 évaluations, les écarts à l'optimum démontré de 2 788,70 mm.

ColonieMeilleureMédianePire
Ant System3 071,83 124,5 (12,0 %)3 298,3
Max-Min2 953,73 055,2 (9,6 %)3 189,0
Max-Min et 2-opt2 808,42 821,8 (1,2 %)2 850,2
Max-Min et 2-opt, alpha 02 801,52 832,0 (1,6 %)2 863,4

Trois lectures. Max-Min fait mieux que l'Ant System (9,6 % contre 12,0 %), ce qui justifie la variante : quand la mémoire ne se nourrit que de la meilleure fourmi, elle se concentre sur ce qui marche. Mais c'est la recherche locale qui fait basculer : de 9,6 % à 1,2 %. La mémoire, elle, pèse peu : remettre alpha à 0 dans la version qui gagne coûte 10 mm de médiane (1,2 % contre 1,6 %), moins que l'écart entre la meilleure et la pire graine d'une même ligne, une quarantaine de millimètres. À un million d'évaluations (le même code avec BUDGET = 1_000_000, exécuté hors du navigateur, dont le moteur interrompt un bloc trop long), l'écart reste de cet ordre : 2 815,3 mm avec mémoire, 2 822,6 mm sans, soit 1,0 % et 1,2 %. Le réglage n'est pas plus poussé que celui du recuit : il se fait, pour chaque variante, sur les graines 100 à 104, parmi trois essais qui ne diffèrent que par le nombre de fourmis et l'évaporation. Bêta vaut 5 dans les trois, plus que les 3 de la colonie sur douze trous : des essais préalables, sur des graines de réglage, l'avaient préféré à 2 et à 3 pour l'Ant System. À un million d'évaluations, le réglage retient dix fourmis et une évaporation de 0,1 pour les variantes avec 2-opt.

Comparer honnêtement, à budget égal

La méthode de comparaison est celle du chapitre 6 : plusieurs graines, la meilleure, la médiane et la pire, un budget égal en évaluations, un écart à l'optimum démontré, et des réglages faits sur d'autres graines que celles qui jugent. Le tableau reprend, pour les mêmes dix graines (0 à 9) et les mêmes budgets, les lignes du chapitre 6 et celles de ce chapitre. Chaque cellule donne la meilleure, la médiane et la pire tournée, puis l'écart de la médiane à l'optimum de 2 788,70 mm. Une réserve de méthode : les redémarrages du chapitre 6 comptent une descente interrompue pour ce qu'elle a atteint, alors que GRASP et les colonies abandonnent la répétition qui ne tient plus, règle du chapitre 7.

Méthode300 000 évaluations1 000 000 d'évaluations
Recuit (chapitre 6)2 808,4 / 2 831,9 / 2 850,4 (1,5 %)2 788,70 / 2 797,7 / 2 839,2 (0,3 %)
Redémarrages, meilleur voisin (chapitre 5)2 821,6 / 2 916,2 / 2 969,2 (4,6 %)2 788,70 / 2 849,9 / 2 907,0 (2,2 %)
GRASP, alpha 02 944,0 / 2 944,0 / 2 944,0 (5,6 %)2 944,0 / 2 944,0 / 2 944,0 (5,6 %)
GRASP, alpha 0,052 797,4 / 2 827,1 / 2 881,8 (1,4 %)2 797,4 / 2 813,5 / 2 849,3 (0,9 %)
GRASP, alpha 12 805,2 / 2 901,4 / 2 977,4 (4,0 %)2 805,2 / 2 829,8 / 2 921,1 (1,5 %)
Fourmis, Ant System3 071,8 / 3 124,5 / 3 298,3 (12,0 %)2 995,1 / 3 093,2 / 3 267,9 (10,9 %)
Fourmis, Max-Min2 953,7 / 3 055,2 / 3 189,0 (9,6 %)2 826,0 / 2 954,0 / 3 071,6 (5,9 %)
Fourmis, Max-Min et 2-opt2 808,4 / 2 821,8 / 2 850,2 (1,2 %)2 797,4 / 2 815,3 / 2 826,3 (1,0 %)
Fourmis, Max-Min et 2-opt, alpha 02 801,5 / 2 832,0 / 2 863,4 (1,6 %)2 801,5 / 2 822,6 / 2 837,5 (1,2 %)

Ce que ces chiffres autorisent à dire.

  • Les fourmis seules perdent, et nettement. L'Ant System est à 12,0 % à 300 000 évaluations et encore à 10,9 % à un million : il gagne peu à recevoir plus de budget, la construction seule ne suffit pas à descendre. Max-Min descend à 5,9 % à un million, mais reste loin derrière.
  • Ce qui gagne est une construction suivie d'une recherche locale. À 300 000 évaluations, le recuit, GRASP à alpha 0,05 et les fourmis avec 2-opt ont des médianes à une dizaine de millimètres l'une de l'autre (2 821,8, 2 827,1 et 2 831,9 mm), un écart plus petit que celui entre la meilleure et la pire graine d'une même ligne (de 42 à 84 mm). Ils sont à égalité, et le classement de ce tableau ne dit rien de plus.
  • À un million, le recuit passe devant (0,3 % contre 0,9 % pour GRASP et 1,0 % pour les fourmis avec 2-opt). GRASP et les fourmis avec 2-opt recommencent chaque fois d'une tournée construite : plus de budget leur donne plus de répétitions, pas de meilleures répétitions. Le recuit, lui, raffine une même solution.
  • Un alpha mal réglé coûte cher. GRASP à alpha nul reste à 5,6 % quel que soit le budget, et à alpha 1 il refait les redémarrages : 4,0 % à 300 000 évaluations.
  • La mémoire des fourmis apporte peu ici. Avec 2-opt, la version sans phéromone est à 1,6 % contre 1,2 % à 300 000 évaluations, et à 1,2 % contre 1,0 % à un million.
  • Sur douze trous et sur huit postes, le tableau est autre. Le glouton suivi du 2-opt trouve l'optimum de P-217 cent fois sur cent ; sur les postes, les redémarrages trouvent l'optimum quand les fourmis ne le trouvent pas. Aucune méthode ne gagne partout.
Ce que ce tableau ne démontre pas
Une seule plaque, un seul voisinage (le 2-opt), dix graines par ligne, et, pour GRASP, un alpha réglé à 300 000 évaluations puis gardé à un million. Le classement peut changer avec une plaque de cinq cents trous, avec des listes de candidats plus courtes pour les fourmis, avec un budget mesuré en secondes plutôt qu'en évaluations : une évaluation de fourmi (un poids, un tirage) ne coûte pas ce que coûte l'évaluation d'un voisin 2-opt (quatre distances). Le résultat est solide dans son cadre, et il faut le dire avec son cadre.

Ce que ce chapitre ne dit pas non plus : que les fourmis sont inutiles. Elles ont été conçues pour des problèmes de tournées et de routage, on les emploie aussi pour le routage dans des réseaux, où la mémoire s'adapte pendant que la recherche continue, et la variante Max-Min avec recherche locale est un concurrent sérieux du recuit. Mais sur la plaque et les postes de Valdrome, à ces budgets, ce que la mémoire ajoute est faible devant ce que la recherche locale apporte.

Ce que ces méthodes changent au squelette

Le squelette du chapitre 5, chercher(initiale, voisin, cout, accepter, iterations), suppose une solution courante : on part d'une solution, on en tire un voisin, on décide de s'y déplacer. Le tabou du chapitre 7 en a changé la forme, sans changer cette hypothèse. GRASP et les fourmis la rejettent, et les pièces changent.

chercher(initiale, voisin, cout, accepter, iterations)                    # chapitres 5 et 6 : une solution courante
chercher_voisinage(initiale, voisinage, cout, iterations, duree_tabou)    # chapitre 7 : idem, et une mémoire de mouvements
grasp(construire, ameliorer, cout, budget)                                # GRASP : pas de solution courante, pas de mémoire
colonie(construire_selon, deposer, evaporer, cout, budget)                # fourmis : une mémoire, qui n'est pas une solution

Dans GRASP, il n'y a plus de initiale : chaque répétition construit la sienne. Il n'y a plus de voisin tiré ni de accepter : la descente qui suit la construction est celle du chapitre 5. Dans une colonie, la mémoire est un objet à part, la matrice de phéromone. Elle n'est pas une solution, on ne peut pas la « retoucher » : elle est mise à jour par des solutions entières, celles des fourmis, puis lue par les constructions suivantes. C'est un changement de nature : la recherche n'est plus une marche d'une solution à une autre, c'est une boucle entre une loi de tirage et ses résultats. Le chapitre suivant en donne une autre version, où la mémoire est une population.

Les erreurs d'un débutant

Confondre les deux alpha
Dans GRASP, alpha est entre 0 et 1 et règle la largeur d'une liste ; dans une colonie, c'est un exposant, souvent entre 0 et 5. Régler un alpha de 2 pour la liste, ou de 0,05 pour l'exposant, donne une méthode qui tourne et qui ne fait pas ce qu'on croit. Toujours lire le sens du paramètre avant sa valeur.
Ne pas compter la construction dans le budget
Compter seulement les voisins de la descente fait paraître la construction gratuite. Or une fourmi examine 1 830 candidats sur soixante trous : dix fourmis coûtent 18 300 évaluations par itération, à peu près dix balayages du 2-opt. Une méthode qui construit beaucoup ne peut se comparer à une méthode qui retouche que si tout ce qui est examiné est compté.
Déposer L au lieu de 1 / L
Le dépôt doit être proportionnel à la qualité, et pour une longueur à minimiser la qualité est l'inverse. Déposer la longueur renforce les mauvaises tournées, plus que les bonnes : la colonie apprend à l'envers, et rien ne plante. Vérifier que la tournée la plus courte est celle qui dépose le plus.
Une phéromone qui ne se lit que dans un sens
Une arête n'a pas de sens : la fourmi qui va de a à b et celle qui va de b à a passent par la même. Déposer sur tau[a][b] seulement laisse tau[b][a] vide, et les fourmis qui reviennent sur leurs pas ne voient aucune trace. Déposer dans les deux sens, et vérifier que la matrice reste symétrique. (Pour des couples opérateur et poste, la matrice n'est pas symétrique : c'est un autre problème.)
Prendre une colonie figée pour une colonie convaincue
Quand plus de 97 % de la phéromone d'une ligne est sur un poste, la colonie n'explore plus : elle est figée, pas convaincue. Une phéromone de 100 % sur la meilleure tournée est l'arrêt de l'exploration, pas la preuve que la tournée est bonne. Surveiller la moyenne des fourmis de l'itération : si elle rejoint la meilleure, la colonie n'a plus de diversité ; les bornes de la variante Max-Min existent pour cela.
Régler sur les graines qui jugent
Choisir alpha, bêta ou l'évaporation en regardant les graines sur lesquelles on annoncera le résultat fait gagner la méthode sur elle-même. Régler sur d'autres graines (ici 100 à 107, puis 0 à 9), et donner les réglages avec le résultat.

Exercices type

GRASP à alpha nul répète-t-il quelque chose d'utile sur P-600 ?

Non. À alpha nul, chaque liste ne contient que le plus proche, donc la construction est le plus proche voisin du chapitre 4, toujours la même, et la descente qui la suit aussi : les onze répétitions que permet un budget de 300 000 évaluations rendent la même tournée, 2 944,01 mm. Une seule répétition aurait donné le même résultat pour onze fois moins d'évaluations. Répéter n'a de sens que si les répétitions diffèrent.

Combien de fourmis un budget de 300 000 évaluations permet-il sur P-600 ?

Une fourmi examine 60 candidats au premier pas, 59 au deuxième, et ainsi de suite jusqu'à 1 : 60×61/2=1 83060 \times 61 / 2 = 1\,830. Le budget permet ⌊300 000/1 830⌋=163\lfloor 300\,000 / 1\,830 \rfloor = 163 fourmis, soit seize itérations de dix fourmis, avec quelques évaluations en reste. Sur P-217, une fourmi n'en examine que 78 : le même budget en permet 3 846.

Une fourmi dépose 1 / L sur les arêtes de sa tournée. Que se passerait-il avec L ?

Les tournées longues déposeraient plus que les courtes : la phéromone s'accumulerait sur les mauvaises arêtes, et la colonie s'éloignerait de l'optimum d'itération en itération. Un dépôt proportionnel à la qualité est un dépôt proportionnel à l'inverse du coût, pour un coût à minimiser.

Avec une évaporation de 0,9, une colonie ne progresse presque plus. Pourquoi ?

À chaque itération, 90 % de la phéromone disparaît : ce qu'une itération a appris est presque effacé avant la suivante, et les fourmis retombent sur la visibilité seule. Sur P-217, une évaporation de 0,9 a perdu 15 mm de médiane sur la référence. À l'inverse, une évaporation nulle ne fait rien oublier, et une mauvaise piste trouvée tôt garde son attrait.

Quand préférer GRASP aux fourmis ?

Quand une recherche locale efficace existe et que la difficulté est d'en varier les départs : GRASP n'a qu'un réglage (alpha), pas de matrice, pas de mémoire à entretenir, et à 300 000 évaluations il égale les fourmis avec 2-opt sur P-600. Les fourmis se justifient quand la construction est naturelle et que les bonnes solutions partagent des éléments qu'une mémoire peut retenir, ou quand le problème change pendant la recherche. Sur les données de Valdrome, GRASP est plus simple et aussi bon.

La méthode

  1. Écrire la règle gloutonne du problème : la construction élément par élément, avec son coût de candidat et son départage des égalités.
  2. La randomiser par une liste restreinte (alpha, avec la valeur 0 qui redonne la règle) ou par des probabilités (phéromone et visibilité).
  3. Ajouter la recherche locale du chapitre 5 après chaque construction, ou seulement sur la meilleure de chaque itération quand elle coûte cher.
  4. Compter le budget en évaluations, construction comprise, et le donner avec le résultat.
  5. Régler alpha (ou alpha, bêta, l'évaporation et le nombre de fourmis) sur d'autres graines que celles qui jugent, en cherchant le plateau plutôt que le meilleur point.
  6. Surveiller la diversité : nombre de tournées distinctes pour GRASP, moyenne des fourmis et part de la phéromone pour une colonie.
  7. Comparer à budget égal, sur plusieurs graines, avec la meilleure, la médiane et la pire, et l'écart à l'optimum ou à une borne.
  8. Dire ce qui perd, y compris sa propre méthode.

Synthèse

  • GRASP et les fourmis recommencent à construire au lieu de retoucher : la règle gloutonne devient une loi de tirage sur les tournées, et il n'y a plus de solution courante.
  • GRASP tire chaque trou dans une liste restreinte (les candidats à moins de cmin⁡+α(cmax⁡−cmin⁡)c_{\min} + \alpha (c_{\max} - c_{\min}) du plus proche), améliore la construction par une descente 2-opt, et répète. Alpha nul est le plus proche voisin, alpha 1 un ordre au hasard.
  • Sur P-600, alpha nul refait toujours la même tournée (2 944,01 mm) ; alpha 1 refait les redémarrages, avec des descentes quatre fois plus coûteuses ; une petite valeur, 0,05, donne 2 827,1 mm en médiane à 300 000 évaluations. Sur P-217, le glouton pur suivi du 2-opt trouve l'optimum cent fois sur cent : le hasard y est un handicap.
  • Une colonie de fourmis garde une matrice de phéromone. Chaque fourmi choisit son trou suivant avec une probabilité proportionnelle à τα ηβ\tau^{\alpha}\,\eta^{\beta}, la phéromone puissance alpha fois la visibilité (l'inverse de la distance) puissance bêta ; la phéromone s'évapore, puis chaque fourmi dépose 1/L1/L : le dépôt suit la qualité.
  • La visibilité est le levier le plus fort ; la mémoire aide (18 mm sur P-217) mais un excès la fige, comme sur les postes des opérateurs, où la phéromone se concentre sur un poste et arrête l'exploration.
  • Sans recherche locale, les fourmis perdent : 12,0 % de l'optimum à 300 000 évaluations sur P-600, 9,6 % avec la variante Max-Min. Avec la descente 2-opt sur la meilleure de l'itération, 1,2 %.
  • À 300 000 évaluations, le recuit, GRASP et les fourmis avec 2-opt sont à égalité (1,2 à 1,5 %), et à un million le recuit passe devant (0,3 % contre 0,9 et 1,0 %). La mémoire des fourmis pèse peu ; sur les postes, les redémarrages gagnent.
  • Ces méthodes sortent du squelette : la mémoire d'une colonie est une matrice mise à jour par des solutions entières, pas une solution que l'on retouche.

Et ensuite

Ni GRASP ni les fourmis ne gardent de solution courante, mais elles restent des méthodes qui construisent : la mémoire des fourmis est une matrice, celle de GRASP est nulle. Les algorithmes génétiques font un pas de plus : ils manient une population de solutions complètes, qui se croisent et se mutent. Pour la méthode de comparaison honnête, le chapitre 6 ; pour la descente 2-opt qui suit chaque construction, la recherche locale ; pour la règle gloutonne qu'on randomise, les heuristiques constructives. Le dernier chapitre du parcours reprend toutes ces méthodes côte à côte.

Mettre en pratique

Écrire la liste restreinte d'un GRASP à alpha donné, chiffrer le budget d'une colonie et l'oubli de sa phéromone, et débusquer une phéromone qui ne se lit que dans un sens.

Tous les exercices sur fourmis et grasp