Professional Documents
Culture Documents
BE Optimisation Stochastique
BE Optimisation Stochastique
L’objectif de ce bureau d’étude est de comprendre comment paramétrer un recuit simulé afin de
trouver une solution globale à un problème d’optimisation. Dans une première partie, vous serez
guidés pas à pas pour coder et paramétrer le recuit. Et dans la seconde partie, vous serez en autonomie
devant un problème d’optimisation appliqué à l’image.
Le projet consiste à résoudre un problème d'optimisation combinatoire proche d'un problème réel. On
veut tester un ensemble de n = 100 composants montés sur un produit. À chaque composant i est
associé un test. Mais le test i peut aussi permettre de tester d'autres composants. Le problème peut
se poser sous les deux formes suivantes :
- étant donné un nombre nt < 100, sélectionner l'ensemble des nt tests les plus performants
possibles en termes du nombre de composants vérifiés. On prendra 𝑛𝑡 = 10 ;
- sélectionner l’ensemble de tests minima permettant de tester tous les composants.
On étudiera ici le premier problème. Le but est de mettre en œuvre l’algorithme du recuit simulé afin
de trouver le jeu de 𝑛𝑡 tests le plus performant.
Le problème est défini par une matrice binaire 𝐴 = (𝑎𝑖𝑗) avec 𝑎𝑖𝑗 = 1 si le composant i peut être
testé par le test j, et 0 sinon. On a 𝑎𝑖𝑖 = 1. Pour générer les termes non diagonaux de la matrice A, on
les tire au hasard avec la probabilité 𝑝 = 0,04 d'être égaux à 1 indépendamment les uns des autres.
Voici une vue descriptive de la matrice A :
Le nombre de composants testés par le test j est la somme des termes de la colonne j de la matrice A.
C'est au final une variable aléatoire de moyenne 5 et d'écart type proche de 0,2.
Ainsi, si les tests étaient parfaitement complémentaires, avec un jeu de 10 tests, on pourrait tester
plus de cinquante composants et avec une vingtaine de tests, on devrait pouvoir tout tester. Il faut
choisir soigneusement le jeu de tests le plus complémentaire possible.
Question 1. Générez une matrice A.
2 – Modélisation
2.1 – Formalisation du problème
D'un point de vue mathématique, nous avons vu en cours que l'objectif d'un recuit simulé est de
chercher le minimum absolu 𝑥 ∗ d'une fonction 𝑈 appelée énergie dans un espace E donné :
𝑥 ∗ = min 𝑈(𝑥)
𝑥∈𝐸
Cette recherche de minimum se fait le long d'une trajectoire modélisée par une chaîne de Markov. À
chaque état est associé un graphe G définissant ainsi la relation de voisinage, puis la notion de
minimum local autour d'un état 𝑦 :
𝑥 ∗𝑦 = min 𝑈(𝑥)
𝑥∈𝑉(𝑦)
Question 2. Définir ce qu’est un état dans ce problème ainsi que son voisinage. Définir
également l’énergie du problème (qu’on cherchera ici à maximiser). Quelle variable du
code représente cette énergie ?
Un ensemble de tests est représenté par un vecteur binaire X dont les composantes identifient les tests
de l'ensemble. Pratiquement, l'opérateur de sélection maintient l'ensemble de tests courant et son
complémentaire et opère une sélection aléatoire d'un élément dans l'ensemble de tests courant, d'un
élément dans son complémentaire et les échange. L'opérateur d'évaluation évalue alors la différence
entre le nombre de composants testés dans les deux configurations. L'initialisation est opérée par le
tirage aléatoire d'un ensemble de 𝑛𝑡 tests ou par la sélection des dix tests individuellement les plus
performants.
X = Xin;
Xout_1 = Xin_1;
Xout_0 = Xin_0;
% Mesure de performance :
N = sum(min(A*X,1));
if N>Nin+T*log(rand)
Xout=X;
Xout_1(i_1) = Xin_0(i_0) ;
Xout_0(i_0) = Xin_1(i_1) ;
Nout=N;
else
Xout=Xin;
Nout=Nin;
end
Question 3. Implémenter cet algorithme et démontrer l’écriture du test
if N > Nin+T*log(rand). Comment aurait-il fallu réécrire ce test si on avait cherché à
minimiser l’énergie ?
Question 4. Pour une condition initiale donnée, observer les niveaux d'énergie d'une
trajectoire au cours du temps à différentes températures (T = 0, T = 0.1, T = 0.5, etc. ). À
quoi correspond cette dynamique pour T = 0 ? Et pour une température élevée ?
Renouveler l'expérience avec plusieurs conditions initiales.
3 – Recuit simulé
Pour mettre en œuvre l'algorithme de recuit simulé, maintenant que nous avons défini la notion d’état,
de voisinage, d’énergie et de dynamique de Metropolis, il faut déterminer les paramètres suivants :
2. la longueur optimale des plateaux pour les chaînes de Markov, au-delà de laquelle il est
inutile de continuer tant les propriétés stochastiques ne varient pas.
Ces deux paramètres s'obtiennent respectivement en étudiant les distributions limites (loi de Gibbs)
en fonction de plusieurs températures d’une part, et les convergences vers les distributions limites
d'autre part.
On aura ainsi une idée du temps de convergence vers la loi stationnaire qui permettra de régler le
schéma de recuit et de sélectionner les températures pertinentes pour l'algorithme.
for ii=1:n_iter
%transitoire
[Xin, Xin_1, Xin_0, NN(1)]=Init_alea(A,n_t); % initialisation de
l'état
for t=2:t_iter
[Xout, Xout_1, Xout_0,NN(t)] = ...
Metropolis(n, n_t, A, T,Xin, Xin_1, Xin_0, NN(t-1));
Xin=Xout;
Xin_1=Xout_1;
Xin_0=Xout_0;
end
NN(1)=NN(t_iter);
plot(N_hist,proba,'+-')
title(['Histogramme de Gibbs à température ',num2str(T),' : n=',...
int2str(n),',nt=',int2str(n_t),', p=',num2str(p)]);
De façon plus précise, pour quantifier la distance entre les lois de probabilité sur l'ensemble des
énergies, on quantifie celui-ci et on associe à une probabilité un vecteur stochastique p = (pi). On a
ensuite le choix entre différentes distances, comme par exemple :
𝑑1 (𝑝,𝑞 ) = ∑|𝑝𝑖 − 𝑞 𝑖 |
𝑖
𝑑2 (𝑝, 𝑞 ) = √∑(𝑝𝑖 − 𝑞 𝑖 )2
𝑖
Question 8. Etudier les convergences en loi pour les deux normes et pour différentes
températures. Donner une valeur plus précise de longueur d’un plateau qui convienne
à toutes les températures.
Dans cette partie, l’idée est de faire fonctionner un recuit simulé pour compter le nombre de cellules
dans une image (bloodCells.jpg) :
Par exemple, un état peut être un vecteur qui contient une liste de positions (u,v) des cellules avec
un rayon R estimé et fixé. Un voisin peut donc être une modification (δ𝑢, δv) de la position d’une
cellule prise aléatoirement. Un voisin peut également être une addition ou suppression d’une cellule.
On peut également se dire que le rayon moyen étant inconnu, il fait partie des paramètres à
optimiser, et un voisin pourrait être une modification δ𝑅 du rayon. Enfin, nous pouvons penser à une
représentation dans laquelle le rayon est considéré comme dépendant de la cellule, et ainsi chaque
cellule aurait sa propre valeur de rayon.
Pour ce qui est de l’énergie, il est possible de considérer une sorte de score entre l’image des cellules
et une image qui représente le vecteur d’état. Par exemple, à partir du vecteur d’état, on peut créer
une image binaire qui est noire là où il n’y a pas de cellule, et vaut 1 là où il y a une cellule. Ensuite,
une comparaison avec le masque binaire de l’image réelle permettra de sortir un score.
Exemple :
Et dans l’hypothèse d’un vecteur d’état qui contient une seule cellule de rayon R fixé, et de position
(𝑥 1,𝑦1 ) , que l’on peut modéliser sous forme d’image binaire :
𝑦1
𝑥1
On peut définir l’énergie comme le nombre de pixels qui font partie de l’intersection des deux
images (la partie rouge pâle de l’image suivante), minoré par le nombre de ceux qui sont dans l’union
mais pas dans l’intersection (les pixels blancs et rouge foncés) :
Avec cette définition de l’énergie, on cherchera à la maximiser afin d’avoir le plus de recouvrement
entre les disques rouges (du vecteur d’état) et les disques blancs (de la vraie image).
Il existe ainsi de nombreuses façons de résoudre le problème, plus ou moins complexes mais aussi
plus ou moins précises.
Dans ce problème, les cellules ont à peu près toutes la même taille, donc on travaillera avec un rayon
unique.
Remarque :
La très pédagogique chaîne YouTube ScienceEtonnante de David Louapre contient une vidéo
dont le sujet est l’utilisation du recuit pour déchiffrer de façon quasi certaine des messages
chiffrés par substitution :
https://scienceetonnante.com/2021/04/23/mcmc-code/