Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
c2cd8e0
fix(notebook-python,#17040): redressement densite Search/ -- consolid…
jsboige Sep 30, 2026
9a8a37e
chore(twin,#17040): re-attester les 6 paires twins touchees par la co…
jsboige Sep 30, 2026
1f8302f
fix(notebook-python,#17040): redressement densite Search/ -- consolid…
jsboige Sep 30, 2026
6ae6036
chore(twin,#17040): re-attester les 6 paires twins touchees par la co…
jsboige Sep 30, 2026
dbbf1f9
fix(notebook-python,#18536): retirer les 2 compteurs prose-counts (is…
jsboige Sep 30, 2026
782bac8
fix(twin,#18536): re-attester App-14 ConnectFour Adversarial post-rebase
jsboige Sep 30, 2026
fd417b9
fix(twin,#18536): re-attester App-14 ConnectFour Adversarial au merge…
jsboige Sep 30, 2026
150f56c
fix(twin,#18536): supprimer les doublons 0014/0015 (byte-identiques) …
jsboige Sep 30, 2026
8ca8c07
Merge branch 'main' into fix/17040-density-search
jsboige Sep 30, 2026
e9f24da
Merge remote-tracking branch 'origin/main' into fix/17040-density-search
jsboige Sep 30, 2026
937f3c0
Merge remote-tracking branch 'origin/fix/17040-density-search' into f…
jsboige Sep 30, 2026
65007f6
Merge remote-tracking branch 'origin/main' into fix/17040-density-search
jsboige Oct 1, 2026
8eae195
fix(twin,#18536): re-attester 4 paires post-merge main (#18429/#18543)
Oct 1, 2026
474eef4
fix(twin,#18536): purger doublons intra-revision 0008/0014/0022 sur c…
jsboige Oct 1, 2026
2fd901f
Merge branch 'main' into fix/17040-density-search
jsboige Oct 3, 2026
e05a4f6
Merge remote-tracking branch 'origin/fix/17040-density-search' into f…
jsboige Oct 3, 2026
b8e32d8
fix(twin,#8057): re-attestation Search-06 corrigeant la 0010 (csharp_…
jsboige Oct 3, 2026
50399b9
fix(twin,#18536): renuméroter 4 doublons d'index + corriger prose-counts
jsboige Oct 3, 2026
7c5c595
fix(twin,#18536): rebaseline 3 paires DRIFT_INTRODUCED via check_twin…
jsboige Oct 4, 2026
ff4c00f
Merge branch 'main' into fix/17040-density-search
jsboige Oct 4, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -1244,7 +1244,7 @@
"id": "a041eea7",
"metadata": {},
"source": [
"### Lecture : décomposer l'écart — où est la distance récupérable\n",
"### Lecture : décomposer l'écart — ce que gagne le solveur SOTA\n",
"\n",
"Le tableau se lit aussi en differences qu'en pourcentages : `417.49` a\n",
"`414.49` pour le 2-opt (`-0.7%`), puis `414.49` a `403.45` pour OR-Tools\n",
Expand All @@ -1257,28 +1257,9 @@
"recherche locale piétine, la question n'est pas « comment l'accélérer » mais\n",
"« quel mouvement n'est pas dans son voisinage ». C'est ce diagnostic qui\n",
"justifie les métaheuristiques à mouvements inter-tournées du notebook 17b —\n",
"relocate, recuit simulé — avant même de les écrire."
]
},
{
"cell_type": "markdown",
"id": "cd644708",
"metadata": {
"papermill": {
"duration": 0.008617,
"end_time": "2026-06-29T03:47:04.147343+00:00",
"exception": false,
"start_time": "2026-06-29T03:47:04.138726+00:00",
"status": "completed"
},
"tags": []
},
"source": [
"### Interprétation : ce que gagne le solveur SOTA\n",
"relocate, recuit simulé — avant même de les écrire.\n",
"\n",
"Sur la même instance, OR-Tools trouve une tournée globale **plus courte** que le greedy et que le\n",
"greedy+2-opt, sans aucun réglage manuel. L'écart est modeste ici (instance à 15 clients, où 2-opt\n",
"n'a déjà presque rien à gratter), mais il illustre l'essentiel :\n",
"L'écart est modeste sur cette instance (15 clients, où 2-opt n'a déjà presque rien à gratter), mais OR-Tools l'obtient **sans aucun réglage manuel**, et le mécanisme est l'essentiel :\n",
"\n",
"- **2-opt** n'améliore *que l'ordre interne de chaque tournée déjà fixée* — il ne peut pas\n",
" **déplacer un client d'un véhicule à un autre**. Son gain est donc plafonné par l'affectation\n",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2232,50 +2232,7 @@
"3. **MCTS en difficulté** : dernier du tournoi, perd contre Alpha-Beta (0-6), Minimax (0-6) et meme contre Random (2-4) -- 1000 iterations restent peu pour Connect Four\n",
"4. **échantillon insuffisant** : 6 parties par match = résultats variables\n",
"\n",
"> **Note technique** : Le tournoi est **seedé** (`random.seed(42)` dans `run_tournament`, #9434) : ces scores sont reproductibles a la re-execution. La différence entre Minimax et Alpha-Beta devrait etre nulle en theorie (même profondeur = même coups) ; le 6-0 d'Alpha-Beta sur Minimax suggere une différence d'ordonnancement des coups dans l'elagage. Avec 50+ parties (exercice 5), les win rates des duels équilibrés convergeraient vers ~50% pour Minimax vs Alpha-Beta.\n"
]
},
{
"cell_type": "markdown",
"id": "tournament-analysis",
"metadata": {
"papermill": {
"duration": 0.006642,
"end_time": "2026-08-17T13:04:15.339123+00:00",
"exception": false,
"start_time": "2026-08-17T13:04:15.332481+00:00",
"status": "completed"
},
"tags": []
},
"source": [
"### Analyse du tournoi\n",
"\n",
"Les résultats du tournoi montrent la hiérarchie des algorithmes :\n",
"\n",
"1. **Alpha-Beta et Minimax** devraient dominer Random facilement\n",
"2. **Alpha-Beta vs Minimax** : résultats similaires (même qualite de jeu)\n",
"3. **MCTS** : Performance variable selon le nombre d'itérations\n",
"\n",
"> **Note** : Avec seulement 6 parties par match, les résultats peuvent varier.\n",
"> Pour une évaluation robuste, utiliser 50+ parties."
]
},
{
"cell_type": "markdown",
"id": "interpretation-section",
"metadata": {
"papermill": {
"duration": 0.01257,
"end_time": "2026-08-17T13:04:15.359102+00:00",
"exception": false,
"start_time": "2026-08-17T13:04:15.346532+00:00",
"status": "completed"
},
"tags": []
},
"source": [
"### Interprétation des résultats\n",
"Points forts / faibles par algorithme :\n",
"\n",
"| Algorithme | Points forts | Points faibles | Usage recommande |\n",
"|------------|--------------|----------------|------------------|\n",
Expand All @@ -2286,9 +2243,9 @@
"**observations cles** :\n",
"\n",
"1. **Alpha-Beta** réduit drastiquement le nombre de noeuds (facteur 5-20x selon la profondeur)\n",
"2. **L'ordonnancement** des coups est crucial pour maximiser l'elagage\n",
"3. **MCTS** converge vers de bons coups sans fonction d'évaluation explicite\n",
"4. Pour un temps donne, Alpha-Beta profond bat souvent MCTS sur Connect Four"
"2. **MCTS** converge vers de bons coups sans fonction d'évaluation explicite\n",
"\n",
"> **Note technique** : Le tournoi est **seedé** (`random.seed(42)` dans `run_tournament`, #9434) : ces scores sont reproductibles a la re-execution. La différence entre Minimax et Alpha-Beta devrait etre nulle en theorie (même profondeur = même coups) ; le 6-0 d'Alpha-Beta sur Minimax suggere une différence d'ordonnancement des coups dans l'elagage. Avec 50+ parties (exercice 5), les win rates des duels équilibrés convergeraient vers ~50% pour Minimax vs Alpha-Beta."
]
},
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -538,34 +538,9 @@
"4. **Co^ut computationnel eleve** : Minimax explore tout l'arbre de jeu (mesure = runtime *machine-dep* sur ce Tic-Tac-Toe, cf section Alpha-Beta)\n",
"5. **Optimalite garantie** : Minimax trouve toujours le meilleur coup possible\n",
"\n",
"> **Note technique** : La valeur 0 indique que le jeu est \"resolu\" : avec un jeu parfait, les deux joueurs peuvent forcer le nul. Pour des jeux plus complexes (echecs, Go), la valeur initiale est inconnue et on utilise des heuristiques. La complexite O(b^m) devient rapidement impraticable : echecs = 35^100 noeuds !"
]
},
{
"cell_type": "markdown",
"id": "minimax-analysis",
"metadata": {
"id": "minimax-analysis",
"papermill": {
"duration": 0.00659,
"end_time": "2026-08-17T07:43:40.511188+00:00",
"exception": false,
"start_time": "2026-08-17T07:43:40.504598+00:00",
"status": "completed"
},
"tags": []
},
"source": [
"### Analyse de complexite\n",
"\n",
"| Metrique | Valeur |\n",
"|----------|--------|\n",
"| **Complexite temporelle** | O(b^m) ou b = branching factor, m = profondeur max |\n",
"| **Complexite spatiale** | O(m) pour la pile de recursion |\n",
"\n",
"Pour le Tic-Tac-Toe : b = 9, m = 9, environ 9! = 362,880 noeuds.\n",
"**Complexite** : temporelle O(b^m) ou b = branching factor, m = profondeur max ; spatiale O(m) pour la pile de recursion. Pour le Tic-Tac-Toe : b = 9, m = 9, environ 9! = 362,880 noeuds. Pour les echecs : b ~ 35, m ~ 100, environ 35^100 noeuds (impossible !) -- la complexite O(b^m) devient rapidement impraticable.\n",
"\n",
"Pour les echecs : b ~ 35, m ~ 100, environ 35^100 noeuds (impossible !)"
"> **Note technique** : La valeur 0 indique que le jeu est \"resolu\" : avec un jeu parfait, les deux joueurs peuvent forcer le nul. Pour des jeux plus complexes (echecs, Go), la valeur initiale est inconnue et on utilise des heuristiques."
]
},
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -277,15 +277,7 @@
"3. **Stabilite tardive** : a 5000 itérations, la valeur estimee MCTS est très proche de l'optimal (0).\n",
"4. **Variabilite des actions** : les actions choisies varient selon le budget, montrant que le nombre d'itérations influence la stabilite du choix.\n",
"\n",
"> **Note technique** : La valeur de Minimax (0) est exacte car l'algorithme explore tout l'arbre de jeu du Morpion. La valeur MCTS est une estimation probabiliste qui converge vers 0 avec plus d'itérations.\n"
],
"id": "cell-961c0211"
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Analyse des résultats\n",
"La comparaison qualitative complete :\n",
"\n",
"| Critere | Minimax | MCTS |\n",
"|---------|---------|------|\n",
Expand All @@ -295,14 +287,16 @@
"| **Parallellisable** | Difficile | Très facile |\n",
"| **Jeux a grand facteur de branchement** | Impraticable | Adapte |\n",
"\n",
"### Quand utiliser MCTS ?\n",
"**Quand utiliser MCTS ?**\n",
"\n",
"- Jeux avec grand espace d'etat (Go, Hex)\n",
"- Jeux sans bonne fonction d'evaluation\n",
"- Situations avec contrainte de temps variable\n",
"- Jeux avec hasard (backgammon, poker)\n"
"- Jeux avec hasard (backgammon, poker)\n",
"\n",
"> **Note technique** : La valeur de Minimax (0) est exacte car l'algorithme explore tout l'arbre de jeu du Morpion. La valeur MCTS est une estimation probabiliste qui converge vers 0 avec plus d'itérations."
],
"id": "cell-6d1c1a6e"
"id": "cell-961c0211"
},
{
"cell_type": "markdown",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -738,39 +738,24 @@
"3. **MCTS bruite et biaise vers le positif** : les valeurs MCTS (0.35-0.74) sont positives alors que la vraie valeur est 0. Ce biais ne s'attenuera pas avec le budget : meme a 5000 iterations, l'estimation reste autour de 0.5, parce que les rollouts aleatoires sont structurellement aveugles a l'equilibre du jeu (ils avantagent le premier joueur). MCTS echange donc l'exactitude contre la vitesse -- son estimation est bruitee, elle ne converge pas vers la valeur theorique.\n",
"4. **Bons coups** : a tous les budgets, MCTS choisit un coin ou le centre -- les bons premiers coups au Morpion.\n",
"\n",
"> **Note sur le hasard** : MCTS etant stochastique, les valeurs et l'action exacte varieraient d'une execution a l'autre sans graine ; `random.seed(42)` les fige pour la reproductibilite. Les conclusions qualitatives (vitesse massive, biais positif persistant, bons coups) sont stables.\n"
]
},
{
"cell_type": "markdown",
"id": "mcts-analysis-section",
"metadata": {
"papermill": {
"duration": 0.007192,
"end_time": "2026-09-26T15:15:46.727144+00:00",
"exception": false,
"start_time": "2026-09-26T15:15:46.719952+00:00",
"status": "completed"
},
"tags": []
},
"source": [
"### Analyse des résultats\n",
"La comparaison qualitative complete :\n",
"\n",
"| Critere | Minimax | MCTS |\n",
"|---------|---------|------|\n",
"| **Garantie d'optimalite** | Oui (si arbre complet) | Non (probabiliste) |\n",
"| **Fonction d'evaluation** | Necessaire | Non necessaire |\n",
"| **Complexite** | O(b^d) | O(n * d) ou n = itérations |\n",
"| **Parallellisable** | Difficile | très facile |\n",
"| **Jeux a grand facteur de branchement** | Impraticable | Adapté |\n",
"| **Complexite** | O(b^d) | O(n * d) ou n = iterations |\n",
"| **Parallellisable** | Difficile | tres facile |\n",
"| **Jeux a grand facteur de branchement** | Impraticable | Adapte |\n",
"\n",
"### Quand utiliser MCTS ?\n",
"**Quand utiliser MCTS ?**\n",
"\n",
"- Jeux avec grand espace d'etat (Go, Hex)\n",
"- Jeux sans bonne fonction d'evaluation\n",
"- Situations avec contrainte de temps variable\n",
"- Jeux avec hasard (backgammon, poker)"
"- Jeux avec hasard (backgammon, poker)\n",
"\n",
"> **Note sur le hasard** : MCTS etant stochastique, les valeurs et l'action exacte varieraient d'une execution a l'autre sans graine ; `random.seed(42)` les fige pour la reproductibilite. Les conclusions qualitatives (vitesse massive, biais positif persistant, bons coups) sont stables."
]
},
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -481,24 +481,9 @@
"id": "e9c3bfb9",
"metadata": {},
"source": [
"**Lecture chiffree — la convergence Ackley se lit par paliers.** Les 9 lignes rendues (paliers 0 a 200, tous les 25) racontent la trajectoire : `best f = 10,770053` au depart, `0,292674` des le palier 25 — le meilleur est divise par environ 37 en un quart de course. Puis deux geleurs : `0,064659` tient les paliers 75, 100 et 125 (trois lignes identiques), casse a `0,038244` au palier 150 et ne bouge plus jusqu'a 200 — l'exploitation finale apres l'exploration, exactement le scenario Metropolis. Le point final `(-0,0001, -0,0121)` porte sa distance a l'origine (0,012136) presque entierement sur la seconde coordonnee : sur les valeurs affichees, 0,0121 / 0,0001 = 121. Et la sanity Sphere se verifie par carres : le meilleur f rendu `0,000043` est bien la somme 0,0050^2 + 0,0042^2 — la fonction objective est ce qu'elle dit etre.\n"
]
},
{
"cell_type": "markdown",
"id": "s11c12",
"metadata": {
"papermill": {
"duration": 0.002166,
"end_time": "2026-07-06T02:32:44.052141",
"exception": false,
"start_time": "2026-07-06T02:32:44.049975",
"status": "completed"
},
"tags": []
},
"source": [
"### Interprétation : Ackley — SA vs descente pure\n",
"### Lecture : Ackley — la convergence par paliers, SA contre descente pure\n",
"\n",
"**Lecture chiffree.** Les paliers rendus (paliers 0 a 200, tous les 25) racontent la trajectoire : `best f = 10,770053` au depart, `0,292674` des le palier 25 — le meilleur est divise par environ 37 en un quart de course. Puis deux geleurs : `0,064659` tient les paliers 75, 100 et 125 (trois lignes identiques), casse a `0,038244` au palier 150 et ne bouge plus jusqu'a 200 — l'exploitation finale apres l'exploration, exactement le scenario Metropolis. Le point final `(-0,0001, -0,0121)` porte sa distance a l'origine (0,012136) presque entierement sur la seconde coordonnee : sur les valeurs affichees, 0,0121 / 0,0001 = 121. Et la sanity Sphere se verifie par carres : le meilleur f rendu `0,000043` est bien la somme 0,0050^2 + 0,0042^2 — la fonction objective est ce qu'elle dit etre.\n",
"\n",
"Ackley est le test discriminant : son paysage est parsemé d'optima locaux, et seul $\\mathbf{0}$ est le minimum global. Une **descente pure** (hill-climbing greedy) s'arrête au premier optimum local rencontré — typiquement $f \\approx 2$ à $6$, jamais $0$.\n",
"\n",
Expand Down
Loading
Loading