diff --git a/MyIA.AI.Notebooks/Search/Part4-Metaheuristics/MGS-vs-mealpy/MGS-30-ScatterSearch-Decomposition.ipynb b/MyIA.AI.Notebooks/Search/Part4-Metaheuristics/MGS-vs-mealpy/MGS-30-ScatterSearch-Decomposition.ipynb index 900e3b6bc1..d77f0b9682 100644 --- a/MyIA.AI.Notebooks/Search/Part4-Metaheuristics/MGS-vs-mealpy/MGS-30-ScatterSearch-Decomposition.ipynb +++ b/MyIA.AI.Notebooks/Search/Part4-Metaheuristics/MGS-vs-mealpy/MGS-30-ScatterSearch-Decomposition.ipynb @@ -179,12 +179,12 @@ { "output_type": "stream", "name": "stdout", - "text": "MGS ScatterSearch complet (graine 7, témoin) : 54 conflits, 8000 évaluations, 1112 ms, checkpoints 25/50/75/100 % = 54/54/54/54.\r\n" + "text": "MGS ScatterSearch complet (graine 7, témoin) : 54 conflits, 8000 évaluations, 3136 ms, checkpoints 25/50/75/100 % = 54/54/54/54.\r\n" }, { "output_type": "stream", "name": "stdout", - "text": "MGS ScatterSearch ablaté (graine 7, témoin) : 50 conflits, 8000 évaluations, 174 ms, checkpoints 25/50/75/100 % = 50/50/50/50.\r\n" + "text": "MGS ScatterSearch ablaté (graine 7, témoin) : 50 conflits, 8000 évaluations, 414 ms, checkpoints 25/50/75/100 % = 50/50/50/50.\r\n" } ], "source": [ @@ -339,7 +339,7 @@ { "output_type": "stream", "name": "stdout", - "text": "Pont PythonNet actif : mealpy 3.0.2 sur Python 3.13.12\r\n" + "text": "Pont PythonNet actif : mealpy 3.0.2 sur Python 3.13.15\r\n" }, { "output_type": "stream", @@ -716,7 +716,7 @@ { "output_type": "stream", "name": "stdout", - "text": "mealpy ScatterSearch-jumeau (graine 7, témoin) : 53 conflits, 8050 évaluations, 976 ms.\r\n" + "text": "mealpy ScatterSearch-jumeau (graine 7, témoin) : 53 conflits, 8050 évaluations, 1905 ms.\r\n" }, { "output_type": "stream", @@ -770,62 +770,62 @@ { "output_type": "stream", "name": "stdout", - "text": "MGS-complet 0 54 7998 804 0,101 54/54/54/54 \r\n" + "text": "MGS-complet 0 54 7998 1670 0,209 54/54/54/54 \r\n" }, { "output_type": "stream", "name": "stdout", - "text": "MGS-complet 1 56 8000 763 0,095 56/56/56/56 \r\n" + "text": "MGS-complet 1 56 8000 1823 0,228 56/56/56/56 \r\n" }, { "output_type": "stream", "name": "stdout", - "text": "MGS-complet 7 54 8000 781 0,098 54/54/54/54 \r\n" + "text": "MGS-complet 7 54 8000 2158 0,270 54/54/54/54 \r\n" }, { "output_type": "stream", "name": "stdout", - "text": "MGS-complet 42 43 7998 810 0,101 43/43/43/43 \r\n" + "text": "MGS-complet 42 43 7998 2068 0,259 43/43/43/43 \r\n" }, { "output_type": "stream", "name": "stdout", - "text": "MGS-ablate 0 54 8000 164 0,021 54/54/54/54 \r\n" + "text": "MGS-ablate 0 54 8000 374 0,047 54/54/54/54 \r\n" }, { "output_type": "stream", "name": "stdout", - "text": "MGS-ablate 1 56 8000 161 0,020 56/56/56/56 \r\n" + "text": "MGS-ablate 1 56 8000 431 0,054 56/56/56/56 \r\n" }, { "output_type": "stream", "name": "stdout", - "text": "MGS-ablate 7 50 8000 159 0,020 50/50/50/50 \r\n" + "text": "MGS-ablate 7 50 8000 484 0,060 50/50/50/50 \r\n" }, { "output_type": "stream", "name": "stdout", - "text": "MGS-ablate 42 45 8000 163 0,020 45/45/45/45 \r\n" + "text": "MGS-ablate 42 45 8000 510 0,064 45/45/45/45 \r\n" }, { "output_type": "stream", "name": "stdout", - "text": "mealpy-jumeau 0 53 8050 957 0,119 53/53/53/53 \r\n" + "text": "mealpy-jumeau 0 53 8050 2449 0,304 53/53/53/53 \r\n" }, { "output_type": "stream", "name": "stdout", - "text": "mealpy-jumeau 1 48 8050 963 0,120 50/50/48/48 \r\n" + "text": "mealpy-jumeau 1 48 8050 2378 0,295 50/50/48/48 \r\n" }, { "output_type": "stream", "name": "stdout", - "text": "mealpy-jumeau 7 53 8050 951 0,118 53/53/53/53 \r\n" + "text": "mealpy-jumeau 7 53 8050 1974 0,245 53/53/53/53 \r\n" }, { "output_type": "stream", "name": "stdout", - "text": "mealpy-jumeau 42 50 8050 947 0,118 50/50/50/50 \r\n" + "text": "mealpy-jumeau 42 50 8050 2562 0,318 50/50/50/50 \r\n" }, { "output_type": "stream", @@ -835,17 +835,17 @@ { "output_type": "stream", "name": "stdout", - "text": "MGS-complet : médiane conflits 54,0 (min 43, max 56), ms/éval moyen 0,099\r\n" + "text": "MGS-complet : médiane conflits 54,0 (min 43, max 56), ms/éval moyen 0,241\r\n" }, { "output_type": "stream", "name": "stdout", - "text": "MGS-ablate : médiane conflits 52,0 (min 45, max 56), ms/éval moyen 0,020\r\n" + "text": "MGS-ablate : médiane conflits 52,0 (min 45, max 56), ms/éval moyen 0,056\r\n" }, { "output_type": "stream", "name": "stdout", - "text": "mealpy-jumeau : médiane conflits 51,5 (min 48, max 53), ms/éval moyen 0,119\r\n" + "text": "mealpy-jumeau : médiane conflits 51,5 (min 48, max 53), ms/éval moyen 0,291\r\n" }, { "output_type": "stream", @@ -1039,17 +1039,17 @@ { "output_type": "stream", "name": "stdout", - "text": " C# : 3,1 ms total -> 0,006 ms/éval\r\n" + "text": " C# : 7,0 ms total -> 0,014 ms/éval\r\n" }, { "output_type": "stream", "name": "stdout", - "text": " Python : 19,9 ms total -> 0,040 ms/éval\r\n" + "text": " Python : 29,1 ms total -> 0,058 ms/éval\r\n" }, { "output_type": "stream", "name": "stdout", - "text": " rapport Python/C# : 6,44x\r\n" + "text": " rapport Python/C# : 4,17x\r\n" } ], "source": [ @@ -1109,9 +1109,9 @@ "2. **Le noyau** (complet vs jumeau mealpy, formules pinnées) — *attendu* : à formules égales,\n", " l'écart restant mesure l'engine. *Mesuré* : médianes **54,0 contre 51,5 — le jumeau mealpy\n", " devant** sur 3 graines sur 4 (écarts persistants de 1 à 8 conflits ; seule la graine 42\n", - " inverse, −7 pour MGS). La colonne ms/éval (0,099 contre 0,119, ratio 0,83×) écarte\n", - " l'explication par le coût : la fitness pure est 6,44× **plus rapide** côté C# (0,006 contre\n", - " 0,040 ms/éval) — l'écart de qualité vient de l'ordre des opérations et des tirages propres\n", + " inverse, −7 pour MGS). La colonne ms/éval (0,241 contre 0,291, ratio 0,83×, constant entre les deux exécutions — valeurs absolues selon le siège) écarte\n", + " l'explication par le coût : la fitness pure est 4,17× **plus rapide** côté C# (0,014 contre\n", + " 0,058 ms/éval ; rapport dépendant du siège) — l'écart de qualité vient de l'ordre des opérations et des tirages propres\n", " à chaque harnais, pas d'un avantage de calcul. À formules déclarées identiques, deux\n", " moteurs divergent quand même : le pinning fixe les équations, pas la trajectoire.\n", "3. **Le déterminisme** — *mesuré* : 12/12 bras-graines stables sur 3 répétitions (seeding\n", @@ -1120,7 +1120,9 @@ "\n", "Le classement final — jumeau mealpy (51,5) < ablaté (52,0) < complet (54,0) — est inverse de\n", "l'intuition « plus de diversité, meilleur scatter search » : c'est précisément ce que le\n", - "troisième bras rendait visible." + "troisième bras rendait visible.\n", + "\n", + "**Non-régression (mesurée le 2026-10-10, sous-module 2b21a6ae)** : conflits, évals et déterminisme bit-identiques aux sorties committées sur les trois bras (MGS-complet 54/56/54/43 à 7998/8000/8000/7998 évals ; MGS-ablate 54/56/50/45 ; mealpy-jumeau 53/48/53/50), médianes 54,0/52,0/51,5 — seuls les temps (métrique machine) varient entre les exécutions." ] }, { @@ -1242,7 +1244,7 @@ "côté C# **et** côté Python. À compléter : `profilRows` rempli, verdict écrit.\n", "\n", "\n", - "Le prior à confronter : la cellule coût/éval mesure 6,44× en faveur du C# sur la fitness\n", + "Le prior à confronter : la cellule coût/éval mesure 4,17× en faveur du C# sur la fitness\n", "complète (decode + coût), mais le rapport ms/éval du banc n'est que de 0,83×. Si le profil\n", "confirme que decode et coût sont massivement plus rapides côté C#, alors le temps restant du\n", "bench vit dans le **moteur** (allocation, collections, RNG), pas dans la fonction — et la\n", @@ -1286,7 +1288,7 @@ "Trois énoncés sortent du banc, tous mesurés : (1) **la diversité max-min ne paie pas sur ce\n", "puzzle à ce budget** — l'ablaté (qf = 1,0) égalise ou devance le complet sur 3 graines sur 4,\n", "médianes 52,0 contre 54,0 ; (2) **à formules pinnées identiques, le jumeau mealpy devance\n", - "l'engine C#** (51,5 contre 54,0) alors que sa fitness pure est 6,44× plus lente — l'écart de\n", + "l'engine C#** (51,5 contre 54,0) alors que sa fitness pure est 4,17× plus lente — l'écart de\n", "noyau est un écart de trajectoire, pas de coût ; (3) **le déterminisme est intégral**\n", "(12/12), les deux premiers énoncés portent sur du signal.\n", "\n",