| title | Graph Optimization |
|---|---|
| emoji | 📈 |
| colorFrom | blue |
| colorTo | green |
| sdk | docker |
| app_port | 7860 |
| pinned | false |
Application Streamlit pour optimiser la représentation plane d'un graphe non orienté dans le carré unité [0,1] x [0,1].
Le projet reprend l'objectif du notebook graph opti.ipynb : générer un graphe connexe, placer ses sommets aléatoirement, puis améliorer le dessin par recuit simulé.
pixi run appdocker build -t graph-optimization .
docker run -p 7860:7860 graph-optimizationPuis ouvrir http://localhost:7860.
On cherche une disposition des sommets
qui rend le graphe lisible. Pour deux sommets (i) et (j), on note :
La fonction objectif principale est :
Elle est minimisée par recuit simulé.
On pénalise les sommets trop proches :
La somme est écrite sur (i<j) pour ne pas compter chaque paire deux fois. Une somme sur (i \ne j) donnerait le même optimum, à un facteur constant près.
Pour chaque arête ((i,j) \in E), on pénalise sa longueur :
Ce terme favorise des arêtes courtes.
On définit la fonction indicatrice de croisement entre deux segments :
Pour une arête ((i,j)), on note (u_{ij}) le segment entre les positions des sommets (i) et (j). On compte les croisements uniquement entre arêtes disjointes :
La condition ((i,j)<(k,l)) indique qu'une paire d'arêtes n'est comptée qu'une seule fois. Le (+1) dans (J) évite que l'objectif tombe à zéro quand (J_3=0).
(J_4) n'entre pas dans l'objectif principal, car son calcul est plus coûteux. Il sert uniquement de passe locale optionnelle pour éloigner un sommet d'une arête qui n'est pas la sienne.
Pour un segment (u_{ij}) et un sommet (k\notin{i,j}), on note :
Le terme utilisé est :
La distance est bornée par (\varepsilon=10^{-4}) pour éviter les valeurs infinies.
A chaque tentative, l'algorithme choisit un sommet (k) et propose :
La proposition est rejetée si elle sort du carré unité. Sinon, elle est acceptée si elle améliore l'objectif. Si elle le dégrade, elle peut encore être acceptée avec la probabilité de Metropolis :
La température baisse après une acceptation. Si aucune proposition n'est acceptée après max_try tentatives, la température baisse aussi d'un palier. Le calendrier de température conserve une phase initiale chaude, puis décroît géométriquement :