Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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 @@ -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",
Expand Down Expand Up @@ -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",
Expand Down Expand Up @@ -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",
Expand Down Expand Up @@ -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",
Expand Down Expand Up @@ -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",
Expand Down
6 changes: 6 additions & 0 deletions scripts/notebook_tools/twin_pairs.d/search-4-localsearch.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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)."
Expand Down
Loading