Aller au contenu principal

La recherche tabou

Ce que ce chapitre apporte6 points
  • Expliquer pourquoi prendre le meilleur voisin, même moins bon, fait sortir d'un optimum local, et pourquoi cela ne suffit pas sans mémoire.
  • Choisir l'attribut d'un mouvement à rendre tabou, et dire pourquoi une paire d'éléments vaut mieux que la solution entière.
  • Décrire l'effet de la durée tabou : trop courte, la recherche tourne en rond ; trop longue, elle s'interdit trop.
  • Énoncer le critère d'aspiration et dire à quoi il sert.
  • Écrire la seconde forme du squelette, chercher_voisinage(initiale, voisinage, cout, iterations, duree_tabou), et la distinguer de la première, chercher(initiale, voisin, cout, accepter, iterations).
  • Comparer honnêtement le tabou à des redémarrages, à budget égal, sur au moins dix graines, en réglant la durée sur d'autres graines que celles qui jugent.
Chez Valdrome Mécanique, la descente sur l'ordre de passage de la machine s'arrête à 18 heures de retard cumulé : aucun échange de deux ordres ne fait mieux. Le planning est un optimum local, et le chapitre sur la recherche locale a laissé cette impasse ouverte. Le recuit simulé en sort en acceptant, au hasard, des voisins moins bons. La recherche tabou en sort sans hasard, par deux règles : toujours prendre le meilleur voisin, même s'il est moins bon que la solution courante, et s'interdire de revenir sur ses pas grâce à une mémoire, la liste tabou. Ce chapitre dit ce que cette mémoire retient (un attribut du mouvement, pas la solution entière), combien de temps elle le retient, et quand elle accepte tout de même de lever un interdit. Il livre aussi la seconde forme du squelette de recherche, celle qui examine tout le voisinage au lieu d'en tirer un seul voisin.

Quand la descente s'arrête

Le chapitre sur la recherche locale a posé la règle de la descente : tant qu'un voisin est meilleur, s'y installer ; sinon, s'arrêter. Sur les dix ordres de fabrication de la machine, avec l'échange de deux ordres pour mouvement (45 voisins), la descente au meilleur voisin part de l'ordre d'écriture, à 45 heures de retard, et s'arrête en trois pas sur l'ordre suivant :

Position12345678910
OrdreO7O9O3O4O5O8O1O6O2O10
Fin (h)291113182729343746
Retard (h)00000103014

Total : 18 heures. Aucun échange ne descend en dessous de 18, et pourtant le chapitre sur les heuristiques constructives a déjà montré qu'un meilleur ordre existe. Regarder de plus près ce que la descente refuse. Elle refuse les voisins qui ne sont pas strictement meilleurs : six échanges laissent le total à 18 heures, deux le montent à 19, tous les autres font pire. Or un voisin à 18 heures n'est pas un cul-de-sac : c'est un autre ordre d'où d'autres échanges sont possibles. La descente ne le voit pas, parce que sa règle d'arrêt est « aucun voisin strictement meilleur ». Des solutions de même coût, reliées d'échange en échange, forment un palier : la descente ne s'y engage jamais, la recherche tabou s'y promène.

Un voisin qui n'est pas meilleur

  • 1.

    Dans l'ordre O7, O9, O3, O4, O5, O8, O1, O6, O2, O10 (18 h de retard), on échange O3 et O5, ce qui donne O7, O9, O5, O4, O3, O8, O1, O6, O2, O10. À quelle heure O3, désormais cinquième, finit-il, en h ?

  • 2.

    O3 a pour échéance 17 h. Quel est son retard, en h ?

  • 3.

    Les ordres O8, O6 et O10 finissent aux mêmes heures qu'avant, et les autres ordres, O3 mis à part, n'ont aucun retard. Quel est le nouveau total, en h ?

  • 4.

    De combien ce voisin est-il moins bon que la solution courante, en h ?

Une heure de plus, et l'échange n'a aucune raison d'être pris par une descente. C'est précisément ce que la recherche tabou accepte de faire.

Prendre le meilleur voisin, même moins bon

Le pas de la recherche tabou

À chaque pas, la recherche tabou examine tout le voisinage de la solution courante, puis se déplace vers le meilleur voisin, sans demander s'il est meilleur ou moins bon que la solution où elle se trouve. Elle garde en outre en mémoire la meilleure solution vue depuis le début, et c'est celle-ci qu'elle rend à la fin, pas la dernière.

Cette règle change la nature de la recherche. Une descente ne peut que descendre : elle s'arrête au fond du premier creux. Une recherche qui prend le meilleur voisin quoi qu'il arrive remonte de l'autre côté du creux, et peut retomber dans un creux voisin, plus profond.

Elle a un défaut évident. Quand on vient de quitter la solution ss pour un voisin s′s' moins bon, quel est le meilleur voisin de s′s' ? Très souvent, ss elle-même : c'est un voisin de s′s' (le même mouvement, à l'envers), et elle est meilleure que tous les autres. La recherche y retourne, puis repart vers s′s', puis revient : elle cycle, en deux pas, sur deux solutions. Sans autre précaution, prendre le meilleur voisin ne fait pas sortir du creux, cela fait osciller sur son bord.

Le cyclage est la conséquence directe de la règle
Le cyclage n'est pas un bogue qu'on corrige d'un test : c'est ce que produit « le meilleur voisin, quoi qu'il arrive », dès qu'on est sur un optimum local. Il faut une règle de plus, qui empêche de reprendre ce qu'on vient de faire. Cette règle a besoin d'une mémoire.

La mémoire : ce qu'on rend tabou

L'idée est de noter ce qu'on vient de faire, et d'interdire de le défaire pendant quelque temps. Reste à décider ce qu'on note.

Attribut d'un mouvement, liste tabou

L'attribut d'un mouvement est ce qui l'identifie, en une donnée courte : les deux éléments échangés, les deux arêtes retirées d'une tournée. La liste tabou est la mémoire des attributs des mouvements pris récemment. Un mouvement dont l'attribut figure dans la liste est tabou : la recherche ne peut pas le prendre.

Sur un échange, l'attribut naturel est la paire d'ordres échangés. Échanger O3 et O5 rend tabou de les échanger de nouveau, et défaire un échange, c'est échanger les mêmes deux ordres : le retour en arrière est exactement ce que la mémoire interdit. Les autres problèmes de Valdrome ont chacun leur attribut.

ProblèmeMouvementAttribut mémoriséCe que l'interdit empêche
Machine, dix ordreséchanger deux ordresla paire d'ordresde les échanger de nouveau
Affectation, huit opérateurséchanger les postes de deux opérateursla paire d'opérateursde rééchanger leurs postes
Tournée, 2-optretourner un segmentles deux trous aux extrémités du segmentde retourner un segment de mêmes extrémités, donc de défaire
Commandes, dix bitschanger un bitl'indice de la commandede la reprendre, ou de la retirer, aussitôt

Deux autres choix sont possibles et se rencontrent : mémoriser les deux arêtes retirées d'une tournée et interdire de les remettre, ou mémoriser la solution entière. Le second est le plus simple à écrire, et le moins bon.

Rendre tabou la solution entière
Interdire de revenir à des solutions déjà visitées demande de les stocker toutes et de comparer chaque voisin à chacune : c'est lourd. Surtout, c'est peu efficace. Une tournée de soixante trous a un nombre astronomique de variantes, et la recherche peut tourner autour d'une même région sans jamais retomber sur une solution identique, en enchaînant des solutions qui ne diffèrent que par un détail. Un attribut interdit toute une famille de solutions à la fois : toutes celles qu'on obtiendrait en défaisant ce mouvement, où que soit la recherche.

À l'inverse, un attribut trop grossier interdit trop. Rendre tabou « l'ordre O3 » tout entier, c'est interdire les neuf échanges qui le concernent, et le voisinage, déjà petit, se vide. Le bon attribut est le plus fin qui empêche encore de défaire ce qu'on vient de faire.

Combien de temps : la durée tabou

Un interdit qui dure toujours ferait mourir la recherche : à force d'interdire, il ne resterait plus aucun mouvement. Chaque interdit est donc temporaire.

Durée tabou

La durée tabou est le nombre de pas pendant lesquels un mouvement pris reste tabou. Un mouvement pris au pas tt avec une durée dd est interdit aux pas t+1t + 1 à t+dt + d, et permis de nouveau ensuite. Avec d=0d = 0, rien n'est jamais interdit : c'est le meilleur voisin sans mémoire.

La durée est le réglage de la méthode, et il se lit dans les deux sens.

  • Trop courte : la recherche ne s'éloigne pas assez. Elle sort du creux, fait un ou deux pas, puis l'interdit expire et elle y retombe : elle tourne en rond sur un petit nombre de solutions.
  • Trop longue : la recherche s'interdit trop. À chaque pas, une grande partie des mouvements est tabou ; le meilleur mouvement autorisé est de plus en plus mauvais, et le coût courant s'envole loin de tout ce qui est intéressant. Si la durée atteint la taille du voisinage, tout finit par devenir tabou (sauf ce que l'aspiration libère) et la recherche est bloquée.

Aucune durée n'est bonne partout. Elle se règle par rapport à la taille du voisinage (45 échanges ne demandent pas la même mémoire que 1 769 mouvements 2-opt), et se mesure : plusieurs durées, plusieurs départs, et on garde celle qui rapporte.

Le critère d'aspiration

Une liste tabou est un interdit aveugle : elle interdit un mouvement pour ce qu'il est, pas pour ce qu'il donne. Or il arrive qu'un mouvement tabou mène à une solution meilleure que toutes celles vues jusqu'ici. L'interdire serait absurde : il n'y a aucun risque de tourner en rond en découvrant une solution qu'on n'a jamais vue.

Critère d'aspiration

Le critère d'aspiration est la condition qui lève l'interdit d'un mouvement tabou. La forme la plus courante : le mouvement est autorisé s'il donne une solution strictement meilleure que la meilleure solution vue. La comparaison se fait avec la meilleure solution vue, pas avec la solution courante.

Cette précision compte. Comparer au coût courant autoriserait tout mouvement qui améliore la solution du moment, ce qui inclurait le retour vers la solution qu'on vient de quitter : la mémoire ne servirait plus à rien.

À manipuler : la recherche tabou pas à pas

La figure suivante fait mener la recherche sur les dix ordres de fabrication. À chaque pas, elle montre tous les échanges classés par coût : les mouvements tabous sont barrés, le prochain mouvement est marqué, et l'aspiration est signalée quand elle joue. La liste tabou se remplit d'une paire par pas et se vide au rythme de sa durée. La courbe trace le coût courant (trait plein) et le meilleur coût vu (tirets).

Recherche tabou sur une machine10 ordres, échange de deux ordres
Pas
0
Coût courant
45 h
Meilleur vu
45 h
Solutions distinctes
1 (0 retour)
Départ :
Durée tabou :3 pas
Ordre de passage courant
  1. 1O1
  2. 2O2
  3. 3O3
  4. 4O4
  5. 5O5
  6. 6O6
  7. 7O7
  8. 8O8
  9. 9O9
  10. 10O10
0102030405001020pascoût (h)

Trait plein : coût courant. Tirets épais : meilleur coût vu. Losange : aspiration. Croix : solution déjà visitée.

Liste tabouvide
  • Aucun échange n'est interdit.
Voisinage : 45 échanges, du meilleur au moins bon
ÉchangeCoûtVar.État
O2⇄O927−18prochain pas
O1⇄O938−7
O6⇄O939−6
O4⇄O943−2
O8⇄O943−2
O1⇄O744−1

Le prochain pas prend la première ligne non barrée, même si elle coûte plus que la solution courante. Barré : mouvement tabou.

Le départ est posé, la liste tabou est vide. Un pas prend le meilleur des 45 échanges.
Disponible après 8 pas.
Les dix ordres de fabrication de la machine, une recherche tabou par échanges. Le coût est la somme des retards.
À manipuler
Commencer avec la durée tabou à 0 : avancer de « Dix pas » en « Dix pas » et regarder le compteur de solutions distinctes, la liste tabou (vide) et les croix de la courbe. Puis recommencer avec une durée de 1, de 2, de 3, de 4, et ainsi de suite, en cherchant la plus petite durée pour laquelle le meilleur coût vu descend sous le palier atteint sans mémoire. Suivre alors, pas à pas, ce que fait la recherche sur le palier : la première ligne du voisinage est barrée, la suivante est prise, et la liste tabou n'a qu'à se remplir pour qu'elle en sorte. Monter ensuite la durée vers 15, puis 30 : le coût courant décolle et ne redescend plus. Couper l'aspiration, monter la durée à 45 (la taille du voisinage, le curseur va de 0 à 50) et avancer de dix pas en dix pas : après le quarante-cinquième pas, tous les échanges sont tabous et la recherche est bloquée. Avec 44, elle ne l'est jamais. Enfin, choisir « Au hasard » et cliquer « Autre tirage » plusieurs fois, avec une durée de 20 (à 7 pas, l'aspiration ne joue presque jamais) : environ un tirage sur quatre montre un losange dans les cinquante premiers pas, et dans environ un tirage sur cinq, couper l'aspiration change le meilleur coût. Essayer avec puis sans aspiration, jusqu'à trouver un tirage où un losange de la courbe fait la différence. Quand le résultat paraît bon, cliquer « Comparer à la meilleure connue ».

Le squelette, deuxième forme

Le squelette chercher du chapitre sur la recherche locale tire un voisin, décide de l'accepter, et recommence. Il convient à la descente aux tirages et au recuit simulé. Le tabou examine tout le voisinage : il ne tire rien, il compare. Le squelette a donc une seconde forme, qui prend non plus une fonction voisin mais une fonction voisinage.

Forme 1 : chercherForme 2 : chercher_voisinage
Ce que fournit le voisinagevoisin(solution, hasard) : un voisin tiré au hasardvoisinage(solution) : un générateur de couples (attribut, voisin), tous les voisins
Coût d'un pasune évaluationtout le voisinage : 45, 65 ou 1 769 évaluations
Règle de décisionaccepter(nouveau, actuel)le meilleur voisin autorisé par la mémoire
Hasardoui, une graineaucun : le même départ donne toujours la même recherche
Mémoireaucunela liste tabou
Méthodesdescente aux tirages, recuit simulédescente au meilleur voisin, recherche tabou

Ce qui change tient en peu de lignes. Le voisinage devient un générateur qui fournit, pour chaque voisin, l'attribut du mouvement qui y mène ; la boucle regarde tous les voisins, écarte les mouvements tabous (sauf aspiration), et garde le meilleur ; puis elle inscrit l'attribut du mouvement pris dans la mémoire. La descente au meilleur voisin est la même forme sans mémoire : elle s'arrête quand le meilleur voisin n'améliore plus. Le code suivant met les deux formes côte à côte, et les fait tourner sur la machine. Sa seconde partie, sous le commentaire « Suite : l'effet de la durée », sert à la section d'après.

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

Le premier résultat rappelle la recherche locale : la forme 1 en descente, avec mille tirages, s'arrête à 20, 17, 18, 17 ou 20 heures selon la graine, et il faut plusieurs graines pour en tirer un ordre correct. Le deuxième, la descente de la forme 2, est sans hasard et s'arrête à 18 heures en trois pas. Le troisième est le tabou, avec une mémoire de cinq pas, en cinquante pas : 17 heures. Le tableau qui suit le détaille. Les pas 3 à 10 restent à 18 heures : la recherche se promène sur le palier, sans que le coût bouge, en changeant de solution à chaque pas grâce à la liste tabou, qui l'empêche de repasser aussitôt sur la solution précédente. Au pas 11, un échange que la descente n'aurait jamais vu, parce qu'il exige d'être sur une autre solution de ce palier, fait descendre à 17.

Deux chiffres méritent d'être comparés. La descente de la forme 2 évalue 180 voisins pour aboutir à 18 heures. Le tabou en évalue 2 250 pour arriver à 17 : un pas de tabou coûte autant qu'un pas de descente, et il en faut davantage, ce que le budget doit prévoir.

Deux formes, une charpente
Les deux formes ont les mêmes pièces (une solution initiale, un coût, la meilleure solution vue) et se distinguent par deux choses seulement : la manière dont le voisinage est fourni (un tirage ou un générateur complet) et la manière de décider (un test d'acceptation ou le meilleur voisin autorisé par la mémoire). Le recuit garde la première, le tabou prend la seconde.

Lire l'effet de la durée sur la machine

Le programme de la section précédente refait cette lecture dans sa seconde partie, sous le commentaire « Suite : l'effet de la durée » : la même recherche de cinquante pas, avec des durées tabou de 0 à 40, en relevant ce que chacune trouve, quand, et combien de solutions différentes elle visite. Il fait aussi jouer l'aspiration sur un départ tiré au hasard. Rien à recopier : la fonction chercher_voisinage, le coût et le voisinage sont ceux de la première partie.

Le tableau qu'imprime cette seconde partie se lit en trois blocs. De 0 à 4 pas de mémoire, la recherche ne dépasse jamais 18 heures : elle ne sort pas du palier, et le nombre de solutions distinctes sur cinquante pas est petit : 5 sans mémoire, 9 avec une mémoire d'un pas, 19 avec une mémoire de quatre. Elle tourne en rond, sur un petit nombre d'ordres, sans jamais sortir de la région. À partir de 5 pas de mémoire, elle trouve 17 heures au pas 11, et cela ne change plus avec des durées plus longues. La dernière colonne montre pourtant que toutes les durées ne se valent pas : le coût courant moyen, de 17,45 heures pour une mémoire de cinq pas, monte à 19,07 pour dix, 26,00 pour vingt-cinq et 40,95 pour quarante. Trop de mémoire empêche la recherche de rester dans la région intéressante : il lui faut prendre, pas après pas, des échanges de plus en plus mauvais parce que les bons sont tabous.

Le second essai montre l'aspiration. Depuis l'ordre tiré au hasard par la graine 17, à 88 heures de retard, avec une mémoire de sept pas, la recherche trouve 17 heures au pas 36 avec l'aspiration, et 18 heures sans. Au pas 36, le meilleur échange était tabou ; comme il donnait une solution meilleure que toutes celles déjà vues, l'aspiration l'a libéré. Sans elle, la recherche s'est privée de ce mouvement-là, et a fini sur le palier à 18 heures. L'aspiration est rare : depuis l'ordre d'écriture, avec des durées de 1 à 15 pas et cent pas, elle ne joue jamais, et sur 2 100 lancements au hasard (300 départs tirés avec les graines 0 à 299, sept durées de 3 à 10 pas, quarante pas chacun, mesurés à part) elle joue dans 77 seulement. Elle change alors le résultat 15 fois : 13 fois en mieux, 2 fois en moins bien.

L'aspiration n'est pas une garantie
Elle libère un mouvement parce qu'il donne la meilleure solution vue, et rien d'autre. Sur les 2 100 lancements mesurés, elle change rarement le résultat (15 fois), et quand elle le change c'est presque toujours en mieux (13 fois sur 15) : un mouvement meilleur sur le moment n'est pourtant pas toujours celui qui mène le plus loin. Les mesures (plusieurs départs, plusieurs durées) tranchent, pas l'intuition.

Sortir d'un piège sur la tournée

Le chapitre sur la recherche locale a laissé une tournée à 647,35 mm de P-217 (T1, T7, T9, T11, T10, T8, T3, T12, T2, T6, T5, T4), obtenue par la descente 2-opt depuis l'ordre d'écriture : un optimum local des trois voisinages, à deux pour cent de l'optimum. Aucune descente n'en sort. La recherche tabou, avec le 2-opt pour voisinage et les deux trous aux extrémités du segment retourné pour attribut, le peut-elle ?

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

Sans mémoire, la recherche fait exactement ce que le raisonnement de la section précédente annonçait : à 649,96 mm au premier pas, elle revient à 647,35 mm au second, puis recommence. Deux solutions, à l'infini. Avec une mémoire d'un ou de deux pas, elle visite un peu plus de solutions (4, puis 6 en soixante pas) sans jamais trouver mieux que 647,35 mm : les interdits expirent avant qu'elle ait pu contourner le creux. Avec trois pas, elle trouve 633,23 mm au pas 20 ; avec quatre et plus, au pas 8. La tournée obtenue est l'optimum de P-217, celui des chapitres précédents. La recherche l'atteint ici en évaluant 65 voisins par pas, soit 520 voisins pour huit pas, alors que la force brute avait 479 001 600 ordres à essayer. Regarder les coûts du parcours avec une mémoire de cinq pas : 649,96, 657,03, 669,45, 669,45, 672,90, puis 642,90, 635,83 et 633,23. La recherche s'éloigne de plus de 25 mm de l'optimum local avant de retomber dans un creux plus profond : c'est ce qu'une descente ne fait jamais. Une durée qui sort du piège n'est pas pour autant celle qui explore le plus : avec cinq pas de mémoire, la recherche trouve l'optimum au pas 8, puis tourne en rond sur seize solutions seulement en soixante pas, contre 44 avec quatre pas de mémoire.

Le coût d'un pas est de 65 voisins évalués. Le code ci-dessus recalcule pour chacun la longueur entière de la tournée, treize distances ; le chapitre sur la recherche locale a montré qu'il suffit de quatre distances pour en déduire la variation. Sur soixante trous, le voisinage passe à 1 769 mouvements, et ce raccourci devient nécessaire : le code de la section suivante remplace alors le coût par sa variation.

Sur la grande plaque, honnêtement

Sur P-600, un pas de tabou évalue 1 769 mouvements 2-opt, soit vingt-sept fois plus que sur P-217. Rien n'est écrit d'avance : mieux vaut mesurer que deviner. La méthode de comparaison honnête est celle posée au chapitre sur le recuit simulé : au moins dix graines, la meilleure, la médiane et la pire des valeurs obtenues, un budget égal dans une unité dite, l'écart à l'optimum démontré (2 788,70 mm), et des réglages faits sur d'autres graines que celles qui jugent. Ici, le budget est le nombre de voisins évalués : 200 pas de tabou à 1 769 voisins, soit 353 800 évaluations. Les redémarrages du chapitre sur la recherche locale reçoivent le même budget : autant de descentes complètes, depuis des ordres tirés au hasard, que ce budget en permet, dans les deux variantes du chapitre sur le recuit (la descente au meilleur voisin, et celle qui prend le premier voisin qui raccourcit). Tous les lancements d'une même graine partent du même ordre au hasard.

Il y a deux jeux de graines, et ce n'est pas un détail. La durée tabou est le seul réglage du tabou : le programme l'essaie d'abord sur dix graines de réglage (100 à 109) et garde la meilleure. Puis il juge le tabou ainsi réglé, contre les redémarrages, sur vingt autres graines (0 à 19), jamais vues pendant le réglage. Il note aussi le temps de calcul de chaque méthode.

Ce site arrête un programme Python au bout de huit secondes, et le programme complet, une centaine de lancements, en demande une quarantaine. Le code ci-dessous est donc lancé sur une graine de chaque sorte, pour voir le mécanisme ; les deux lignes qui fixent les graines, REGLAGE et JUGEMENT, deviennent range(100, 110) et range(20) dans le programme complet, dont le tableau qui suit est le résultat, calculé à part, sur un Python installé.

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

Le programme complet donne, sur les vingt graines de jugement, les résultats suivants (les temps de calcul dépendent de l'ordinateur) :

MéthodeMeilleureMédianePireÉcart de la médiane à l'optimum
Redémarrages, meilleur voisin2 819,962 877,672 960,843,2 %
Redémarrages, premier voisin2 817,512 869,862 959,672,9 %
Tabou, durée 30, 200 pas (353 800 évaluations)2 788,702 857,932 931,022,5 %
Tabou, durée 30, 125 pas (221 125 évaluations)2 788,702 874,382 968,323,1 %

Le réglage. Sur les dix graines de réglage, une mémoire de 5 pas est nettement moins bonne (médiane 2 881,90 mm, à 3,3 % de l'optimum) que 30 ou 90 pas (2 838,97 et 2 856,28 mm, à 1,8 % et 2,4 %). Le programme retient 30 pas, la médiane la plus basse des trois. Il n'y a pourtant rien à conclure de l'écart entre 30 et 90 pas : la durée de 30 pas, mesurée à part sur cinq lots de dix graines (0 à 9, 10 à 19, 20 à 29, 100 à 109 et 110 à 119), donne des médianes de 2 838 à 2 874 mm, et les 17 mm qui séparent 30 et 90 pas sont de cet ordre. Sur cette plaque, les bonnes durées forment une plage large, de 30 à 90 pas pour 1 769 voisins, et seule une durée trop courte perd, comme sur la machine.

Le jugement, à évaluations égales. Le tabou réglé a la médiane la plus basse (2 857,93 mm, à 2,5 % de l'optimum, contre 3,2 % et 2,9 % pour les redémarrages), sa meilleure valeur atteint l'optimum et sa pire (2 931,02 mm) est meilleure que celles des redémarrages. Mais l'avance sur la médiane est de 12 à 20 mm, et graine par graine le tabou fait mieux que les redémarrages sur 13 graines seulement sur 20, dans les deux variantes : un pile ou face donnerait 13 ou plus environ une fois sur huit. C'est une avance plausible, pas établie.

Le jugement, à temps de calcul égal. L'avance disparaît. Chaque voisin évalué passe aussi par la mémoire (sa clé, la consultation du dictionnaire) : à nombre égal de voisins évalués, le tabou demande de l'ordre d'une fois et demie plus de temps que la descente (dernière colonne du programme, de 1,3 à 1,9 fois selon les mesures et l'ordinateur, mesurées par le programme complet). Avec 125 pas au lieu de 200, il met à peu près le même temps que les redémarrages, et sa médiane (2 874,38 mm) se range entre les leurs. Le classement dépend de l'unité du budget, évaluations ou secondes, comme le montre aussi le chapitre sur le recuit.

Une leçon de méthode : ne pas régler et évaluer sur les mêmes tirages. Choisir la meilleure de trois durées sur cinq graines, puis annoncer le résultat sur ces mêmes cinq graines, c'est annoncer le meilleur de trois essais : le hasard de ces graines a désigné la durée, et il est compté comme un mérite de la méthode. Ici, la durée de 30 pas fait 1,8 % de l'optimum sur les graines qui l'ont choisie et 2,5 % sur les graines de jugement. Cet écart ne prouve pas à lui seul un excès d'optimisme, d'autres lots de graines auraient pu donner l'inverse, mais il montre la taille du hasard des graines, et pourquoi le chiffre du jugement est le seul à annoncer.

Ce que ces chiffres autorisent à dire : sur P-600, à 353 800 évaluations et avec une durée réglée à part, le tabou est un peu devant les redémarrages sur la médiane, sans que vingt graines l'établissent, et cette avance ne survit pas à un budget compté en secondes. Ce qu'ils n'autorisent pas : dire que 30 est la bonne durée, que le tabou bat les redémarrages en général, ou que le résultat vaut pour une autre plaque, un autre voisinage ou un autre budget. Les budgets et les graines ne sont pas non plus ceux du chapitre sur le recuit (300 000 évaluations, dix graines) : ces deux tableaux ne permettent pas de comparer le tabou et le recuit, il faudrait une comparaison faite pour eux deux, avec le même budget, les mêmes graines et le même soin de réglage. Pour trancher, il faudrait plus de graines, plusieurs plaques et plusieurs budgets.

Régler la durée tabou
Aucune formule ne remplace la mesure, mais un ordre de grandeur guide la première tentative : quelques unités pour un voisinage de quelques dizaines de mouvements, quelques dizaines pour un voisinage de quelques milliers. Lancer alors la recherche avec des durées qui encadrent cette valeur (la moitié, le double), sur au moins dix graines de réglage, à part de celles qui jugeront, et regarder la médiane. Si la médiane est encore meilleure avec la durée la plus longue, essayer plus long ; si elle se dégrade des deux côtés, on est entre les deux. Un écart de quelques millimètres entre deux durées voisines n'est pas un résultat : le réglage se trouve sur un plateau, et on en prend le milieu.

Les erreurs d'un débutant

Un attribut qui ne reconnaît pas le retour
Rendre tabou la paire (a, b) quand on échange a et b, puis chercher (b, a) au moment de défaire, ne reconnaît pas le retour : les deux clés sont différentes. La liste est bien remplie et la recherche revient sur ses pas quand même. Il faut normaliser l'attribut, par exemple en le triant : tuple(sorted((a, b))).
Oublier de vider la liste
Une liste tabou qui ne perd jamais rien finit par tout interdire : la recherche s'appauvrit, puis se bloque. L'interdit doit avoir une date de fin, ce que fait le dictionnaire interdit_jusqua du code, ou une file de longueur fixée.
Comparer l'aspiration au coût courant
L'aspiration se compare à la meilleure solution vue, jamais à la solution courante : autrement, le retour vers la solution qu'on vient de quitter passe le critère chaque fois que la solution courante est moins bonne, et la mémoire ne sert plus à rien.
Rendre la dernière solution
La recherche tabou ne s'arrête pas sur son meilleur : elle continue de bouger, et sa dernière solution est souvent moins bonne que la meilleure vue. Ce qu'on rend, c'est la meilleure vue.
Un budget qui n'est pas égal
Un pas de tabou coûte tout un voisinage, un tirage du recuit une seule évaluation. Comparer « 200 pas de tabou » à « 200 tirages » compare un travail à un autre qui vaut cent fois moins. Comparer des méthodes, c'est comparer à voisins évalués égaux, et vérifier ce que donne le même budget en secondes : un voisin du tabou coûte plus de temps qu'un voisin de la descente, et la conclusion peut en dépendre.
Régler et juger sur les mêmes graines
Essayer plusieurs durées sur quelques graines, garder la meilleure et annoncer son résultat sur ces mêmes graines, c'est annoncer le meilleur de plusieurs essais : le hasard des graines a choisi la durée, et il passe pour un mérite de la méthode. Le réglage se fait sur des graines, le jugement sur d'autres, jamais vues pendant le réglage, au moins dix des deux côtés.
Vérification rapideon peut se reprendre

1.La recherche tabou vient de quitter la solution S pour un voisin S' moins bon. Le voisin suivant qu'elle prend est le meilleur voisin autorisé de S'. Pourquoi ne revient-elle pas à S, alors que S est probablement le meilleur voisin de S' ?

2.Une recherche tabou a une durée de 1 pas et tourne en rond : elle visite peu de solutions différentes. Que faire ?

3.Un mouvement est tabou, mais il donne une solution meilleure que toutes celles rencontrées jusque-là. Que fait la recherche avec le critère d'aspiration ?

Exercices type

Pourquoi mémoriser l'attribut d'un mouvement plutôt que la solution entière ?

Parce que l'attribut interdit toute une famille de solutions, celles qu'on obtient en défaisant ce mouvement, alors que mémoriser une solution n'interdit que cette solution. Sur soixante trous, la recherche peut tourner autour d'une même région en visitant des tournées toutes différentes les unes des autres, et une liste de solutions entières ne verrait rien. Un attribut, comme la paire de trous aux extrémités d'un segment, se mémorise en deux entiers et se retrouve en une consultation de dictionnaire.

Combien de voisins la recherche tabou évalue-t-elle en 200 pas sur P-600 ?

Un voisinage 2-opt de soixante trous compte 60×59/2−1=1 76960 \times 59 / 2 - 1 = 1\,769 mouvements, évalués à chaque pas : 200×1 769=353 800200 \times 1\,769 = 353\,800 voisins. C'est le budget du code de la section précédente, et celui qu'on donne aux redémarrages pour une comparaison honnête.

La durée tabou atteint ou dépasse la taille du voisinage. Que se passe-t-il ?

Chaque pas rend tabou un mouvement nouveau. Après autant de pas que le voisinage compte de mouvements, tous sont tabous en même temps, aucun n'est autorisé et la recherche est bloquée, sauf si l'aspiration en libère un. Sur trois ordres, où le voisinage compte trois échanges, une durée de 30 pas sans aspiration bloque la recherche après trois pas.

Que rend la recherche tabou : sa dernière solution ou la meilleure vue ?

La meilleure vue. La recherche ne s'arrête pas sur son meilleur, elle continue de se déplacer, y compris vers des voisins moins bons. C'est pourquoi le squelette garde une variable meilleure à côté de courante, mise à jour à chaque pas où le coût courant bat le meilleur coût vu.

Quelle différence entre le recuit simulé et la recherche tabou pour sortir d'un optimum local ?

Le recuit accepte, avec une probabilité, un voisin moins bon tiré au hasard : il sort par le hasard, sans mémoire. La recherche tabou examine tout le voisinage et prend le meilleur voisin autorisé : elle sort par la règle du meilleur voisin quoi qu'il arrive, et évite de retomber grâce à la mémoire. Le recuit utilise la première forme du squelette, le tabou la seconde. Le premier est un tirage par pas, le second un balayage par pas : à budget égal, le tabou fait beaucoup moins de pas.

La méthode

  1. Choisir la représentation et le voisinage, comme pour une descente, et compter les voisins.
  2. Choisir l'attribut du mouvement : le plus fin qui reconnaît un retour en arrière (la paire d'éléments échangés, les extrémités d'un segment retourné). Le normaliser, pour que le retour ait la même clé que l'aller.
  3. Écrire le voisinage comme un générateur de couples (attribut, voisin).
  4. Fixer la durée tabou par rapport à la taille du voisinage, en pas, et tenir la mémoire à jour : un dictionnaire attribut -> dernier pas interdit.
  5. Écrire le pas : examiner tout le voisinage, écarter les mouvements tabous sauf aspiration (comparée à la meilleure solution vue), prendre le meilleur, même moins bon, l'inscrire dans la mémoire.
  6. Garder la meilleure solution vue et la rendre, pas la dernière.
  7. Régler, puis juger : essayer plusieurs durées sur au moins dix graines de réglage, garder la meilleure, puis juger sur d'autres graines (au moins dix, vingt si le calcul le permet), à budget égal en voisins évalués, contre des redémarrages dans leurs deux variantes. Rendre la meilleure, la médiane, la pire, et regarder aussi le temps de calcul.
  8. Juger par une borne ou un optimum connu, et annoncer l'écart.

Synthèse

  • La descente s'arrête sur un optimum local. La recherche tabou en sort en prenant toujours le meilleur voisin, même moins bon, et en gardant la meilleure solution vue.
  • Sans mémoire, cette règle cycle : elle revient à la solution qu'elle vient de quitter, puis y retourne. Sur P-217, deux solutions à 649,96 et 647,35 mm, à l'infini.
  • La liste tabou mémorise l'attribut du mouvement pris, pas la solution entière : la paire d'éléments échangés, les deux trous aux extrémités d'un segment. Il faut le normaliser pour que le retour en ait la même clé que l'aller.
  • La durée tabou est le nombre de pas d'un interdit. Trop courte, la recherche tourne en rond (sur la machine, 18 heures sans sortie jusqu'à 4 pas de mémoire, 17 heures à partir de 5). Trop longue, elle s'interdit trop (le coût courant moyen passe de 17,45 à 40,95 heures) et peut se bloquer.
  • Le critère d'aspiration lève un interdit si le mouvement donne une solution strictement meilleure que la meilleure vue.
  • Le squelette a deux formes. La forme 1, chercher(initiale, voisin, cout, accepter, iterations), tire un voisin (descente aux tirages, recuit). La forme 2, chercher_voisinage(initiale, voisinage, cout, iterations, duree_tabou), examine tout un voisinage de couples (attribut, voisin) (descente au meilleur voisin, tabou).
  • Sur P-217, un tabou 2-opt sort du piège à 647,35 mm et trouve 633,23 mm, l'optimum. Sur P-600, à 353 800 voisins évalués, un tabou réglé sur d'autres graines (30 pas) a une médiane de 2 857,93 mm sur vingt graines, contre 2 877,67 et 2 869,86 mm pour les deux variantes de redémarrages : une avance modeste, que vingt graines n'établissent pas, et qui disparaît à temps de calcul égal.
  • Comparer des méthodes, c'est au moins dix graines, la meilleure, la médiane et la pire, un budget égal dans une unité dite (évaluations ou secondes, la conclusion peut changer), et des réglages faits sur d'autres graines que celles qui jugent.

Et ensuite

La recherche tabou explore avec une mémoire à court terme et sans hasard. Le recuit simulé explore avec un hasard maîtrisé et sans mémoire. Les chapitres suivants sortent du moule commun : au lieu d'une solution qu'on retouche, une population de solutions qui se croisent ou qui se laissent guider par des traces. Pour la représentation et le coût, le chapitre 1 ; pour les voisinages et la descente, la recherche locale ; pour juger une valeur sans connaître l'optimum, les bornes.

Mettre en pratique

Écrire un voisinage qui nomme ses mouvements, débusquer une liste tabou qui ne reconnaît pas le retour, et chiffrer ce qu'une durée tabou interdit.

Tous les exercices sur la recherche tabou