Jean Debord
 JDebord@compuserve.com  | 
| >Introduction | 
| >Les méthodes de descente aléatoire pure | 
             Choisir X0 initial ; évaluer F(X0) ; itération r := 0 
             (1) A l'itération r+1, générer un vecteur aléatoire X à partir de Xr 
             si F(X) < F(Xr) alors Xr+1 := X 
             si critère d'arrêt non vérifié alors faire r := r + 1 et aller en (1) 
             si critère d'arrêt vérifié alors arrêter ; (Xr, F(Xr)) est la solution approchée. 
 | l | 
| >Le recuit simulé | 
| >Principe | 
p = exp(-(E2 - E1) / kT) (1)  | l | 
| >Implémentation | 
             Choisir X initial 
             Calculer T0 
             tant que critère d'arrêt non vérifié faire : 
                  m := 0 ; 
                  répéter jusqu'à ce que m = NT (nombre d'itérations à la température T) 
                       Générer un vecteur aléatoire Y voisin de X 
                       dF = F(Y) - F(X) 
                       Appel fonction Accepte(dF, T) 
                       si Accepte est vrai alors X := Y 
                       m := m + 1 
                  fin répéter 
                  Diminuer la température 
             fin tant que 
 | l | 
             si dF < 0 alors 
                  Accepte := vrai 
             sinon 
                  A := exp(- dF / T) 
                  si Random(0, 1) < A alors Accepte := vrai sinon Accepte := faux 
             fin si 
 | l | 
p = exp(- M / T0) = 0,5 d'où: T0 = - M / ln p ~ 1,44 M  | l | 
Tn+1 = RT Tn 
     soit :
Tn= T0 (RT)n       (2)
 | l | 
| >Programmation en Turbo Pascal | 
| >L'unité OPTIM.PAS | 
| >Types et variables globales | 
       type
         TFuncNVar = function(X : PVector) : Float;
 | l | 
| l | Pour la signification du type PVector, voir le cours sur le calcul matriciel. | 
       const
         SA_Nt        : Integer = 50;   { Nb d'itérations à chaque température }
         SA_Cv        : Float   = 0.5;  { Coef. de variation des nombres aléatoires }
         SA_MinSigma  : Float   = 1.0;  { Ecart-type minimal des nombres aléatoires }
         SA_SigmaFact : Float   = 0.1;  { Facteur de réduction global de l'écart-type }
         SA_NCycles   : Integer = 1;    { Nombre de cycles de recuit }
 | l | 
| l | 
 1.Le tirage d'un nouveau vecteur aléatoire à partir du vecteur courant X se fait selon une loi normale centrée sur X et telle que l'écart-type du paramètre xi est donné par : 
 2.En modifiant la valeur de SA_NCycles, on peut effectuer plusieurs cycles de recuit simulé, en recalculant à chaque fois la température initiale. Ceci permet de relancer l'algorithme s'il s'est arrêté à trop grande distance du minimum.  | 
       const
         WriteLogFile : Boolean = False;       { Indique si le fichier doit être écrit ou non }
         LogFileName  : String  = 'OPTIM.LOG'; { Nom du fichier }
 | l | 
| >Procédure de recuit simulé | 
  function SimAnn(Func           : TFuncNVar;
                  X              : PVector;
                  Lbound, Ubound : Integer;
                  MaxIter        : Integer;
                  T_Ratio        : Float;
                  var F_min      : Float) : Integer;
 | l | 
En entrée ------------------------------------------------------------ Func = Fonction à minimiser X = Coordonnées approchées du minimum Lbound = Indice de la première variable Ubound = Indice de la dernière variable MaxIter = Nombre d'étapes de recuit T_Ratio = Rapport de la température finale à la température initiale En sortie ------------------------------------------------------------ X = Coordonnées affinées du minimum F_min = Valeur de la fonction en X  | l | 
| l | 
 1.Le générateur de nombres aléatoires est réinitialisé à chaque appel de la fonction. On obtiendra donc des résultats différents à chaque appel. Il est conseillé de lancer plusieurs fois la fonction et de comparer les résultats. 2.Le facteur de réduction de la température RT est déterminé par les valeurs de MaxIter et T_Ratio selon l'équation (2) : 
 
 3.La fonction retourne toujours 0.  | 
| >Programme de démonstration | 
F(x, y) = x^2 + y^2 - cos(12x) - cos(18y)  | l | 
| l | Figure 1 Graphe de la fonction F(x, y) = x2 + y2 - cos(12x) - cos(18y) (Graphique réalisé avec Maple->LIEN) | 
    x    |  0,0153   |   -0,0025   |    -0,0010  |  -0,0063  |  -0,0022
    y    | -0,0055   |    0,0004   |    -0,0014  |  -0,0033  |  -0,0013
---------|-----------|-------------|-------------|-----------|-----------
    F    |  -1,98    |    -2,00    |     -2,00   |   -2,00   |   -2,00
 | l | 
      |  Marquardt     |    BFGS    |   Simplexe
      |----------------|------------|--------------
x     |    2,06        |   -1,03    |     1,03
y     |   -3,12        |   -1,39    |     0,00
F     |   12,13        |    1,02    |    -0,92
 | l | 
| >Conclusion |