Le recuit simulé est une métaheuristique inspirée d'un processus utilisé en métallurgie. Ce processus alterne des cycles de refroidissement lent et de réchauffage (recuit) qui tendent à minimiser l'énergie du matériau. Elle est aujourd'hui utilisée en optimisation pour trouver les extrema d'une fonction.
Elle a été mise au point par trois chercheurs de la société IBM, S. Kirkpatrick, C.D. Gelatt et M.P. Vecchi en 1983, et indépendamment par V. Cerny en 1985.
La description des phénomènes physiques et quantiques liés au processus de recuit s'appuie sur la statistique de Boltzmann.
Des études théoriques du recuit simulé ont pu montrer que sous certaines conditions, l'algorithme du recuit convergeait vers un optimum global. Ce résultat est important car il nous assure, contrairement à d'autres métaheuristiques, que le recuit simulé peut trouver la meilleure solution, si on le laisse chercher indéfiniment.
Les preuves de convergence reposent sur le principe de construction de l'algorithme du recuit simulé :
Par ailleurs, les mesures de Gibbs, très utilisées en physique statistique, sont une famille de mesures dépendant d'un paramètre température de telle sorte que lorsque la température tends vers 0, la mesure converge vers un Dirac en un point donné (état d'énergie minimale).
En composant les deux, on obtient une chaîne de Markov qui converge vers une mesure invariante qui évolue dans le même temps vers une mesure désignant l'optimum recherché (au sens de la fonction d'énergie associée à la mesure de Gibbs).
Une analyse fine des vitesses de convergence et des écarts asymptotique permet alors d'aboutir à diverses conditions de convergence, dont celle de Hajek : si le schéma de température utilisé vérifie
En pratique, ce schéma converge beaucoup trop lentement et l'on préfère des températures à décroissance linéaire ou quadratique, quitte à n'obtenir qu'un minimum local (qu'on espère proche du minimum global).
Le recuit simulé s'appuie sur l'algorithme de Metropolis-Hastings, qui permet de décrire l'évolution d'un système thermodynamique. Par analogie avec le processus physique, la fonction à minimiser deviendra l'énergie E du système. On introduit également un paramètre fictif, la température T du système.
Partant d'une solution donnée, en la modifiant, on en obtient une seconde. Soit celle-ci améliore le critère que l'on cherche à optimiser, on dit alors qu'on a fait baisser l'énergie du système, soit celle-ci le dégrade. Si on accepte une solution améliorant le critère, on tend ainsi à chercher l'optimum dans le voisinage de la solution de départ. L'acceptation d'une « mauvaise » solution permet alors d'explorer une plus grande partie de l'espace de solution et tend à éviter de s'enfermer trop vite dans la recherche d'un optimum local.
La solution initiale peut être prise au hasard dans l'espace des solutions possibles. À cette solution correspond une énergie initiale E = E0. Cette énergie est calculée en fonction du critère que l'on cherche à optimiser. Une température initiale T = T0 élevée est également choisie. Ce choix est alors totalement arbitraire et va dépendre de la loi de décroissance utilisée.
À chaque itération de l'algorithme une modification élémentaire de la solution est effectuée. Cette modification entraîne une variation ΔE de l'énergie du système (toujours calculée à partir du critère que l'on cherche à optimiser). Si cette variation est négative (c'est-à-dire qu'elle fait baisser l'énergie du système), elle est appliquée à la solution courante. Sinon, elle est acceptée avec une probabilité
On itère ensuite selon ce procédé en gardant la température constante.
Deux approches sont possibles quant à la variation de la température :
Dans les deux cas, si la température a atteint un seuil assez bas fixé au préalable ou que le système devient figé, l'algorithme s'arrête.
La température joue un rôle important. À haute température, le système est libre de se déplacer dans l'espace des solutions (
Le pseudo-code suivant met en œuvre le recuit simulé tel que décrit plus haut, en commençant à l'état s0 et continuant jusqu'à un maximum de kmax étapes ou jusqu'à ce qu'un état ayant pour énergie emax ou moins soit trouvé. L'appel voisin(s) génère un état voisin aléatoire d'un état s. L'appel aléatoire() renvoie une valeur aléatoire dans l'intervalle [0, 1]. L'appel temp(r) renvoie la température à utiliser selon la fraction r du temps total déjà dépensé.
s:= s0 e:= E(s) k:= 0 tant que k < kmax et e > emax sn:= voisin(s) en:= E(sn) si en < e ou aléatoire() < P(en - e, temp(k/kmax)) alors s:= sn; e:= en k:= k + 1 retourne s
Les principaux inconvénients du recuit simulé résident dans le choix des nombreux paramètres, tels que la température initiale, la loi de décroissance de la température, les critères d'arrêt ou la longueur des paliers de température. Ces paramètres sont souvent choisis de manière empirique.