Skip to content
79 changes: 37 additions & 42 deletions MyIA.AI.Notebooks/Sudoku/Sudoku-04-SimulatedAnnealing-CSharp.ipynb

Large diffs are not rendered by default.

358 changes: 94 additions & 264 deletions MyIA.AI.Notebooks/Sudoku/Sudoku-05-PSO-CSharp.ipynb

Large diffs are not rendered by default.

487 changes: 234 additions & 253 deletions MyIA.AI.Notebooks/Sudoku/Sudoku-05-PSO-Python.ipynb

Large diffs are not rendered by default.

46 changes: 11 additions & 35 deletions MyIA.AI.Notebooks/Sudoku/Sudoku-09-GraphColoring-CSharp.ipynb
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
{
"cells": [
{
Expand Down Expand Up @@ -959,7 +959,7 @@
{
"output_type": "stream",
"name": "stdout",
"text": " Temps: 4,43 ms\r\n"
"text": " Temps: 1,47 ms\r\n"
},
{
"output_type": "stream",
Expand Down Expand Up @@ -1838,17 +1838,17 @@
{
"output_type": "stream",
"name": "stdout",
"text": "| Backtracking Simple | OK | 3,60 | 4250 | 4201 |\r\n"
"text": "| Backtracking Simple | OK | 2,80 | 4250 | 4201 |\r\n"
},
{
"output_type": "stream",
"name": "stdout",
"text": "| MRV Heuristic | OK | 1,40 | 63 | 14 |\r\n"
"text": "| MRV Heuristic | OK | 1,00 | 63 | 14 |\r\n"
},
{
"output_type": "stream",
"name": "stdout",
"text": "| DSATUR | OK | 4,00 | 74 | 25 |\r\n"
"text": "| DSATUR | OK | 3,60 | 74 | 25 |\r\n"
}
],
"source": [
Expand Down Expand Up @@ -1937,17 +1937,17 @@
{
"output_type": "stream",
"name": "stdout",
"text": "| Backtracking Simple | OK | 3842,00 | 4356440 | 4356375 |\r\n"
"text": "| Backtracking Simple | OK | 3448,33 | 4356440 | 4356375 |\r\n"
},
{
"output_type": "stream",
"name": "stdout",
"text": "| MRV Heuristic | OK | 33,67 | 1406 | 1341 |\r\n"
"text": "| MRV Heuristic | OK | 31,33 | 1406 | 1341 |\r\n"
},
{
"output_type": "stream",
"name": "stdout",
"text": "| DSATUR | OK | 25,67 | 1202 | 1137 |\r\n"
"text": "| DSATUR | OK | 24,33 | 1202 | 1137 |\r\n"
}
],
"source": [
Expand All @@ -1973,53 +1973,29 @@
},
"source": [
"### Interprétation : Benchmark Sudokus Difficiles\n",

"\n",

"**Sortie obtenue** : Les résultats montrent une différence spectaculaire entre les algorithmes sur les Sudokus difficiles (temps moyens mesurés : voir la sortie de la cellule ci-dessus).\n",

"\n",

"| Algorithme | Noeuds explorés | Backtracks | Noeuds vs baseline |\n",

"|------------|------------------|------------|--------------------|\n",

"| Backtracking Simple | 4 356 440 | 4 356 375 | 1x (baseline) |\n",

"| MRV Heuristic | 1 406 | 1 341 | ~3 100x moins de noeuds |\n",

"| DSATUR | 1 202 | 1 137 | ~3 600x moins de noeuds |\n",

"\n",

"**Points clés** :\n",

"1. **Backtracking simple** : Explosion combinatoire sur les instances difficiles (4,3 millions de noeuds)\n",

"2. **DSATUR meilleur performer ici** : le moins de noeuds explorés (1 202) ET le temps de résolution le plus court des trois (voir sortie ci-dessus)\n",

"3. **MRV très proche** : 1 406 noeuds, juste derriere DSATUR sur ce benchmark difficile\n",

"4. L'ecart avec le backtracking se creuse considerablement avec la difficulté (de ~3 100x a ~3 600x en nombre de noeuds explorés)\n",

"\n",

"> **Note technique** : Sur les Sudokus difficiles (peu de valeurs initiales), le degré de saturation de DSATUR devient discriminant : choisir le sommet dont le voisinage utilisé le plus de couleurs distinctes oriente la recherche vers les zones les plus contraintes, ce qui minimise le nombre de noeuds explorés (1 202, le plus bas des trois). DSATUR amortit alors son surcout de calcul de saturation et passe devant MRV -- l'inverse du cas facile, ou ce surcout n'etait pas justifie. Les deux heuristiques restent plusieurs ordres de grandeur plus efficaces que le backtracking naif.\n",

"\n",

"**Complexité des trois approches** :\n",

"\n",

"| Algorithme | Complexité | Avantages | Inconvénients |\n",

"|------------|------------|-----------|---------------|\n",

"| **Backtracking Simple** | O(9^81) théorique | Simple a implémenter | Très lent sans heuristique |\n",

"| **MRV** | O(9^n) avec n < 81 | Detecte échecs rapidement | Ordonnancement statique |\n",

"| **DSATUR** | O(n^2) par itération | Très efficace sur graphes réguliers | Plus complexe |\n"
]
},
Expand Down Expand Up @@ -2062,14 +2038,14 @@
{
"output_type": "display_data",
"data": {
"text/plain": "Sudoku renvoyé:\n-------------------------------\n| 9 6 2 | 1 8 5 | 4 7 3 | \n| 1 7 4 | 9 6 3 | 8 2 5 | \n| 5 3 8 | 4 2 7 | 1 6 9 | \n-------------------------------\n| 8 2 6 | 3 5 9 | 7 4 1 | \n| 3 5 7 | 8 1 4 | 2 9 6 | \n| 4 9 1 | 6 7 2 | 5 3 8 | \n-------------------------------\n| 2 4 9 | 5 3 8 | 6 1 7 | \n| 7 1 5 | 2 9 6 | 3 8 4 | \n| 6 8 3 | 7 4 1 | 9 5 2 | \n-------------------------------\nNombre d'erreurs réstantes: 0\nTemps de résolution: 0,6938 ms"
"text/plain": "Sudoku renvoyé:\n-------------------------------\n| 9 6 2 | 1 8 5 | 4 7 3 | \n| 1 7 4 | 9 6 3 | 8 2 5 | \n| 5 3 8 | 4 2 7 | 1 6 9 | \n-------------------------------\n| 8 2 6 | 3 5 9 | 7 4 1 | \n| 3 5 7 | 8 1 4 | 2 9 6 | \n| 4 9 1 | 6 7 2 | 5 3 8 | \n-------------------------------\n| 2 4 9 | 5 3 8 | 6 1 7 | \n| 7 1 5 | 2 9 6 | 3 8 4 | \n| 6 8 3 | 7 4 1 | 9 5 2 | \n-------------------------------\nNombre d'erreurs réstantes: 0\nTemps de résolution: 0,4635 ms"
},
"metadata": {}
},
{
"output_type": "stream",
"name": "stdout",
"text": "\nTemps de resolution DSATUR : 7,9640 ms\r\n"
"text": "\nTemps de resolution DSATUR : 4,1368 ms\r\n"
}
],
"source": [
Expand Down Expand Up @@ -2260,7 +2236,7 @@
}
],
"source": [
"// Tranche 2 : QuikGraph 2.5.0 (moteur .NET natif) — le graphe de contraintes Sudoku delegue a une lib .NET.\n",
"// QuikGraph 2.5.0 (moteur .NET natif) — le graphe de contraintes Sudoku delegue a une lib .NET.\n",
"// Le jumeau Python construit ce meme graphe via nx.sudoku_graph() (networkx) ; QuikGraph est\n",
"// l'equivalent .NET (structure de graphe + algorithmes de connectivite / parcours).\n",
"#r \"nuget: QuikGraph, 2.5.0\"\n",
Expand Down Expand Up @@ -2299,7 +2275,7 @@
"Console.WriteLine($\"Composantes connexes (algo QuikGraph) : {cc.ComponentCount} (graphe connexe)\");\n",
"\n",
"// (3) Verification d'une coloration propre SUR la structure QuikGraph.\n",
"// On resout un Sudoku avec le DSATUR de la tranche 1, puis on verifie via le parcours\n",
"// On resout un Sudoku avec le DSATUR manuel, puis on verifie via le parcours\n",
"// des aretes QuikGraph qu'aucune arete ne relie deux sommets de meme couleur.\n",
"var puzzle = SudokuHelper.GetSudokus(SudokuDifficulty.Easy).First();\n",
"var solved = new GraphColoringDSATUR().Solve(puzzle);\n",
Expand Down
Loading
Loading