Aller au contenu principal

Le recuit simulé

Ce que ce chapitre apporte8 points
  • Expliquer pourquoi accepter parfois un voisin moins bon permet de sortir d'un optimum local.
  • Écrire la règle d'acceptation exp(-Δ / T), et lire ce qu'elle accepte selon la température.
  • Montrer que le recuit est le squelette chercher du chapitre 5 dont seule la fonction accepter change.
  • Régler la température initiale en mesurant la proportion de dégradations acceptées au départ, choisir une décroissance géométrique et un arrêt.
  • Reconnaître une température trop chaude (une marche au hasard) et trop froide (une descente).
  • Comparer deux méthodes aléatoires honnêtement : plusieurs graines, meilleure, médiane et pire, budget égal, écart à l'optimum.
  • Constater que la conclusion dépend de l'unité du budget : à évaluations égales, le recuit devance les redémarrages sur la grande plaque, à durée égale son avance fond ou disparaît selon le programme.
  • Constater qu'aucune méthode ne gagne partout : le recuit ne l'emporte pas sur la petite affectation.
La descente du chapitre précédent est rapide, et elle a un défaut de caractère : elle ne consent jamais à perdre. Sur la plaque P-217 de Valdrome Mécanique, une tournée à 647,35 mm est un creux dont aucune retouche simple ne sort, alors que la meilleure tournée en mesure 633,23. Pour en sortir, il faudrait d'abord rallonger la tournée, puis trouver mieux plus loin. Le recuit simulé fait exactement cela, en acceptant parfois un voisin moins bon, de moins en moins souvent à mesure que la recherche avance. Il ne change presque rien au code du chapitre 5 : une seule fonction, celle qui décide d'accepter. Ce chapitre montre laquelle, comment la régler en mesurant plutôt qu'en devinant, et pose surtout la méthode qui servira à tout le reste du parcours : une méthode qui tire au hasard ne se juge pas sur un tirage, elle se juge sur plusieurs, à budget égal dans une unité dite, avec l'écart à l'optimum.

Sortir d'un creux

Le chapitre sur la recherche locale a fini sur un constat : une descente s'arrête dans le premier creux qu'elle rencontre, et elle n'en sort pas, puisque sortir d'un creux demande de passer par des tournées plus longues. Les redémarrages contournent la difficulté par la force : ils repartent d'ailleurs, sans rien apprendre des essais précédents. Il existe une autre réponse, parfois plus économe : rester dans la même recherche, et s'autoriser de temps en temps un pas en arrière.

L'idée n'est pas neuve, et l'atelier la connaît. Un métal forgé se durcit, et ses défauts s'y figent : pour le rendre travaillable, on le recuit. On le chauffe assez pour que sa structure interne redevienne mobile, puis on le refroidit lentement. Pendant que la pièce est chaude, la matière se réarrange sans arrêt, y compris vers des états moins favorables, et c'est ce désordre qui lui permet de ne pas rester coincée dans un mauvais arrangement. En refroidissant, ces écarts deviennent de plus en plus rares, et la pièce se fige dans un arrangement très ordonné, en général bien meilleur que celui où l'aurait laissée une trempe, un refroidissement brutal, qui fige tout de suite le premier arrangement venu. La trempe est la descente, le recuit lent est la méthode de ce chapitre.

La transposition tient en trois correspondances. La solution courante est la pièce. Le coût est son énergie, celle qu'on veut minimiser. La température dit combien de désordre on tolère : haute, presque toutes les dégradations passent ; basse, presque aucune. Il ne reste qu'à écrire ce que « tolérer » veut dire, et c'est la règle suivante.

La règle d'acceptation

Règle d'acceptation du recuit

À chaque itération, on tire un voisin de la solution courante et on mesure Δ\Delta, le coût du voisin moins le coût de la solution courante. Une valeur négative est une amélioration, une valeur positive une dégradation.

  • Si Δ≤0\Delta \le 0, le voisin est accepté.
  • Si Δ>0\Delta > 0, il est accepté avec la probabilité p=e−Δ/Tp = e^{-\Delta / T}, où TT est la température, exprimée dans la même unité que le coût (des millimètres pour une tournée). En pratique, on tire un nombre uu dans [0 ;1[[0\,;1[ et on accepte quand u<pu < p.

Cette règle vient de la physique statistique (Metropolis et ses coauteurs, 1953) ; Kirkpatrick, Gelatt et Vecchi (1983), puis Černý (1985), en ont fait une méthode d'optimisation. Son code tient en trois lignes, mais le comportement se lit mieux sur un tableau. Il donne la probabilité d'accepter une dégradation de Δ\Delta millimètres à la température TT.

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

Trois lectures à retenir. D'abord, seul le rapport Δ/T\Delta / T compte : 50 mm à T=100T = 100 et 5 mm à T=10T = 10 passent avec la même probabilité, 0,61. La température n'est pas un nombre magique, c'est une échelle, à comparer aux dégradations que le problème produit. Ensuite, une petite dégradation passe souvent à chaud (5 mm à T=30T = 30 passe 85 fois sur 100) et presque jamais à froid (20 mm à T=1T = 1 ne passe pas). Enfin, une grosse dégradation ne passe qu'à chaud : 300 mm à T=30T = 30, jamais ; à T=300T = 300, 37 fois sur 100.

Les deux extrêmes se comprennent d'eux-mêmes. À température presque nulle, aucune dégradation ne passe, et le recuit est une descente. À température énorme, tout passe, et le recuit est une marche au hasard qui n'améliore rien. Le recuit vit entre les deux, en partant chaud pour explorer et en finissant froid pour se poser.

Ce qu'une température accepte

  • 1.

    Une dégradation de 20 mm est proposée à la température de 30 mm. Quelle est la probabilité de l'accepter, en pourcentage ?

  • 2.

    Une dégradation de 100 mm est proposée à la température de 100 mm. Quelle est la probabilité de l'accepter, en pourcentage ?

  • 3.

    À quelle température une dégradation de 50 mm est-elle acceptée une fois sur deux, en mm ?

Une dégradation, pas seulement un écart
La règle s'écrit pour un coût qu'on minimise : Δ\Delta est positif quand le voisin est moins bon. Pour une quantité qu'on maximise, comme la marge des commandes, le sens s'inverse : la dégradation est la marge perdue, marge actuelle moins marge du voisin. Écrire la règle sans se demander ce qu'est une dégradation dans le problème est l'erreur de signe la plus courante, et elle donne un recuit qui accepte tout.

Le recuit, c'est le squelette avec une autre règle

Le squelette chercher(initiale, voisin, cout, accepter, iterations) du chapitre 5 a quatre étapes : tirer un voisin, le mesurer, décider de l'accepter, retenir la meilleure solution vue. Le recuit ne touche à aucune des quatre. Il ne change que ce que fait la troisième, c'est-à-dire la fonction accepter. Voici les deux règles côte à côte, et le programme qui applique la même charpente aux trois problèmes du chapitre précédent : la tournée, la machine, les postes.

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

Le tableau qui s'affiche met face à face la descente et le recuit, mêmes graines, mêmes nombres d'itérations. La descente redonne les résultats du chapitre 5 (633,23 ou 645,65 mm pour la tournée, de 17 à 20 heures de retard pour la machine, de 99 à 112 minutes pour les postes). Le recuit trouve 633,23 mm sur quatre graines sur cinq, 17 heures de retard sur les cinq, et 95 minutes, l'optimum, sur trois graines sur cinq. La cinquième graine de la tournée retombe dans le piège du chapitre 5 : 647,35 mm. Rien ne garantit la sortie d'un creux, on la rend seulement probable. Chaque ligne du recuit rappelle aussi sa température finale, le centième de T0T_0 : le refroidissement a bien eu lieu.

Trois détails du code méritent l'attention.

  • Ce qui change tient en une fonction. chercher est recopié tel quel. Passer de seulement_si_meilleur à recuit(T0, refroidissement, graine) est le seul geste, dans l'appel :

    DescenteRecuit
    règle passée à chercherseulement_si_meilleurrecuit(T0, r, graine)
    mémoireaucunela température, qui baisse à chaque appel
    hasardaucunun nombre tiré pour chaque dégradation
  • La température vit dans la règle. Elle baisse à chaque appel, et la fonction interne doit s'en souvenir d'un appel à l'autre : c'est le sens de etat = {"T": T0}, un petit carnet que la fonction accepter emporte avec elle et qu'elle modifie à chaque appel, sans que chercher en sache rien. Il reste consultable après coup, dans accepter.etat.

  • chercher rend la meilleure solution vue, pas la courante. C'est capital pour le recuit : tant qu'il fait chaud, la solution courante s'éloigne de la meilleure, et la solution où la recherche s'arrête n'est pas forcément la meilleure rencontrée. La quatrième étape du squelette, qui semblait un détail pour la descente, devient ici la moitié de la méthode.

Ce qui reste, ce qui change
Le squelette du chapitre 5 sert tel quel : initiale, voisin, cout, et le suivi de la meilleure solution. Le recuit change accepter : un voisin moins bon passe avec la probabilité exp(-delta / T), et T baisse d'un facteur constant à chaque itération. Rien d'autre.

Les trois réglages

Le code laisse trois choses à décider. Ce sont les seuls réglages du recuit, et le chapitre les traite dans cet ordre.

La décroissance. La température doit baisser. La forme la plus courante est la décroissance géométrique : la température est multipliée par un même facteur α\alpha, un peu inférieur à 1, à chaque itération, donc Tk=T0 αkT_k = T_0 \, \alpha^k. Ce facteur n'est pas ce qu'on choisit d'abord : on choisit où la température doit arriver, par le rapport T0/TfT_0 / T_f de la température initiale à la température finale, et en combien d'itérations, et α\alpha s'en déduit, α=(Tf/T0)1/N\alpha = (T_f / T_0)^{1/N}. C'est ce que fait refroidissement_pour dans le code plus haut : « diviser la température par un rapport de cent en NN itérations ». La décroissance géométrique perd beaucoup de température en valeur absolue au début, quand elle est élevée, et très peu à la fin, là où la recherche a besoin de temps pour se stabiliser.

L'arrêt. Ici, le recuit s'arrête après un nombre fixé d'itérations, le budget. C'est le choix le plus simple, et surtout le seul qui rende deux méthodes comparables : on ne compare pas deux recherches sans savoir combien chacune a travaillé. Le budget fixe aussi la température finale : avec un rapport de cent, la température finale est le centième de la température initiale, et les dernières itérations ressemblent à une descente, ce qui est voulu. Le rapport compte moins que la température initiale, et se règle aussi par la mesure, ce que fait la section suivante.

La température initiale. C'est le réglage qui décide de tout, et le plus facile à mal faire. Trop froide, le recuit est une descente qui perd son temps à quitter des creux qu'il ne quittera pas. Trop chaude, il erre au hasard pendant le premier tiers de son budget, sans rien construire. La bonne valeur dépend de la taille des dégradations que le problème produit, en millimètres pour la tournée, en minutes pour les postes : un nombre choisi à l'œil pour une plaque ne vaut pas pour l'autre. Une règle simple existe : régler la température de départ pour qu'une proportion donnée des dégradations soit acceptée au début. Cela ramène un réglage en millimètres à un réglage en pourcentage, plus facile à comparer d'un problème à l'autre. La section suivante le mesure. Avant cela, la figure fait sentir ce que ces deux curseurs changent.

Le recuit sur la plaque P-600

La figure suivante fait régler et lancer le recuit sur la plaque P-600, soixante trous, à partir du plus proche voisin. Les deux curseurs sont la température initiale et la vitesse de refroidissement. Chaque lancer tire une graine neuve : deux tirages ne se ressemblent pas, et c'est voulu. Les chiffres du texte viennent de graines fixées et se rejouent en Python ; ceux de la figure changent à chaque lancer et ne se rejouent que dans la figure. Aucune référence n'est donnée avant l'essai.

Le recuit simulé, réglé et regardé60 trous, départ : le plus proche voisin
Budget (itérations, ou voisins évalués)
Itération
0
Température
50 mm
Coût courant
3588,9 mm
Meilleur vu
3588,9 mm
Dégradations acceptées
aucune

Trait épais : la meilleure tournée vue. Pointillés : la tournée courante, qui se dégrade parfois. Départ : le losange.

Les coûts se tracent ici.

Coût en mm selon l'itération. Trait fin : le coût courant, qui monte tant qu'il fait chaud. Trait épais : le meilleur coût vu, qui ne remonte jamais.

Température (mm)

500

Dégradations acceptées (part)

100 %0
Un point par tirage terminé.

Le trait vertical marque la médiane de chaque rangée. Les résultats plus courts sont à gauche.

Régler T0 et la vitesse, puis lancer un tirage. Chaque lancer tire une graine neuve : deux tirages ne se ressemblent pas.
Le recuit simulé sur P-600 : deux curseurs, des tirages au hasard. Chaque lancer tire une graine neuve.
À manipuler
Lancer un tirage avec les réglages du départ et regarder trois choses : le coût courant (trait fin) qui monte et descend tant qu'il fait chaud, puis se calme, le meilleur coût (trait épais) qui ne remonte jamais, et la part de dégradations acceptées qui s'effondre avec la température. Puis baisser T0 à quelques millimètres : le recuit devient une descente, la courbe fine colle à la courbe épaisse, et le résultat est presque toujours moins bon. La monter jusqu'à quelques centaines de millimètres : la courbe fine s'envole et la part de dégradations acceptées reste haute bien plus longtemps, mais le résultat final ne change presque pas, c'est le plateau. La monter vers le bout du curseur, à 800 mm et au-delà, seulement : la tournée se défait, le budget s'épuise à errer, et le résultat des dix tirages se dégrade de quelques pour cent. Changer ensuite la vitesse de refroidissement, à budget fixé. Enfin, cliquer « Relancer dix tirages » : les points s'étalent, deux tirages de mêmes réglages ne donnent pas le même résultat, et c'est cette dispersion qu'il faut lire. « Dix séries de redémarrages à évaluations égales » ajoute la méthode du chapitre 5 sur la même échelle. Quand un réglage paraît satisfaisant, cliquer « Comparer à la meilleure connue ».

Régler en mesurant

Le code suivant règle la température initiale par la mesure. Il engendre P-600, part du plus proche voisin, tire mille voisins par 2-opt et note les dégradations qu'ils produisent. Une petite fonction trouve alors la température qui fait accepter, en moyenne, une proportion donnée de ces dégradations : il suffit de chercher, par dichotomie, la température pour laquelle la moyenne des e−Δ/Te^{-\Delta/T} vaut la proportion visée. Le code règle ensuite le recuit sur plusieurs proportions, chacune sur dix graines, pour voir laquelle convient, avec un budget réduit qui le garde rapide dans le navigateur.

Une remarque avant la lecture. Le squelette chercher recalcule toute la longueur à chaque tirage, soixante distances. Un 2-opt ne change que deux trajets, et sa variation se calcule avec quatre distances, comme au chapitre précédent. Le code contient donc une version plus rapide du même recuit. Elle change aussi la façon de tirer les deux positions : deux_positions reproduit les tirages de sample(range(n), 2) dès que n dépasse 21, donc les mêmes positions sur les soixante trous de P-600, sans le temps que sample perd à se préparer à chaque appel. Elle est équivalente : le premier affichage compare les deux sur la même graine, et donne exactement le même résultat. Un programme rapide qui n'a pas été comparé à l'original n'est pas une version rapide de l'original, c'est un autre programme.

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

Le plus proche voisin mesure 3 588,87 mm, et les deux versions, à dix mille tirages et la même graine, donnent le même résultat, 2 977,15 mm. Sur les mille voisins tirés, 968 sont des dégradations, de 374 mm en moyenne : ce sont de gros écarts, parce qu'un 2-opt tiré au hasard retourne en général un long segment. Pour que 5 % de ces dégradations soient acceptées en moyenne, il faut une température de 48,1 mm, bien en dessous de la dégradation moyenne : la moyenne des probabilités est tirée par les quelques pour cent de petites dégradations (moins de 50 mm), qui passent une fois sur deux ou plus, alors que les trois quarts des dégradations, de plus de 200 mm, ne passent presque jamais.

La dernière partie du programme règle le recuit à quatre proportions, sur dix graines et 20 000 évaluations seulement, pour tenir dans le temps d'un bloc. Elle donne déjà la forme : trop froid (0,5 %), une médiane à 2 966 mm ; 5 %, 2 915 mm ; 50 %, déjà trop chaud à ce petit budget, 3 054 mm ; trop chaud (80 %), 3 588,9 mm, c'est-à-dire le départ lui-même, rien n'ayant été amélioré sur la moitié des graines au moins. Le tableau suivant est la même boucle au budget des comparaisons, 100 000 évaluations, sur trente graines et quatre réglages de plus (1 %, 2 %, 10 % et 30 %) : plus de vingt millions d'itérations, très au-delà de la limite de temps d'un bloc. Il a été calculé hors du navigateur, avec le même programme en remplaçant BUDGET, GRAINES et la liste des proportions.

Il se lit ainsi (trente graines, 100 à 129, 100 000 évaluations, température finale au centième de T0T_0).

Part des dégradations acceptées au départT0T_0MeilleureMédianePire
0,5 %3,3 mm2 840,6 mm2 938,9 mm3 030,5 mm
1 %9,9 mm2 833,5 mm2 906,2 mm3 035,3 mm
2 %20,9 mm2 808,4 mm2 849,6 mm2 908,6 mm
5 %48,1 mm2 788,7 mm2 841,8 mm2 924,9 mm
10 %86,5 mm2 790,4 mm2 825,8 mm2 938,5 mm
30 %239,4 mm2 794,0 mm2 841,1 mm2 920,8 mm
50 %471,3 mm2 791,4 mm2 853,3 mm2 944,1 mm
80 %1 611,4 mm3 003,3 mm3 155,8 mm3 326,7 mm
  • Trop froid, 0,5 % et 1 % : les médianes montent à 2 938,9 et 2 906,2 mm, on retrouve une descente, dont le chapitre 5 a chiffré le résultat depuis le plus proche voisin, 2 944,01 mm.
  • Trop chaud, 80 % : 3 155,8 mm, une grande part du budget passe à errer. Le recuit fait moins bien que la descente qu'il devait améliorer.
  • De 2 % à 50 %, les médianes vont de 2 825,8 à 2 853,3 mm, un écart de moins de 30 mm, que l'incertitude d'une médiane de trente graines (de l'ordre de 10 à 20 mm) ne permet pas de lire, alors qu'un même réglage donne, d'une graine à l'autre, des résultats qui s'étalent sur 100 à 150 mm. Le réglage se trouve sur un plateau, large, pas sur un point, et on choisit à l'intérieur, pas au bord : ici 5 %.

La règle, souvent citée, d'accepter 80 % des dégradations au départ ne convient pas ici : c'est le plus mauvais des réglages du tableau. Elle peut convenir à d'autres voisinages, dont les dégradations sont petites, comme les postes plus bas ; dix fois plus de budget n'y change rien ici (à un million d'évaluations, 80 % donne encore une médiane de 2 979,1 mm, contre 2 808,7 mm à 5 %, sur trente autres graines). Ce qui convient dépend du problème, du voisinage et du budget, et se trouve par la mesure, pas par une règle apprise.

Le rapport de refroidissement se règle de la même manière, et compte moins : à 5 %, avec un rapport de dix, cent puis mille (RAPPORT dans le programme), les médianes sur trente graines sont de 2 837,5, 2 841,8 et 2 852,0 mm, à quinze millimètres près, un écart que trente graines ne permettent pas de lire. Le rapport de cent est un bon choix par défaut, pas une loi.

Le coût de cette mesure compte aussi. Les mille tirages qui ont servi à mesurer les dégradations sont des évaluations comme les autres : dans le programme, ils sont retirés du budget (99 000 itérations de recuit pour 100 000 évaluations). Une comparaison à budget égal qui oublierait de compter la préparation avantagerait le recuit. La figure, elle, donne cette mesure sans la compter.

Deux pièges à éviter dans un tel réglage. Le premier : les graines qui règlent ne sont pas celles qui jugent. Le tableau ci-dessus utilise les graines 100 à 129, et la comparaison suivante les graines 0 à 9. Régler et juger sur les mêmes graines revient à régler un instrument sur l'échantillon qui doit ensuite servir à le contrôler. (La mesure des dégradations ne juge aucun résultat, elle fixe seulement l'échelle : elle prend la graine 0 ; celle des postes, une graine à part.) Le second : régler avec le même soin les deux méthodes qu'on compare, sinon on compare un réglage bien fait à un réglage bâclé (un T0 = 100 pris à l'œil contre un concurrent soigneusement mis au point ne dit rien sur les méthodes, il mesure la qualité des réglages). La mesure du chapitre coûte mille évaluations et se refait pour chaque problème.

Comparer honnêtement

Une cheffe d'atelier demande simplement : « le recuit est-il meilleur que les redémarrages ? ». La réponse n'est pas un nombre. Le premier constat du chapitre en donne la raison : les cinq résultats du recuit sur la tournée vont de 633,23 à 647,35 mm, les cinq de la descente de 633,23 à 645,65. Avec une graine, on aurait pu conclure ce qu'on voulait. Une méthode qui tire au hasard a une distribution de résultats, et c'est cette distribution qu'on compare.

Comparer deux méthodes aléatoires, en cinq règles
  1. Plusieurs graines. Au moins dix, trente quand le calcul le permet : un plateau ou un écart de quelques pour cent ne se lit pas sur cinq. Un résultat unique est une anecdote.
  2. Meilleure, médiane et pire. Le meilleur seul récompense la chance, le pire seul punit la malchance, la moyenne seule cache la dispersion. Les trois ensemble décrivent la méthode : la médiane dit ce qu'on obtient d'ordinaire, le pire ce qu'on risque, le meilleur ce qu'on peut espérer avec de la patience.
  3. À budget égal, dans une unité dite. Le budget se mesure dans une unité commune à toutes les méthodes : le plus souvent le nombre d'évaluations de solutions, ou le temps de calcul, et le choix de l'unité peut changer la conclusion (voir plus bas). Une méthode à qui l'on a laissé dix fois plus d'itérations gagne presque toujours, ce n'est pas un résultat.
  4. Un écart à une référence. À l'optimum s'il est connu, ou à une borne, ou à défaut à la meilleure solution connue, dite comme telle. Sans référence, « 2 831,9 mm » ne veut rien dire.
  5. Des réglages faits avec le même soin, sur d'autres graines que celles qui jugent.

Le budget peut se compter en évaluations ou en secondes. Les évaluations ne dépendent ni de la machine ni du langage, et c'est pourquoi elles servent ici. Le temps de calcul est plus proche de ce qui intéresse l'atelier, mais il ne se reproduit pas d'une machine à l'autre, et, on va le voir, un même budget en évaluations coûte ici des temps très différents selon la méthode. On peut rapporter les deux, en disant lequel a servi à égaliser.

Sur la grande plaque

Le programme suivant compare le recuit au 2-opt avec redémarrages du chapitre précédent, sur P-600, dont l'optimum, 2 788,70 mm, est démontré. Le budget est de 100 000 évaluations de voisins, dix graines pour chaque méthode, et le programme note aussi le temps de calcul de chacune. Le recuit est réglé à 5 % de dégradations acceptées au départ, à l'intérieur du plateau. Les redémarrages sont mesurés dans deux variantes, descente au meilleur voisin comme dans les figures du chapitre 5, puis descente au premier voisin qui raccourcit : comparer à une seule variante d'un concurrent, c'est risquer de choisir la plus faible. Un bloc du site est interrompu au bout d'environ huit secondes : le programme ne lance donc que le budget de 100 000 évaluations. Les lignes de 300 000 évaluations et d'un million du tableau ont été calculées avec le même programme sur un Python ordinaire, en changeant BUDGETS (un calcul trois fois, puis dix fois plus long).

main.py
Sortie
>_ Prêt à exécuter…
BudgetMéthodeMeilleureMédianePire
100 000recuit2 804,9 (0,6 %)2 850,8 (2,2 %)2 929,2 (5,0 %)
100 000redémarrages, meilleur voisin2 845,7 (2,0 %)3 019,6 (8,3 %)3 104,0 (11,3 %)
100 000redémarrages, premier voisin2 907,0 (4,2 %)3 231,0 (15,9 %)4 129,1 (48,1 %)
300 000recuit2 808,4 (0,7 %)2 831,9 (1,5 %)2 850,4 (2,2 %)
300 000redémarrages, meilleur voisin2 821,6 (1,2 %)2 916,2 (4,6 %)2 969,2 (6,5 %)
300 000redémarrages, premier voisin2 832,9 (1,6 %)2 858,8 (2,5 %)2 940,2 (5,4 %)
1 000 000recuit2 788,7 (0,0 %)2 797,7 (0,3 %)2 839,2 (1,8 %)
1 000 000redémarrages, meilleur voisin2 788,7 (0,0 %)2 849,9 (2,2 %)2 907,0 (4,2 %)
1 000 000redémarrages, premier voisin2 805,2 (0,6 %)2 832,5 (1,6 %)2 882,4 (3,4 %)

Les pourcentages sont les écarts à l'optimum. Ce qu'on en tire :

  • À 100 000 évaluations, les redémarrages ne finissent même pas une descente : une descente depuis un ordre tiré au hasard demande une centaine de milliers d'évaluations, et en moyenne 0,1 descente arrive à son optimum local. Le budget est trop court pour eux, pas pour le recuit, dont chaque itération n'évalue qu'un voisin.
  • À 300 000 évaluations, le recuit reste devant sur les trois colonnes : la médiane est à 1,5 % de l'optimum, contre 4,6 % (meilleur voisin) et 2,5 % (premier voisin). Son pire résultat, à 2,2 %, est meilleur que la médiane des deux variantes de redémarrages. Le premier voisin est la variante qui rattrape le plus, l'écart se réduit mais reste.
  • À un million d'évaluations, le meilleur des dix tirages atteint l'optimum pour le recuit et pour les redémarrages au meilleur voisin (0,6 % au premier voisin), mais la médiane et le pire restent nettement meilleurs pour le recuit : 0,3 % et 1,8 %, contre 2,2 % et 4,2 % pour les redémarrages au meilleur voisin, 1,6 % et 3,4 % au premier voisin.

Le constat du million d'évaluations est celui qui justifie la règle 2. À un million d'évaluations, le meilleur des dix tirages ne départage plus le recuit et les redémarrages au meilleur voisin : les deux ont trouvé l'optimum. Un lecteur pressé qui ne regarderait que ce nombre conclurait à l'égalité. Ce sont la médiane et le pire qui montrent que le recuit est plus régulier : on obtient à coup sûr une tournée proche de l'optimum, pas seulement avec de la chance. Refait sur trente graines (0 à 29), hors du navigateur, le classement est le même : médianes à 1,9 %, 1,3 % et 0,6 % de l'optimum pour le recuit à 100 000, 300 000 et un million d'évaluations, contre 6,8 %, 4,2 % et 1,9 % pour les redémarrages au meilleur voisin, 15,9 %, 2,9 % et 1,5 % au premier voisin.

Ce que ce tableau ne démontre pas
Il compare le recuit à deux variantes de redémarrages, sur une plaque, avec un voisinage (le 2-opt), dix graines, et un budget compté en évaluations. Le classement peut changer avec un autre voisinage, une plaque de cinq cents trous, un budget de dix millions, ou une autre unité de budget, comme la suite le montre. Le résultat est solide dans son cadre, et il faut le dire avec son cadre.

Évaluations ou secondes

Toute la comparaison précédente égalise des évaluations. Or une évaluation ne coûte pas la même chose d'une méthode à l'autre, ni d'un programme à l'autre. Dans le programme ci-dessus, une itération de recuit (deux positions tirées, un nombre tiré, une exponentielle, parfois un segment retourné) demande de trois à cinq fois plus de temps, selon l'ordinateur, qu'une évaluation d'un balayage de descente, qui se réduit à quelques additions de distances : les durées de la sortie le montrent. À durée égale, les redémarrages disposent donc de trois à cinq fois plus d'évaluations, environ un million pour les 300 000 du recuit. Le même recuit écrit avec sample, qui donne exactement les mêmes résultats, coûte de dix à seize fois plus qu'une évaluation : quatre millions. Refait à durée égale avec chacune des deux écritures, hors du navigateur, sur trente graines (médianes, en écart à l'optimum) :

BudgetRecuitRedémarrages, meilleur voisinRedémarrages, premier voisin
300 000 évaluations chacun1,3 %4,2 %2,9 %
Même durée, recuit du programme (3 à 5 évaluations par itération) : 1 000 000 évaluations pour les redémarrages1,3 %1,9 %1,5 %
Même durée, recuit écrit avec sample (10 à 16 évaluations par itération) : 4 000 000 pour les redémarrages1,3 %0,9 %0,8 %

À durée égale, l'avance du recuit passe de 1,6 à 2,9 points à 0,2 à 0,6 point avec le programme du chapitre (sur cent trente graines, de 0,3 à 0,4 point : elle reste établie, mais petite), et s'inverse avec l'autre écriture, alors que le recuit rend exactement les mêmes résultats dans les deux cas. Le classement en secondes est donc autant une propriété du programme que de la méthode.

L'unité du budget fait partie de la conclusion
À évaluations égales, le recuit gagne nettement ; à durée égale, son avance fond ou disparaît selon le programme. Les deux mesures sont honnêtes, mais elles ne répondent pas à la même question : la première dit quelle méthode tire le plus de chaque évaluation, la seconde laquelle tire le plus de chaque seconde de machine, et celle-ci dépend du programme et de l'ordinateur autant que de la méthode (une autre écriture du recuit ou des redémarrages change le rapport des coûts, donc le résultat). Il faut choisir l'unité avant de regarder les résultats, la dire dans le tableau, et rapporter les deux quand une évaluation ne coûte pas autant d'une méthode à l'autre. Une conclusion sans son unité de budget ne se vérifie pas.

Sur un second problème : les postes

Le second problème est l'affectation de huit opérateurs à huit postes, de l'optimum connu, 95 minutes (la meilleure de 40 320 affectations). Le voisinage est l'échange de deux postes, 28 voisins, et le budget se compte de la même façon : une itération de recuit est une évaluation, un balayage complet de la descente en coûte 28. Le recuit est mesuré à trois températures, pour montrer ce que son réglage change ; les redémarrages, descentes au meilleur voisin depuis des ordres tirés au hasard, sont comparés à ces trois versions, vingt graines chacune. Les trois réglages sont donnés tous les trois, et aucun n'est choisi après coup pour paraître meilleur. Vingt graines suffisent à voir une grande différence, pas une petite : la suite le dit, avec les chiffres de deux cents graines, calculés hors du navigateur.

main.py
Sortie
>_ Prêt à exécuter…
BudgetMéthodeMédianePireOptimum trouvé
1 000recuit à 5 %991053 fois sur 20
1 000recuit à 20 %98994 fois sur 20
1 000recuit à 50 %959811 fois sur 20
1 000redémarrages959815 fois sur 20
3 000recuit à 5 %991073 fois sur 20
3 000recuit à 20 %98997 fois sur 20
3 000recuit à 50 %959819 fois sur 20
3 000redémarrages959520 fois sur 20

Ici, les redémarrages font au moins aussi bien, à chaque budget, même contre le meilleur des trois réglages du recuit essayés. À 1 000 évaluations, ils trouvent l'optimum 15 fois sur 20 contre 11 : l'écart va dans le même sens que le reste, mais vingt graines ne suffisent pas à l'établir. Refait à part sur deux cents graines, le constat tient : 156 optimums sur 200 pour les redémarrages, contre 115 pour le recuit à 50 %. À 3 000 évaluations, l'écart est d'une graine sur vingt (20 contre 19), ce qui ne prouve rien non plus, les deux méthodes trouvant presque toujours l'optimum ; sur deux cents graines, 199 contre 184. La raison de fond se comprend : il n'y a que 40 320 affectations, une descente complète coûte peu, et 1 000 évaluations en font en moyenne six, 3 000 près de vingt, qui explorent déjà une bonne part du petit espace. Le recuit, lui, a besoin de son budget pour refroidir, et il coûte ici environ deux fois plus de temps par évaluation que les redémarrages : à durée égale, l'écart ne ferait que croître. Sur cette taille, la méthode simple suffit, et le recuit coûte plus de réglage pour un résultat qui ne fait pas mieux.

Deux enseignements, qui ne se contredisent pas. Le premier : un pourcentage se transporte mieux qu'une température, mais pas parfaitement. Sur la plaque, tous les réglages de 2 % à 50 % se valent ; sur les postes, dont les dégradations sont de quelques minutes, 5 % et 20 % sont nettement moins bons que 50 % (sur deux cents graines, à 3 000 évaluations : 19 et 67 optimums, contre 184 à 50 % et de 184 à 187 de 50 % à 95 %). Le plateau n'a ni la même largeur ni la même position, et il faut le mesurer pour chaque problème. Le second, plus important : aucune méthode ne gagne partout. À évaluations égales, le recuit devance les redémarrages sur la grande plaque, où les descentes coûtent cher, et ne l'emporte pas sur la petite affectation, où elles coûtent peu ; et sur la grande plaque même, l'avantage ne survit pas toujours à une durée égale. Une comparaison n'a de sens que pour un problème, une taille, un budget et une unité de budget donnés, et le rôle du chapitre est de donner la méthode pour la mener, pas de désigner un vainqueur.

Autres réglages, autres arrêts

La décroissance géométrique et l'arrêt par budget sont les choix les plus simples, pas les seuls. Plusieurs variantes existent et se lisent d'après ce chapitre.

  • Refroidir par paliers : garder la même température pendant un nombre fixé d'itérations, puis la baisser d'un coup. C'est une forme classique, où l'on règle deux nombres au lieu d'un.
  • Arrêter plus tôt quand la température est trop basse pour accepter la moindre dégradation, ou quand plusieurs milliers d'itérations n'ont rien amélioré. Le budget fixe est plus simple et rend la comparaison possible.
  • Repartir : relancer le recuit depuis la meilleure solution vue, avec une température de départ plus basse. C'est un moyen d'utiliser un budget plus grand quand la première passe n'a plus rien à donner.

Aucune n'est meilleure par principe. Chacune ajoute un réglage, et la méthode pour les juger est celle de ce chapitre. La théorie ne dispense pas de mesurer : un résultat de Hajek (1988) garantit que la probabilité d'être sur un optimum global tend vers 1 si la température baisse comme c/ln⁡kc / \ln k, avec cc au moins égal à la profondeur du creux le plus profond, mais cette décroissance est trop lente pour servir en pratique, et la décroissance géométrique n'a pas cette garantie. Elle se juge par la mesure, comme tout ce chapitre.

Les erreurs d'un débutant

Rendre la solution courante au lieu de la meilleure
Le recuit dégrade parfois la solution courante, et l'arrête là où le budget se termine. Rendre courante plutôt que meilleure donne un résultat qui peut être nettement moins bon qu'une solution traversée en chemin. Pour une descente la différence n'existe pas, pour un recuit elle est constante.
Se tromper de signe
Pour un coût, une dégradation est nouveau - actuel. Pour une marge, c'est actuel - nouveau. Avec le mauvais signe, l'exposant devient positif, la « probabilité » dépasse 1, et tout est accepté : le recuit est une marche au hasard, et rend pourtant un résultat qui semble plausible, tant que la meilleure solution vue est conservée.
Oublier de refroidir
Une température qui ne baisse pas est une température qui n'aide pas à s'arrêter : à température fixe, le recuit erre autour d'un niveau de coût sans jamais s'y poser. Il faut que T soit multipliée dans la règle, à chaque appel, et relire la température à la fin, dans accepter.etat["T"] : elle doit valoir T0 divisée par le rapport.
Vérification rapideon peut se reprendre

1.Un recuit à la température T = 20 mm propose une dégradation de 20 mm. Quelle est la probabilité de l'accepter ?

2.À température presque nulle, que devient le recuit ?

3.Un recuit rend, à la fin, la solution courante et non la meilleure vue. Que risque-t-on ?

4.Un recuit et une descente avec redémarrages sont comparés sur une seule graine chacun. Le recuit donne 2 815 mm et la descente 2 850 mm. Que peut-on conclure ?

Exercices type

Pourquoi une petite dégradation est-elle plus souvent acceptée qu'une grande, à la même température ?

Parce que la probabilité d'acceptation e−Δ/Te^{-\Delta / T} décroît quand Δ\Delta augmente : elle vaut 0,61 pour 50 mm à T=100T = 100, et 0,14 pour 200 mm, à la même température. Une petite dégradation ne fait perdre que peu de terrain et ne demande qu'un petit pas en arrière, une grande demande de renoncer à beaucoup. C'est ce qui donne au recuit sa logique : il escalade volontiers des bosses basses, et pas les hautes.

Un recuit démarre à T0 = 60 mm et refroidit d'un facteur 0,995 par itération. Que vaut la température après 1 000 itérations, et pourquoi la décroissance est-elle dite géométrique ?

60×0,9951000≈0,4060 \times 0{,}995^{1000} \approx 0{,}40 mm. La décroissance est géométrique parce que la température est multipliée par le même facteur à chaque itération : ses valeurs successives forment une suite géométrique de raison 0,995. Elle perd donc de moins en moins en valeur absolue à mesure qu'elle baisse.

Sur un problème, on mesure des dégradations de 10 à 40 mm au départ. Quelle température de départ est raisonnable ?

Une température qui laisse passer une part modeste des dégradations, entre 5 % et 30 % environ. Ici, 20 mm convient : une dégradation de 10 mm y passe 61 fois sur 100, une de 40 mm 14 fois sur 100, et, si les dégradations se répartissent régulièrement de 10 à 40 mm, 31 % d'entre elles en moyenne, ce qui laisse explorer sans errer. Ce n'est pas la dégradation moyenne, seulement une fraction d'elle : une température de 1 000 mm accepterait tout, une de 0,1 mm rien. La bonne méthode reste de mesurer les dégradations, puis de viser un pourcentage d'acceptation.

À évaluations égales, un recuit devance des redémarrages sur une grande plaque. Peut-on en conclure qu'il fera mieux à durée égale ?

Non. Dans le programme du chapitre, une itération de recuit demande de trois à cinq fois plus de temps qu'une évaluation d'un balayage de descente : à durée égale, les redémarrages disposent de trois à cinq fois plus d'évaluations, et l'avance du recuit fond (médianes à 1,3 % de l'optimum pour le recuit, 1,9 % et 1,5 % pour les redémarrages à un million d'évaluations). Avec une autre écriture du même recuit, dix à seize fois plus lente par évaluation, elle s'inverse. Le classement dépend de l'unité du budget, qu'il faut choisir avant de regarder les résultats et dire dans le tableau.

La méthode

  1. Partir du squelette chercher du chapitre 5 : représentation, voisin, coût. Ne changer que accepter.
  2. Écrire la dégradation dans le sens du problème : nouveau - actuel pour un coût, actuel - nouveau pour une marge.
  3. Accepter une amélioration toujours, une dégradation avec la probabilité e−Δ/Te^{-\Delta/T}, en tirant un nombre.
  4. Refroidir géométriquement : T←α TT \leftarrow \alpha\,T à chaque itération, avec α\alpha déduit de la température finale et du budget.
  5. Mesurer les dégradations au départ, et régler T0T_0 pour qu'une proportion donnée soit acceptée. Essayer plusieurs proportions sur d'autres graines que celles qui jugeront.
  6. Rendre la meilleure solution vue, pas la courante.
  7. Comparer : plusieurs graines, meilleure, médiane et pire, budget égal dans une unité dite (évaluations, préparation comprise, ou durée), écart à l'optimum ou à une borne, méthode concurrente réglée avec le même soin, et le cadre de la comparaison dit.
  8. Ne rien généraliser au-delà du problème, de la taille et du budget mesurés.

Synthèse

  • Le recuit simulé accepte parfois un voisin moins bon, avec la probabilité e−Δ/Te^{-\Delta/T}, pour sortir des optimums locaux ; la température TT s'exprime dans l'unité du coût.
  • Seul le rapport Δ/T\Delta / T compte : une petite dégradation passe souvent à chaud et presque jamais à froid. À température presque nulle, c'est une descente ; à température énorme, une marche au hasard.
  • Le recuit est le squelette chercher du chapitre 5 où seule la fonction accepter change, et qui rend la meilleure solution vue, pas la courante.
  • Trois réglages : la température initiale, mesurée pour accepter une proportion donnée des dégradations au départ (sur P-600, un large plateau de 2 % à 50 %, pas 80 %) ; la décroissance géométrique, Tk=T0αkT_k = T_0 \alpha^k ; l'arrêt par budget.
  • Une méthode aléatoire se juge sur plusieurs graines : meilleure, médiane, pire ; à budget égal, dans une unité dite (évaluations, préparation comprise, ou durée) ; avec l'écart à l'optimum ou à une borne ; réglages faits avec le même soin sur d'autres graines.
  • Sur P-600 (optimum 2 788,70 mm), à évaluations égales, le recuit devance les redémarrages : à 300 000 évaluations, sa médiane est à 1,5 % de l'optimum contre 4,6 % pour les redémarrages au meilleur voisin et 2,5 % au premier voisin. À durée égale, l'avance du recuit fond ou disparaît selon le programme : le classement dépend de l'unité du budget.
  • Sur l'affectation, les redémarrages font au moins aussi bien, même contre le meilleur réglage du recuit essayé : aucune méthode ne gagne partout, et le plateau de réglage change d'un problème à l'autre.

Et ensuite

Le recuit ne garde aucun souvenir : pour sortir d'un creux, il s'en remet au hasard, et peut y retomber. Le chapitre suivant garde le squelette, mais échange le hasard contre une mémoire : la recherche tabou prend toujours le meilleur voisin, même moins bon, et s'interdit de revenir en arrière. La méthode de comparaison posée ici, unité du budget comprise, servira pour chacune des méthodes qui suivent. Pour situer ce que vaut une tournée sans connaître l'optimum, les bornes du chapitre 3 servent de règle ; pour le squelette et la descente, la recherche locale.

Mettre en pratique

Écrire la règle d'acceptation pour une marge à maximiser, calculer un calendrier de refroidissement, et attraper un recuit qui rend le dernier ordre vu au lieu du meilleur.

Tous les exercices sur le recuit simulé