From 6b7b8abfa5d64663d7041e7e774e34fc59c14c07 Mon Sep 17 00:00:00 2001 From: jsboige Date: Tue, 1 Sep 2026 12:30:28 +0200 Subject: [PATCH 1/2] Add: interpretation cells for Search-4 LocalSearch-Csharp (N-Queens benchmark, exos) Enrichissement markdown-only : 5 cellules d'interpretation, chacune ancree aux outputs commites (encodage par permutation -> 6 conflits diagonaux initiaux ; benchmark HC 7/15 vs SA/Tabu 15/15 sur 8-Reines, 4/10 vs 10/10 sur 20-Reines) ou a la structure explicitement citee. Code byte-identique (13/13 cellules). Densite 947 -> 1266 c/cell (seuil 1200). Co-Authored-By: Claude Sonnet 4.6 (1M context) --- .../Search-4-LocalSearch-Csharp.ipynb | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/MyIA.AI.Notebooks/Search/Part1-Foundations/Search-4-LocalSearch-Csharp.ipynb b/MyIA.AI.Notebooks/Search/Part1-Foundations/Search-4-LocalSearch-Csharp.ipynb index 2feb723adf..17dc92abed 100644 --- a/MyIA.AI.Notebooks/Search/Part1-Foundations/Search-4-LocalSearch-Csharp.ipynb +++ b/MyIA.AI.Notebooks/Search/Part1-Foundations/Search-4-LocalSearch-Csharp.ipynb @@ -858,6 +858,20 @@ "Console.WriteLine($\"Conflits diagonaux initiaux : {Conflits(reines0)}\");" ] }, + { + "cell_type": "markdown", + "id": "interp-nqueens-encoding", + "metadata": {}, + "source": [ + "### Lecture - l'encodage par permutation reduit le probleme a un seul type de conflit\n", + "\n", + "La sortie de demo rend un echiquier 8x8 **aleatoire** avec `reines[i] = colonne de la reine de la ligne i`. Ce choix d'encodage n'est pas anodin : **une reine par ligne et par colonne par construction** (c'est une permutation), donc il ne peut y avoir **aucun** conflit ligne ni colonne -- seuls les conflits **diagonaux** restent a eliminer (ici **6** sur le placement initial rendu).\n", + "\n", + "- **La fonction objectif se reduit a un compteur de conflits diagonaux** `Conflits(reines)` : 0 = solution. Le paysage a une hauteur bien definie et l'optimum est facile a reconnaitre (cout nul) -- c'est ce qui rend le probleme utilisable comme banc d'essai.\n", + "- **Permutation = bijection** : l'espace de recherche est exactement `n!` (pas `n^n`), ce qui rend la recherche locale bien plus efficace qu'un encodage par cases ou deux reines peuvent partager une ligne.\n", + "- Le but de toutes les metaheuristiques des cellules suivantes est de faire descendre `Conflits` de sa valeur initiale (**6** sur la demo) a **0**, malgre les minima locaux du paysage diagonal." + ] + }, { "cell_type": "markdown", "id": "3bdf7b93", @@ -1466,6 +1480,20 @@ "Benchmark(n: 20, essais: 10, seedBase: 700);" ] }, + { + "cell_type": "markdown", + "id": "interp-benchmark", + "metadata": {}, + "source": [ + "### Lecture - le benchmark tranche : HC se coince, SA et Tabu sortent toujours\n", + "\n", + "Les tableaux rendus par `Benchmark` sont la lecon centrale du notebook. Sur **8-Reines (15 essais)**, Hill Climbing ne reussit que **7/15 (47 %)** quand Simulated Annealing et Tabu Search reussissent **15/15 (100 %)**. Sur **20-Reines (10 essais)**, la tendance s'accentue : **4/10 (40 %)** pour HC contre **10/10 (100 %)** pour les deux autres.\n", + "\n", + "- **HC est glouton** : il ne monte jamais un voisin de cout strictement superieur, donc il reste bloque dans le premier minimum local rencontre -- et les paysages de conflits diagonaux des N-Reines en sont pleins. La chute de 47 % a 40 % quand N passe de 8 a 20 montre que **plus le probleme est grand, plus HC se coince** (les minima locaux se multiplient).\n", + "- **SA echappe aux optima locaux** via la temperature (elle accepte des degradations transitoires) ; **Tabu** via sa **memoire** (elle interdit de rejouer les recents coups defavorables). Les deux atteignent 100 % dans les deux tailles.\n", + "- **Warning `CS0219`** : `itHC/itSA/itTS` sont comptees mais jamais utilisees -- un reliquat de code (compteur d'iterations dont l'affichage a ete retire). Sans consequence sur les resultats, et le code n'est pas modifie ici (enrichissement markdown-only)." + ] + }, { "cell_type": "markdown", "id": "634b9173", @@ -1542,6 +1570,16 @@ "Console.WriteLine($\"(Exercice a completer) — relances utilisees : {res.restarts}, f(x) = {res.fx:F3}\");" ] }, + { + "cell_type": "markdown", + "id": "interp-exo1", + "metadata": {}, + "source": [ + "### Lecture - Exercice 1 : Random-Restart adaptatif\n", + "\n", + "L'exercice demande d'arreter les relances des qu'un **seuil de qualite** est atteint, plutot que de toujours bruler un nombre fixe de tentatives. La structure attendue garde la boucle de Random-Restart Hill Climbing mais ajoute un `break` quand le cout retourne tombe sous le `seuil` -- la vraie question de calibration est le compromis **qualite visee vs budget de relances**. Le stub rend `pass`, donc l'exercice est a completer : ajouter la condition d'arret puis relire la sortie -- le taux de reussite doit montrer que le seuil **economise** des relances sans perdre de solutions." + ] + }, { "cell_type": "markdown", "id": "e157039c", @@ -1610,6 +1648,16 @@ "Console.WriteLine($\"(Exercice a completer) — conflits finaux : {ex2.conflits}\");" ] }, + { + "cell_type": "markdown", + "id": "interp-exo2", + "metadata": {}, + "source": [ + "### Lecture - Exercice 2 : memoire a long terme\n", + "\n", + "La recherche tabou de la section 5 utilise une liste tabou a **taille fixe**. L'exercice etend la memoire (diversification : interdire aussi des attributs ou des mouvements \"oublies\" depuis longtemps, pas seulement les tout derniers). L'idee est une **aspiration** qui pousse la recherche dans des regions inexplorees. Sur le banc N-Reines, une memoire longue sert surtout quand la liste courte recompute un optimum local deja vu : comparez le taux de reussite a celui de la section 5 pour le mesurer." + ] + }, { "cell_type": "markdown", "id": "fb212085", @@ -1671,6 +1719,16 @@ "ComparerRefroidissementsNReines(n: 20, essais: 10);" ] }, + { + "cell_type": "markdown", + "id": "interp-exo3", + "metadata": {}, + "source": [ + "### Lecture - Exercice 3 : trois programmes de refroidissement\n", + "\n", + "La section 3 comparait les programmes de refroidissement sur la fonction 1D (et le paradoxe du logarithmique). L'exercice vous demande de **refaire cette comparaison sur les N-Reines** : le meilleur programme sur une fonction 1D n'est pas forcement le meilleur sur un paysage de permutations. Mesurez le taux de reussite et le nombre d'iterations a 0 conflit pour chaque programme, puis confrontez au verdict de la section 3 -- c'est le \"No Free Lunch\" des schemas de temperature." + ] + }, { "cell_type": "markdown", "id": "f924f49b", From 8f26fa64f12d45733e1076932d349e8469d63434 Mon Sep 17 00:00:00 2001 From: jsboige Date: Tue, 1 Sep 2026 12:40:15 +0200 Subject: [PATCH 2/2] Add: rebaseline twin-parity Search-4 after C# markdown enrichment Attestation (post-commit, blobs HEAD) de la paire search-4-localsearch apres l'enrichissement markdown-only du cote C# (PR de contenu associee). Seul le csharp_sha/content_csharp_sha bougent ; content_python_sha intact -> aucun drift du cote Python. Co-Authored-By: Claude Sonnet 4.6 (1M context) --- .../notebook_tools/twin_pairs.d/search-4-localsearch.yaml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/scripts/notebook_tools/twin_pairs.d/search-4-localsearch.yaml b/scripts/notebook_tools/twin_pairs.d/search-4-localsearch.yaml index 14171367b9..d918296ae0 100644 --- a/scripts/notebook_tools/twin_pairs.d/search-4-localsearch.yaml +++ b/scripts/notebook_tools/twin_pairs.d/search-4-localsearch.yaml @@ -28,6 +28,12 @@ csharp_sha: 2feb723adf68258ced22949f71e9eb70070c87b9 content_python_sha: dddab5b007203cb73db9a7a6bb64eb31deb4d4da2a3a33ef87fc9ecf19aafe8b content_csharp_sha: bf240ace38f5d9f054a979ed694bb77ff34e84ac79f9353683168205fc830b07 + - date: "2026-09-01" + by: myia-po-2027:CoursIA + python_sha: 6211d4343dc10fb0a22e5b6811dfe7c25a1bb768 + csharp_sha: 17dc92abed5f6b4b1ddfd9960e8d1d51dafb3d78 + content_python_sha: dddab5b007203cb73db9a7a6bb64eb31deb4d4da2a3a33ef87fc9ecf19aafe8b + content_csharp_sha: 74f9300152cb6aebe49afe5ce2e718ab215aa8b31c57f0eac5375811ffebcc8a known_differences: - '2026-08-31 : ATTESTATION UNILATERALE (PR #13659, lane myia-ai-01:CoursIA) -- reparation d''echappements JSON manges dans le markdown du cote C#. CAUSE : dans le .ipynb, la sequence dollar-\bot-dollar ecrite avec UN SEUL antislash est lue par le parseur JSON comme l''echappement \b (backspace, U+0008) ; la source chargee porte un caractere de controle et le notebook rend un dollar-ot-dollar prive de sa commande LaTeX. FIX : doubler l''antislash (\\bot). Le DRIFT est UNILATERAL parce que le DEFAUT l''est : la contrepartie Search-4-LocalSearch.ipynb (Python), 39 cellules markdown, a ete scannee sous controle positif (le litteral defectueux passe a json.loads doit rendre U+0008 -- assertion verifiee avant le scan) et ne porte AUCUN caractere de controle U+0008/U+000B/U+000C. Il n''y a donc rien a reparer de ce cote : l''attestation ne consacre aucune asymetrie de contenu. PORTEE DU DIFF cote repare (comparaison des JSON parses origin/main -> HEAD) : markdown uniquement, 0 cellule code touchee, 0 sortie modifiee, 0 execution_count deplace, 0 cellule ajoutee ou retiree.' - "Socle pedagogique commun : metaheuristiques de recherche locale — Hill Climbing (variations steepest/first-improvement + diagnosis plateau/ridge), Simulated Annealing (schema de refroidissement, critere de Metropolis), Tabu Search (liste tabou, memoire a court terme). Comparaison empirique sur N-Reines. Les deux twins implementent les 3 algorithmes from-scratch (parite algorithmique, pas seulement narratif)."