F[X_] = Abs[X[[1]]] + Abs[X[[2]]]; g[T_] = N[T^0.99];
Recuit[F_, g_,Xi_,Ti_,Tf_,Ampli_,MaxTconst_,itermax_]:= Module[{T,Xopt,iter=1,DF,p,L,X,compteur}, X = Xi; T = Ti; L = {Xi}; Xopt = X; While [T > Tf && iter < itermax, compteur = 1; While[compteur < MaxTconst, Y = X + Table[Ampli*Random[Real, {-1, 1}], {i, 1, Length[X]}]; DF = F[Y] - F[X]; If[DF < 0, X = Y; AppendTo[L, X]; If[F[X] < F[Xopt], Xopt = X], p = Random[]; If [p ≤ Exp[-DF/T], X = Y; AppendTo[L, X]]; ]; compteur = compteur + 1; ]; T = g[T]; iter = iter + 1; ]; Return[L] ]; resR = Recuit[F, g, {2, 3}, 10, 1, 0.5, 1.5, 1000]; ListPlot[resR, PlotJoined -> True];
Comme pour toute métaheuristique, la méthode trouve son application dans de nombreux domaines dans lesquels on a à résoudre des problèmes d'optimisation difficile. On peut citer entre autres la conception des circuits électroniques (placement-routage) ou l'organisation de réseaux informatiques.