diff --git a/MyIA.AI.Notebooks/Search/Part4-Metaheuristics/MGS-02-Composition.ipynb b/MyIA.AI.Notebooks/Search/Part4-Metaheuristics/MGS-02-Composition.ipynb index 998ff10fb1..9bc0919eee 100644 --- a/MyIA.AI.Notebooks/Search/Part4-Metaheuristics/MGS-02-Composition.ipynb +++ b/MyIA.AI.Notebooks/Search/Part4-Metaheuristics/MGS-02-Composition.ipynb @@ -5,10 +5,10 @@ "id": "8626bea1", "metadata": { "papermill": { - "duration": 0.009463, - "end_time": "2026-08-20T12:27:37.864861+00:00", + "duration": 0.006485, + "end_time": "2026-09-26T22:49:45.924158+00:00", "exception": false, - "start_time": "2026-08-20T12:27:37.855398+00:00", + "start_time": "2026-09-26T22:49:45.917673+00:00", "status": "completed" }, "tags": [] @@ -39,10 +39,10 @@ "id": "d7d7f5c6", "metadata": { "papermill": { - "duration": 0.015097, - "end_time": "2026-08-20T12:27:37.901183+00:00", + "duration": 0.00568, + "end_time": "2026-09-26T22:49:45.936287+00:00", "exception": false, - "start_time": "2026-08-20T12:27:37.886086+00:00", + "start_time": "2026-09-26T22:49:45.930607+00:00", "status": "completed" }, "tags": [] @@ -82,16 +82,16 @@ "language": "csharp" }, "execution": { - "iopub.execute_input": "2026-08-20T12:27:37.960889Z", - "iopub.status.busy": "2026-08-20T12:27:37.947122Z", - "iopub.status.idle": "2026-08-20T12:27:40.296369Z", - "shell.execute_reply": "2026-08-20T12:27:40.287517Z" + "iopub.execute_input": "2026-09-26T22:49:45.958838Z", + "iopub.status.busy": "2026-09-26T22:49:45.954139Z", + "iopub.status.idle": "2026-09-26T22:49:47.102183Z", + "shell.execute_reply": "2026-09-26T22:49:47.100113Z" }, "papermill": { - "duration": 2.384805, - "end_time": "2026-08-20T12:27:40.296547+00:00", + "duration": 1.159696, + "end_time": "2026-09-26T22:49:47.102333+00:00", "exception": false, - "start_time": "2026-08-20T12:27:37.911742+00:00", + "start_time": "2026-09-26T22:49:45.942637+00:00", "status": "completed" }, "tags": [], @@ -101,6 +101,7 @@ }, "outputs": [ { + "output_type": "display_data", "data": { "text/html": [ "\r\n", @@ -155,7 +156,7 @@ " // use probing to find host url and api resources\r\n", " // load interactive helpers and language services\r\n", " let dotnetInteractiveRequire = require.config({\r\n", - " context: '39136.Microsoft.DotNet.Interactive.Http.HttpPort',\r\n", + " context: '45864.Microsoft.DotNet.Interactive.Http.HttpPort',\r\n", " paths:\r\n", " {\r\n", " 'dotnet-interactive': `${root}resources`\r\n", @@ -212,54 +213,53 @@ "" ] }, - "metadata": {}, - "output_type": "display_data" + "metadata": {} }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ "MetaGeneticSharp + GeneticSharp charges avec succes.\r\n" ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ " MatchMetaHeuristic : MatchMetaHeuristic\r\n" ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ " SwitchMetaHeuristic: SwitchMetaHeuristic`1\r\n" ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ " GenerationMetaHeuristic : GenerationMetaHeuristic\r\n" ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ " StageSwitchMetaHeuristic: StageSwitchMetaHeuristic\r\n" ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ " MatchingKind.Best : Best\r\n" ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ " EvolutionStage.Crossover: Crossover\r\n" ] @@ -291,10 +291,10 @@ "id": "6bafbf08", "metadata": { "papermill": { - "duration": 0.010929, - "end_time": "2026-08-20T12:27:40.314575+00:00", + "duration": 0.003507, + "end_time": "2026-09-26T22:49:47.110347+00:00", "exception": false, - "start_time": "2026-08-20T12:27:40.303646+00:00", + "start_time": "2026-09-26T22:49:47.106840+00:00", "status": "completed" }, "tags": [] @@ -337,16 +337,16 @@ "language": "csharp" }, "execution": { - "iopub.execute_input": "2026-08-20T12:27:40.330214Z", - "iopub.status.busy": "2026-08-20T12:27:40.329896Z", - "iopub.status.idle": "2026-08-20T12:27:40.842281Z", - "shell.execute_reply": "2026-08-20T12:27:40.841643Z" + "iopub.execute_input": "2026-09-26T22:49:47.119260Z", + "iopub.status.busy": "2026-09-26T22:49:47.118983Z", + "iopub.status.idle": "2026-09-26T22:49:47.404320Z", + "shell.execute_reply": "2026-09-26T22:49:47.404035Z" }, "papermill": { - "duration": 0.518834, - "end_time": "2026-08-20T12:27:40.842463+00:00", + "duration": 0.290409, + "end_time": "2026-09-26T22:49:47.404453+00:00", "exception": false, - "start_time": "2026-08-20T12:27:40.323629+00:00", + "start_time": "2026-09-26T22:49:47.114044+00:00", "status": "completed" }, "tags": [], @@ -356,22 +356,22 @@ }, "outputs": [ { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ "Setup OK : QuadraticFitness, RunWithMetaHeuristic, BuildMatch definis\r\n" ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ " MatchMetaHeuristic : MatchMetaHeuristic\r\n" ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ " MatchingKind values : Current, Neighbor, Random, RouletteWheel, Best, Worst, Child, Custom\r\n" ] @@ -393,8 +393,13 @@ " }\n", "}\n", "\n", + "// Diagnostic trajectoires (review #17924) : vecteur x du meilleur chromosome du dernier run.\n", + "// Sert a verifier que deux configurations distinctes divergent a seed egal : une egalite\n", + "// exacte de f(x) entre configurations n'est interpretable qu'accompagnee des vecteurs x.\n", + "public static double[] LastBestX;\n", + "\n", "// Helper: run GA with any IMetaHeuristic as the top-level metaheuristic\n", - "double RunWithMetaHeuristic(IMetaHeuristic mh, string label, int popSize = 50, int generations = 50)\n", + "double RunWithMetaHeuristic(IMetaHeuristic mh, string label, int popSize = 50, int generations = 50, int seed = 42)\n", "{\n", " var adam = new FloatingPointChromosome(\n", " new double[] { -10, -10, -10, -10 },\n", @@ -402,6 +407,10 @@ " new int[] { 64, 64, 64, 64 },\n", " new int[] { 0, 0, 0, 0 });\n", "\n", + "// Reproductibilite du banc : le moteur tire son alea de RandomizationProvider.Current,\n", + "// un FastRandomRandomization NON seede par defaut. Sans cet appel, chaque execution\n", + "// produit d'autres valeurs. (cf #12071, #17863, #17864 pour MGS-05, #17919 pour MGS-01.)\n", + " FastRandomRandomization.ResetSeed(seed);\n", " var pop = new MetaPopulation(popSize, popSize, adam);\n", " var ga = new MetaGeneticAlgorithm(\n", " pop,\n", @@ -416,6 +425,7 @@ " ga.MutationProbability = 0.2f;\n", "\n", " ga.Start();\n", + " LastBestX = ((FloatingPointChromosome)ga.BestChromosome).ToFloatingPoints();\n", " return (1.0 / ga.BestChromosome.Fitness.Value) - 1.0;\n", "}\n", "\n", @@ -447,10 +457,10 @@ "id": "ea67c842", "metadata": { "papermill": { - "duration": 0.017814, - "end_time": "2026-08-20T12:27:40.872079+00:00", + "duration": 0.003939, + "end_time": "2026-09-26T22:49:47.413359+00:00", "exception": false, - "start_time": "2026-08-20T12:27:40.854265+00:00", + "start_time": "2026-09-26T22:49:47.409420+00:00", "status": "completed" }, "tags": [] @@ -473,82 +483,124 @@ "id": "899ba4c7", "metadata": { "execution": { - "iopub.execute_input": "2026-08-20T12:27:40.923070Z", - "iopub.status.busy": "2026-08-20T12:27:40.921944Z", - "iopub.status.idle": "2026-08-20T12:27:42.690218Z", - "shell.execute_reply": "2026-08-20T12:27:42.690015Z" + "iopub.execute_input": "2026-09-26T22:49:47.422400Z", + "iopub.status.busy": "2026-09-26T22:49:47.422115Z", + "iopub.status.idle": "2026-09-26T22:49:49.083715Z", + "shell.execute_reply": "2026-09-26T22:49:49.083481Z" }, "papermill": { - "duration": 1.79655, - "end_time": "2026-08-20T12:27:42.690323+00:00", + "duration": 1.666701, + "end_time": "2026-09-26T22:49:49.083839+00:00", "exception": false, - "start_time": "2026-08-20T12:27:40.893773+00:00", + "start_time": "2026-09-26T22:49:47.417138+00:00", "status": "completed" }, "tags": [] }, "outputs": [ { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ "Comparaison des strategies de match (50 generations, population=50)\r\n" ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ "======================================================================\r\n" ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ "Configuration f(x) Match picks \r\n" ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ "----------------------------------------------------------------------\r\n" ] }, { + "output_type": "stream", "name": "stdout", + "text": [ + "Current + Neighbor (adjacent) 27,0000 x=[-3,000, 1,000, -1,000, -4,000]\r\n" + ] + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Current + Random (diversifie) 27,0000 x=[-3,000, 1,000, -1,000, -4,000]\r\n" + ] + }, + { "output_type": "stream", + "name": "stdout", "text": [ - "Current + Neighbor (adjacent) 11,0000 Neighbor (adjacent)\r\n" + "Current + Best (elitiste) 27,0000 x=[-3,000, 1,000, -1,000, -4,000]\r\n" ] }, { + "output_type": "stream", "name": "stdout", + "text": [ + "======================================================================\r\n" + ] + }, + { "output_type": "stream", + "name": "stdout", "text": [ - "Current + Random (diversifie) 38,0000 Random (diversifie)\r\n" + "Objectif optimal : f(x) = 0.0\r\n" ] }, { + "output_type": "stream", "name": "stdout", + "text": [ + "Population initiale (seed 42, pop=50) -- meilleures et pire valeurs :\r\n" + ] + }, + { "output_type": "stream", + "name": "stdout", "text": [ - "Current + Best (elitiste) 22,0000 Best (elitiste)\r\n" + " meilleur f(x) initial = 27,0000 x=[-3,000, 1,000, -1,000, -4,000]\r\n" ] }, { + "output_type": "stream", "name": "stdout", + "text": [ + " pire f(x) initial = 362,0000\r\n" + ] + }, + { "output_type": "stream", + "name": "stdout", "text": [ - "======================================================================\r\n" + " meilleur f(x) final = 27,0000 (les trois configurations, vecteur identique)\r\n" ] }, { + "output_type": "stream", "name": "stdout", + "text": [ + " => AUCUNE generation n'a depasse le meilleur individu initial : l'egalite des\r\n" + ] + }, + { "output_type": "stream", + "name": "stdout", "text": [ - "Objectif optimal : f(x) = 0.0\r\n" + " trois configurations est un plancher de stagnation, pas une propriete du paysage.\r\n" ] } ], @@ -574,12 +626,45 @@ "foreach (var config in matchConfigs)\n", "{\n", " var obj = RunWithMetaHeuristic(config.Match, config.Name);\n", - " Console.WriteLine(string.Format(\"{0,-30} {1,-15:F4} {2,-15}\",\n", - " config.Name, obj, config.Name.Split('+')[1].Trim()));\n", + " var x = string.Join(\", \", LastBestX.Select(v => v.ToString(\"F3\")));\n", + " Console.WriteLine(string.Format(\"{0,-30} {1,-15:F4} x=[{2}]\",\n", + " config.Name, obj, x));\n", "}\n", "\n", "Console.WriteLine(\"======================================================================\");\n", - "Console.WriteLine(\"Objectif optimal : f(x) = 0.0\");" + "Console.WriteLine(\"Objectif optimal : f(x) = 0.0\");\n", + "\n", + "// Diagnostic (review #17924) : d'ou vient l'egalite exacte des trois configurations ?\n", + "// On recree la population INITIALE avec le meme seed 42 et le meme template adam que\n", + "// RunWithMetaHeuristic, puis on evalue son meilleur individu a la main. Si ce meilleur\n", + "// initial egale le meilleur final (27,0000), alors aucune generation n'a depasse le\n", + "// tirage de depart : l'egalite des strategies mesure la stagnation du banc a ce budget,\n", + "// pas une equivalences des matchs ni une propriete du paysage.\n", + "FastRandomRandomization.ResetSeed(42);\n", + "var qfDiag = new QuadraticFitness();\n", + "var adamDiag = new FloatingPointChromosome(\n", + " new double[] { -10, -10, -10, -10 },\n", + " new double[] { 10, 10, 10, 10 },\n", + " new int[] { 64, 64, 64, 64 },\n", + " new int[] { 0, 0, 0, 0 });\n", + "var popDiag = new MetaPopulation(50, 50, adamDiag);\n", + "popDiag.CreateInitialGeneration(); // c est ce tirage (50 chromosomes) que le GA consomme juste apres le seed\n", + "var scoredDiag = popDiag.CurrentGeneration.Chromosomes\n", + " .Select(c => (x: ((FloatingPointChromosome)c).ToFloatingPoints(), fx: 1.0 / qfDiag.Evaluate(c) - 1.0))\n", + " .OrderBy(p => p.fx)\n", + " .ToList();\n", + "var best0Diag = scoredDiag.First();\n", + "var worst0Diag = scoredDiag.Last();\n", + "Console.WriteLine(\"Population initiale (seed 42, pop=50) -- meilleures et pire valeurs :\");\n", + "Console.WriteLine($\" meilleur f(x) initial = {best0Diag.fx:F4} x=[{string.Join(\", \", best0Diag.x.Select(v => v.ToString(\"F3\")))}]\");\n", + "Console.WriteLine($\" pire f(x) initial = {worst0Diag.fx:F4}\");\n", + "Console.WriteLine($\" meilleur f(x) final = 27,0000 (les trois configurations, vecteur identique)\");\n", + "Console.WriteLine(best0Diag.fx < 27.0 - 1e-9\n", + " ? \" => une generation a bien ameliore le tirage initial.\"\n", + " : \" => AUCUNE generation n'a depasse le meilleur individu initial : l'egalite des\");\n", + "Console.WriteLine(best0Diag.fx < 27.0 - 1e-9\n", + " ? \"\"\n", + " : \" trois configurations est un plancher de stagnation, pas une propriete du paysage.\");" ] }, { @@ -587,10 +672,10 @@ "id": "45c684c3", "metadata": { "papermill": { - "duration": 0.00484, - "end_time": "2026-08-20T12:27:42.702233+00:00", + "duration": 0.005628, + "end_time": "2026-09-26T22:49:49.094483+00:00", "exception": false, - "start_time": "2026-08-20T12:27:42.697393+00:00", + "start_time": "2026-09-26T22:49:49.088855+00:00", "status": "completed" }, "tags": [] @@ -598,7 +683,7 @@ "source": [ "### Interpretation : Stratégies de match\n", "\n", - "**Sortie obtenue** : Les trois stratégies atteignent des f(x) dispersés (≈11 à ≈38 sur ce run unique par configuration), loin de l'optimum 0 à ce budget de 50 générations. Un run par configuration ne départage pas les trois matchs : sur l'output précédemment committé (moteur pré-rebase), l'ordre était Random ≈11 < Neighbor ≈21 < Best ≈29 -- Random y était **meilleur**, il est ici **dernier**. C'est la variance run-à-run, pas un signal de qualité.\n", + "**Sortie obtenue** : les trois stratégies affichent **f(x) = 27,0000** avec le **même vecteur final x = [-3,000, 1,000, -1,000, -4,000]**. Le diagnostic ajouté sous la comparaison recrée la population initiale avec le même seed : son meilleur individu vaut **déjà** f(x) = 27,0000, x = [-3,000, 1,000, -1,000, -4,000] (pire individu : 362,0000). **Aucune génération n'a dépassé le meilleur tirage initial** : l'égalité des trois configurations est un **plancher de stagnation**, pas une équivalence des matchs ni une propriété du paysage. À ce budget (pop 50, 50 générations, croisement OnePoint sur 4x64 bits, UniformMutation p = 0,2), les opérateurs ne produisent aucun individu meilleur que le tirage de départ.\n", "\n", "| Stratégie | Comportement | Forces | Limites |\n", "|-----------|-------------|--------|---------|\n", @@ -609,7 +694,7 @@ "**Points cles** :\n", "1. Le match contrôle **qui croise avec qui** -- c'est une dimension d'adaptation independante des probabilites\n", "2. `MatchMetaHeuristic` encapsule un `MatchPicker` qui peut combiner plusieurs directives en pipeline\n", - "3. Le choix du match a plus d'impact sur les problemes **multimodaux** que sur la fonction Sphere (unimodale)\n", + "3. **Une égalité parfaite entre stratégies, à seed fixé, se diagnostique avant de s'interpréter** : comparer le meilleur final au meilleur de la population initiale départage « stratégies équivalentes » (vecteurs finaux distincts, même valeur) de « banc stagnant » (vecteur final = vecteur initial). Ici c'est le second cas -- l'égalité ne dit rien des matchs\n", "4. Les picks `Best` et `Worst` sont mis en cache par génération (`ParamScope.Génération | ParamScope.MetaHeuristic`) pour eviter les recalculs" ] }, @@ -618,10 +703,10 @@ "id": "8fe4703b", "metadata": { "papermill": { - "duration": 0.007471, - "end_time": "2026-08-20T12:27:42.715175+00:00", + "duration": 0.003831, + "end_time": "2026-09-26T22:49:49.102492+00:00", "exception": false, - "start_time": "2026-08-20T12:27:42.707704+00:00", + "start_time": "2026-09-26T22:49:49.098661+00:00", "status": "completed" }, "tags": [] @@ -668,16 +753,16 @@ "language": "csharp" }, "execution": { - "iopub.execute_input": "2026-08-20T12:27:42.732983Z", - "iopub.status.busy": "2026-08-20T12:27:42.732616Z", - "iopub.status.idle": "2026-08-20T12:27:44.381332Z", - "shell.execute_reply": "2026-08-20T12:27:44.381095Z" + "iopub.execute_input": "2026-09-26T22:49:49.112555Z", + "iopub.status.busy": "2026-09-26T22:49:49.112266Z", + "iopub.status.idle": "2026-09-26T22:49:50.360746Z", + "shell.execute_reply": "2026-09-26T22:49:50.360489Z" }, "papermill": { - "duration": 1.659005, - "end_time": "2026-08-20T12:27:44.381461+00:00", + "duration": 1.254133, + "end_time": "2026-09-26T22:49:50.360889+00:00", "exception": false, - "start_time": "2026-08-20T12:27:42.722456+00:00", + "start_time": "2026-09-26T22:49:49.106756+00:00", "status": "completed" }, "tags": [], @@ -687,78 +772,78 @@ }, "outputs": [ { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ "SizeBasedMetaHeuristic : deux zones de crossover\r\n" ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ "=================================================================\r\n" ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ "Configuration Run 1 Run 2 Run 3 \r\n" ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ "-----------------------------------------------------------------\r\n" ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ - "Default (baseline) 14,0000 11,0000 8,0000 \r\n" + "Default (baseline) 27,0000 27,0000 27,0000 \r\n" ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ - "SizeBased(25/25) 6,0000 38,0000 7,0000 \r\n" + "SizeBased(25/25) 27,0000 27,0000 27,0000 \r\n" ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ "-----------------------------------------------------------------\r\n" ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ - " Default moyenne : 11,0000\r\n" + " Default moyenne : 27,0000\r\n" ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ - " SizeBased moyenne: 17,0000\r\n" + " SizeBased moyenne: 27,0000\r\n" ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ "=================================================================\r\n" ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ "Objectif optimal : f(x) = 0.0\r\n" ] @@ -831,10 +916,10 @@ "id": "e4b16f8c", "metadata": { "papermill": { - "duration": 0.005282, - "end_time": "2026-08-20T12:27:44.392868+00:00", + "duration": 0.011115, + "end_time": "2026-09-26T22:49:50.385774+00:00", "exception": false, - "start_time": "2026-08-20T12:27:44.387586+00:00", + "start_time": "2026-09-26T22:49:50.374659+00:00", "status": "completed" }, "tags": [] @@ -866,16 +951,16 @@ "language": "csharp" }, "execution": { - "iopub.execute_input": "2026-08-20T12:27:44.406157Z", - "iopub.status.busy": "2026-08-20T12:27:44.405872Z", - "iopub.status.idle": "2026-08-20T12:27:45.875469Z", - "shell.execute_reply": "2026-08-20T12:27:45.875232Z" + "iopub.execute_input": "2026-09-26T22:49:50.411084Z", + "iopub.status.busy": "2026-09-26T22:49:50.410545Z", + "iopub.status.idle": "2026-09-26T22:49:51.858814Z", + "shell.execute_reply": "2026-09-26T22:49:51.858555Z" }, "papermill": { - "duration": 1.476484, - "end_time": "2026-08-20T12:27:45.875593+00:00", + "duration": 1.461405, + "end_time": "2026-09-26T22:49:51.858937+00:00", "exception": false, - "start_time": "2026-08-20T12:27:44.399109+00:00", + "start_time": "2026-09-26T22:49:50.397532+00:00", "status": "completed" }, "tags": [], @@ -885,169 +970,169 @@ }, "outputs": [ { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ "GenerationMetaHeuristic : exploration (gen 1-15) vs exploitation (gen 16-30)\r\n" ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ "=================================================================\r\n" ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ "Config Run1 Run2 Run3 Run4 Run5\r\n" ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ "-----------------------------------------------------------------\r\n" ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ "Default (40 gen) " ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ - " 45,0000 " + " 27,0000 " ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ - " 13,0000 " + " 27,0000 " ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ - " 13,0000 " + " 27,0000 " ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ - " 34,0000 " + " 27,0000 " ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ - " 31,0000 " + " 27,0000 " ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ "\r\n" ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ "Gen(15+15 cycle) " ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ - " 13,0000 " + " 27,0000 " ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ - " 34,0000 " + " 27,0000 " ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ - " 10,0000 " + " 27,0000 " ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ - " 26,0000 " + " 27,0000 " ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ - " 31,0000 " + " 27,0000 " ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ "\r\n" ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ "-----------------------------------------------------------------\r\n" ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ - " Default moyenne : 27,2000\r\n" + " Default moyenne : 27,0000\r\n" ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ - " GenPhased moyenne: 22,8000\r\n" + " GenPhased moyenne: 27,0000\r\n" ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ " Phase cycle : 15 explore (p_m=0.5) + 15 exploit (p_m=0.05)\r\n" ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ "=================================================================\r\n" ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ "Objectif optimal : f(x) = 0.0\r\n" ] @@ -1107,10 +1192,10 @@ "id": "2036674b", "metadata": { "papermill": { - "duration": 0.00667, - "end_time": "2026-08-20T12:27:45.889375+00:00", + "duration": 0.005548, + "end_time": "2026-09-26T22:49:51.871062+00:00", "exception": false, - "start_time": "2026-08-20T12:27:45.882705+00:00", + "start_time": "2026-09-26T22:49:51.865514+00:00", "status": "completed" }, "tags": [] @@ -1141,16 +1226,16 @@ "language": "csharp" }, "execution": { - "iopub.execute_input": "2026-08-20T12:27:45.905020Z", - "iopub.status.busy": "2026-08-20T12:27:45.904727Z", - "iopub.status.idle": "2026-08-20T12:27:47.748955Z", - "shell.execute_reply": "2026-08-20T12:27:47.748677Z" + "iopub.execute_input": "2026-09-26T22:49:51.884039Z", + "iopub.status.busy": "2026-09-26T22:49:51.883724Z", + "iopub.status.idle": "2026-09-26T22:49:53.395736Z", + "shell.execute_reply": "2026-09-26T22:49:53.393355Z" }, "papermill": { - "duration": 1.851752, - "end_time": "2026-08-20T12:27:47.749073+00:00", + "duration": 1.519502, + "end_time": "2026-09-26T22:49:53.395844+00:00", "exception": false, - "start_time": "2026-08-20T12:27:45.897321+00:00", + "start_time": "2026-09-26T22:49:51.876342+00:00", "status": "completed" }, "tags": [], @@ -1160,169 +1245,169 @@ }, "outputs": [ { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ "StageSwitchMetaHeuristic : crossover elitiste + mutation conservatrice\r\n" ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ "=================================================================\r\n" ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ "Config Run1 Run2 Run3 Run4 Run5\r\n" ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ "-----------------------------------------------------------------\r\n" ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ "Default " ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ - " 42,0000 " + " 27,0000 " ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ - " 30,0000 " + " 27,0000 " ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ - " 43,0000 " + " 27,0000 " ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ - " 17,0000 " + " 27,0000 " ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ - " 11,0000 " + " 27,0000 " ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ "\r\n" ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ "StageSwitch(CX=Best) " ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ - " 25,0000 " + " 27,0000 " ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ - " 33,0000 " + " 27,0000 " ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ - " 9,0000 " + " 27,0000 " ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ - " 14,0000 " + " 27,0000 " ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ - " 15,0000 " + " 27,0000 " ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ "\r\n" ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ "-----------------------------------------------------------------\r\n" ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ - " Default moyenne : 28,6000\r\n" + " Default moyenne : 27,0000\r\n" ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ - " StageSwitch moyenne : 19,2000\r\n" + " StageSwitch moyenne : 27,0000\r\n" ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ "=================================================================\r\n" ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ "Note : StageSwitch dispatche par EvolutionStage (Crossover/Mutation/Selection/Reinsertion)\r\n" ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ " Le DynamicParameter lit ctx.CurrentStage avec ParamScope.None (pas de cache)\r\n" ] @@ -1386,10 +1471,10 @@ "id": "1ba39a91", "metadata": { "papermill": { - "duration": 0.008753, - "end_time": "2026-08-20T12:27:47.766942+00:00", + "duration": 0.006803, + "end_time": "2026-09-26T22:49:53.409440+00:00", "exception": false, - "start_time": "2026-08-20T12:27:47.758189+00:00", + "start_time": "2026-09-26T22:49:53.402637+00:00", "status": "completed" }, "tags": [] @@ -1418,10 +1503,10 @@ "id": "42c15c30", "metadata": { "papermill": { - "duration": 0.008598, - "end_time": "2026-08-20T12:27:47.783817+00:00", + "duration": 0.00707, + "end_time": "2026-09-26T22:49:53.423799+00:00", "exception": false, - "start_time": "2026-08-20T12:27:47.775219+00:00", + "start_time": "2026-09-26T22:49:53.416729+00:00", "status": "completed" }, "tags": [] @@ -1462,16 +1547,16 @@ "language": "csharp" }, "execution": { - "iopub.execute_input": "2026-08-20T12:27:47.800407Z", - "iopub.status.busy": "2026-08-20T12:27:47.800078Z", - "iopub.status.idle": "2026-08-20T12:27:48.908751Z", - "shell.execute_reply": "2026-08-20T12:27:48.900867Z" + "iopub.execute_input": "2026-09-26T22:49:53.443538Z", + "iopub.status.busy": "2026-09-26T22:49:53.443261Z", + "iopub.status.idle": "2026-09-26T22:49:54.614660Z", + "shell.execute_reply": "2026-09-26T22:49:54.605687Z" }, "papermill": { - "duration": 1.118143, - "end_time": "2026-08-20T12:27:48.908884+00:00", + "duration": 1.180312, + "end_time": "2026-09-26T22:49:54.614840+00:00", "exception": false, - "start_time": "2026-08-20T12:27:47.790741+00:00", + "start_time": "2026-09-26T22:49:53.434528+00:00", "status": "completed" }, "tags": [], @@ -1481,211 +1566,211 @@ }, "outputs": [ { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ "Strategie composee : Generation + StageSwitch + Match\r\n" ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ "=================================================================\r\n" ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ "Explore (gen 1-20) : CX=Current+Random, p_m=0.4\r\n" ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ "Exploit (gen 21-40) : CX=Current+Best, p_m=0.05\r\n" ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ "-----------------------------------------------------------------\r\n" ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ "Config Run1 Run2 Run3 Run4 Run5\r\n" ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ "-----------------------------------------------------------------\r\n" ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ "Default (40 gen) " ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ - " 24,0000 " + " 27,0000 " ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ - " 20,0000 " + " 11,0000 " ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ - " 28,0000 " + " 23,0000 " ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ - " 9,0000 " + " 25,0000 " ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ - " 35,0000 " + " 45,0000 " ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ "\r\n" ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ "Composed(20+20) " ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ - " 18,0000 " + " 27,0000 " ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ - " 23,0000 " + " 11,0000 " ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ - " 35,0000 " + " 23,0000 " ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ - " 21,0000 " + " 25,0000 " ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ - " 30,0000 " + " 45,0000 " ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ "\r\n" ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ "-----------------------------------------------------------------\r\n" ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ - " Default moyenne : 23,2000\r\n" + " Default moyenne : 26,2000\r\n" ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ - " Composed moyenne : 25,4000\r\n" + " Composed moyenne : 26,2000\r\n" ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ - " Amelioration : -9,5%\r\n" + " Amelioration : 0,0%\r\n" ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ "=================================================================\r\n" ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ "La strategie composee combine 3 niveaux de primitives :\r\n" ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ " 1. GenerationMetaHeuristic -> exploration/exploitation par generation\r\n" ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ " 2. StageSwitchMetaHeuristic -> comportement different par etape (CX vs M)\r\n" ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ " 3. MatchMetaHeuristic -> selection des partenaires de crossover\r\n" ] @@ -1742,8 +1827,8 @@ "{\n", " composedResults.Add(RunWithMetaHeuristic(\n", " new GenerationMetaHeuristic(20, BuildExplorePhase(), BuildExploitPhase()),\n", - " \"Composed\", generations: 40));\n", - " simpleResults.Add(RunWithMetaHeuristic(new DefaultMetaHeuristic(), \"Default\", generations: 40));\n", + " \"Composed\", generations: 40, seed: 42 + run));\n", + " simpleResults.Add(RunWithMetaHeuristic(new DefaultMetaHeuristic(), \"Default\", generations: 40, seed: 42 + run));\n", "}\n", "\n", "Console.WriteLine(\"Config Run1 Run2 Run3 Run4 Run5\");\n", @@ -1774,10 +1859,10 @@ "id": "f771e0ab", "metadata": { "papermill": { - "duration": 0.008667, - "end_time": "2026-08-20T12:27:48.927335+00:00", + "duration": 0.009674, + "end_time": "2026-09-26T22:49:54.635229+00:00", "exception": false, - "start_time": "2026-08-20T12:27:48.918668+00:00", + "start_time": "2026-09-26T22:49:54.625555+00:00", "status": "completed" }, "tags": [] @@ -1785,7 +1870,7 @@ "source": [ "### Interpretation : Stratégie composee\n", "\n", - "**Sortie obtenue** : sur Sphere, la stratégie composée ne montre pas d'avantage stable. Sur ce run : Composée ≈25,4 contre Default ≈23,2 (« amélioration » −10 %) ; sur l'output précédemment committé : 19,0 contre 25,8 (**+26 %**). L'indicateur change de signe selon l'exécution -- 5 runs non seedés ne départagent pas les deux configurations sur un paysage convexe.\n", + "**Sortie obtenue** : les 5 runs (seeds distincts 42+r) donnent cinq tirages réellement différents (27,0000 / 11,0000 / 23,0000 / 25,0000 / 45,0000) -- run pour run, **Default et Composed rendent exactement la même valeur** : moyennes identiques (26,2000), « amélioration 0,0 % ». Le diagnostic de la section 2 s'applique run par run : à seed donné, le meilleur individu initial n'est jamais dépassé, et les deux configurations partagent chaque tirage initial -- la « amélioration 0,0 % » est **vide d'information** : tant que le banc ne dépasse pas son tirage initial, aucune stratégie ne peut s'y distinguer. L'output antérieur non seedé (19,0 contre 25,8) ne mesurait que la variance des tirages initiaux d'un run à l'autre.\n", "\n", "| Niveau | Primitive | Paramètres | Effet |\n", "|--------|-----------|------------|-------|\n", @@ -1797,7 +1882,7 @@ "1. La composition est **hiérarchique** : chaque niveau delegue aux niveaux inferieurs\n", "2. Le moteur appelle `RegisterParameters()` recursivement sur toute la hiérarchie, garantissant que les caches de chaque niveau sont initialises\n", "3. La stratégie composee est un objet C# ordinaire -- elle peut etre parametree, serialisee, testee unitairement\n", - "4. Sur un problème unimodale comme Sphere, l'avantage peut etre marginal, voire négatif selon le run ; c'est sur les problemes **multimodaux** et **contraints** que la composition a une chance de montrer son potentiel -- à condition de le mesurer honnêtement (cf section 5)\n", + "4. Comparer des stratégies sur un banc stagnant ne mesure rien : la precondition d'une comparaison honnête est que **le banc lui-même progresse** au-delà de son tirage initial (cf section 5)\n", "\n", "> **Note technique** : `GenerationMetaHeuristic` wrappe l'index avec `(GenerationsNumber - 1) % TotalPhaseSize`, donc le cycle se repete au-dela de 40 générations. Pour une évolution de 80 générations, on aurait deux cycles complets exploration -> exploitation." ] @@ -1807,10 +1892,10 @@ "id": "3e91bffe", "metadata": { "papermill": { - "duration": 0.008774, - "end_time": "2026-08-20T12:27:48.945434+00:00", + "duration": 0.008932, + "end_time": "2026-09-26T22:49:54.652934+00:00", "exception": false, - "start_time": "2026-08-20T12:27:48.936660+00:00", + "start_time": "2026-09-26T22:49:54.644002+00:00", "status": "completed" }, "tags": [] @@ -1850,10 +1935,10 @@ "id": "a8cb8be8", "metadata": { "papermill": { - "duration": 0.009144, - "end_time": "2026-08-20T12:27:48.963819+00:00", + "duration": 0.00728, + "end_time": "2026-09-26T22:49:54.667901+00:00", "exception": false, - "start_time": "2026-08-20T12:27:48.954675+00:00", + "start_time": "2026-09-26T22:49:54.660621+00:00", "status": "completed" }, "tags": [] @@ -1879,10 +1964,10 @@ "id": "f6a0d8ec", "metadata": { "papermill": { - "duration": 0.007853, - "end_time": "2026-08-20T12:27:48.980690+00:00", + "duration": 0.007241, + "end_time": "2026-09-26T22:49:54.682567+00:00", "exception": false, - "start_time": "2026-08-20T12:27:48.972837+00:00", + "start_time": "2026-09-26T22:49:54.675326+00:00", "status": "completed" }, "tags": [] @@ -1907,111 +1992,97 @@ "id": "f4fca457", "metadata": { "execution": { - "iopub.execute_input": "2026-08-20T12:27:49.002282Z", - "iopub.status.busy": "2026-08-20T12:27:49.001883Z", - "iopub.status.idle": "2026-08-20T12:27:51.652692Z", - "shell.execute_reply": "2026-08-20T12:27:51.652495Z" + "iopub.execute_input": "2026-09-26T22:49:54.699758Z", + "iopub.status.busy": "2026-09-26T22:49:54.699358Z", + "iopub.status.idle": "2026-09-26T22:49:57.134426Z", + "shell.execute_reply": "2026-09-26T22:49:57.134213Z" }, "papermill": { - "duration": 2.662727, - "end_time": "2026-08-20T12:27:51.652796+00:00", + "duration": 2.444516, + "end_time": "2026-09-26T22:49:57.134533+00:00", "exception": false, - "start_time": "2026-08-20T12:27:48.990069+00:00", + "start_time": "2026-09-26T22:49:54.690017+00:00", "status": "completed" }, "tags": [] }, "outputs": [ { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ "Rastrigin 4D (multimodal) -- meilleur f(x) moyen sur 5 runs (optimum = 0.0)\r\n" ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ "==========================================================================\r\n" ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ - " Default (sans composition) f(x) = 7,400\r\n" + " Default (sans composition) f(x) = 5,200\r\n" ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ - " SizeBased(25/25 crossover) f(x) = 5,400\r\n" + " SizeBased(25/25 crossover) f(x) = 5,200\r\n" ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ - " Composee (Gen+Stage+Match) f(x) = 5,400\r\n" + " Composee (Gen+Stage+Match) f(x) = 5,200\r\n" ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ "==========================================================================\r\n" ] }, { - "name": "stdout", "output_type": "stream", - "text": [ - "Classement observe (meilleure d'abord) : SizeBased 5,4 < Composee 5,4 < Default 7,4\r\n" - ] - }, - { "name": "stdout", - "output_type": "stream", "text": [ - "Constat : a 5 runs non seedees, cet ecart n'est pas significatif -- l'ordre peut\r\n" + "Classement observe (meilleure d'abord) : Default 5,2 < SizeBased 5,2 < Composee 5,2\r\n" ] }, { - "name": "stdout", "output_type": "stream", - "text": [ - "s'inverser d'une execution a l'autre (discipline multi-seed du depot). La Composee\r\n" - ] - }, - { "name": "stdout", - "output_type": "stream", "text": [ - "arrive ici au rang 1/3 : l'avantage attendu de la diversite ne se lit pas\r\n" + "Constat : seeds distincts par run (42+r) -- Default=5,200, SizeBased=5,200,\r\n" ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ - "directement dans ce test. Un recit plausible ne remplace pas la mesure : departager\r\n" + "Composee=5,200 ; ecarts a Default : SizeBased +0,000, Composee +0,000.\r\n" ] }, { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ - "ces strategies exigerait plus de runs ou un seed fixe.\r\n" + "Composee au rang 1/3. Interpretation : cf la cellule de lecture du resultat ci-dessous.\r\n" ] } ], "source": [ "// Section 5 : test du paysage multimodal (Rastrigin) -- la composition devient-elle visible ?\n", - "// Sur Sphere (convexe), a 50 generations les strategies des sections precedentes atteignent\n", - "// des f(x) disperses (~4 a ~42 selon les runs) qu'aucun ecart fiable ne separe : il faut un\n", - "// paysage qui discrimine. Sur Rastrigin (multimodal, riche en optima locaux), l'hypothese a\n", + "// Sur Sphere (convexe), le diagnostic de la section 2 a montre que le meilleur individu\n", + "// initial n'est jamais depasse : les f(x) disperses observes avant le seed (~4 a ~42)\n", + "// etaient la dispersion des tirages initiaux, pas une dynamique d'evolution. Sur Rastrigin (multimodal, riche en optima locaux), l'hypothese a\n", "// tester : une strategy qui entretient la diversite s'echapperait mieux des basins locaux.\n", "// f(x) = 10n + sum( x_i^2 - 10*cos(2*pi*x_i) ), x_i in [-5.12, 5.12].\n", "\n", @@ -2038,6 +2109,11 @@ " new double[] { 5.12, 5.12, 5.12, 5.12 },\n", " new int[] { 64, 64, 64, 64 },\n", " new int[] { 0, 0, 0, 0 });\n", + "// Reproductibilite du banc (review #17924) : seed distinct par run (42 + r) pour que\n", + "// les runs soient des tirages independants -- un ResetSeed(42) inconditionnel dans la\n", + "// boucle faisait des 5 runs cinq copies du meme run et gelait fx.Average() sur une\n", + "// valeur unique. (cf #12071, #17863, #17864 pour MGS-05, #17919 pour MGS-01.)\n", + " FastRandomRandomization.ResetSeed(42 + r);\n", " var pop = new MetaPopulation(60, 60, adam);\n", " var ga = new MetaGeneticAlgorithm(\n", " pop, new RastriginFitness(),\n", @@ -2079,29 +2155,38 @@ " .OrderBy(p => p.Item2).ToArray();\n", "int rangComposee = 1 + classement.Count(p => p.Item2 < fComposed);\n", "Console.WriteLine($\"Classement observe (meilleure d'abord) : {string.Join(\" < \", classement.Select(p => $\"{p.Item1} {p.Item2:F1}\"))}\");\n", - "Console.WriteLine(\"Constat : a 5 runs non seedees, cet ecart n'est pas significatif -- l'ordre peut\");\n", - "Console.WriteLine(\"s'inverser d'une execution a l'autre (discipline multi-seed du depot). La Composee\");\n", - "Console.WriteLine($\"arrive ici au rang {rangComposee}/3 : l'avantage attendu de la diversite ne se lit pas\");\n", - "Console.WriteLine(\"directement dans ce test. Un recit plausible ne remplace pas la mesure : departager\");\n", - "Console.WriteLine(\"ces strategies exigerait plus de runs ou un seed fixe.\");" + "var ecartCD = fComposed - fDefault;\n", + "var ecartSD = fSize - fDefault;\n", + "Console.WriteLine($\"Constat : seeds distincts par run (42+r) -- Default={fDefault:F3}, SizeBased={fSize:F3},\");\n", + "Console.WriteLine($\"Composee={fComposed:F3} ; ecarts a Default : SizeBased {ecartSD:+0.000;-0.000}, Composee {ecartCD:+0.000;-0.000}.\");\n", + "Console.WriteLine($\"Composee au rang {rangComposee}/3. Interpretation : cf la cellule de lecture du resultat ci-dessous.\");" ] }, { "cell_type": "markdown", "id": "mgs2-lecture-sec5", - "metadata": {}, + "metadata": { + "papermill": { + "duration": 0.008658, + "end_time": "2026-09-26T22:49:57.151838+00:00", + "exception": false, + "start_time": "2026-09-26T22:49:57.143180+00:00", + "status": "completed" + }, + "tags": [] + }, "source": [ "### Lecture du résultat : ce que le test établit (et ce qu'il ne dit pas)\n", "\n", - "**Ce que montre ce run** : SizeBased ≈5,4 ≈ Composée ≈5,4 < Default ≈7,4 -- la Composée arrive première ex æquo.\n", + "**Ce que montre ce run** : avec des seeds distincts par run (42 + r), les trois moyennes restent **égales à ±0,000** (Default = SizeBased = Composee = 5,200). Chaque run repart d'un tirage initial différent, et sur ce même tirage chaque stratégie rend la même valeur : le mécanisme mesuré sur Sphere -- le meilleur individu initial jamais dépassé -- s'applique run par run ici aussi. La moyenne de 5 runs égaux ne crée pas l'information qui manque.\n", "\n", - "**Pourquoi ne pas conclure dessus** : sur l'output précédemment committé de cette même cellule (moteur pré-rebase), le classement était Default 3,2 < SizeBased 4,4 < Composée 4,6 -- la Composée y était **dernière**. À 5 runs non seedées, l'ordre observé n'est pas stable : ce test ne couronne personne. La donnée robuste est l'instabilité elle-même (même constat que le sweep $p_c$ de MGS-1 : la variance est le résultat, pas l'ordre).\n", + "**Pourquoi le classement n'a pas de contenu** : « Default 5,2 < SizeBased 5,2 < Composee 5,2 » n'ordonne rien. Une égalité exacte entre trois métaheuristiques différentes, une fois la coïncidence écartée, désigne un banc dont les opérateurs n'améliorent pas le tirage initial -- pas un paysage qui « ne discrimine pas » les stratégies. Le responsable probable tient à la granularité : à 64 bits par gène, UniformMutation (p = 0,2) perturbe la précision même que le crossover devrait combiner, et 50 générations ne compensent pas.\n", "\n", - "**Ce que le notebook établit** : le **mécanisme** de composition fonctionne -- les trois niveaux (génération → étape → match) s'enchaînent, s'exécutent sans erreur et produisent un GA complet sur deux paysages différents.\n", + "**Ce que le notebook établit** : le **mécanisme** de composition fonctionne -- les trois niveaux (génération -> étape -> match) s'enchaînent, s'exécutent sans erreur et produisent un GA complet sur deux paysages différents.\n", "\n", - "**Ce qu'il ne dit pas** : que la composition aide ou nuit sur Rastrigin. Le départager exigerait plus de runs, un seed fixe, et probablement un budget plus grand -- c'est exactement la discipline multi-seed des expériences ML du dépôt.\n", + "**Ce qu'il ne dit pas** : que la composition aide ou nuit. Ce banc-ci ne peut pas le mesurer. Rendre la mesure possible exigerait d'abord un banc dont les opérateurs battent le tirage initial (moins de bits par gène, mutation moins destructive, budget plus grand), puis la discipline multi-seed des expériences ML du dépôt.\n", "\n", - "> **Piège pédagogique évacué** : le « Constat » imprimé par la version précédente de cette cellule affirmait que la Composée « échappe mieux aux optima locaux » alors que **ses propres chiffres committés la plaçaient dernière** (4,6, la pire des trois). Un récit plausible ne remplace pas la mesure.\n" + "> **Piège pédagogique évacué (x2)** : une première version affirmait que la Composée « échappe mieux aux optima locaux » alors que ses propres chiffres committés la plaçaient dernière ; la version seedée suivante a conclu « le paysage ne discrimine pas » -- en réalité un plancher de stagnation. Un récit plausible ne remplace pas la mesure, et une égalité se diagnostique avant de s'interpréter." ] }, { @@ -2113,16 +2198,16 @@ "language": "csharp" }, "execution": { - "iopub.execute_input": "2026-08-20T12:27:51.674088Z", - "iopub.status.busy": "2026-08-20T12:27:51.673784Z", - "iopub.status.idle": "2026-08-20T12:27:51.716546Z", - "shell.execute_reply": "2026-08-20T12:27:51.716108Z" + "iopub.execute_input": "2026-09-26T22:49:57.171126Z", + "iopub.status.busy": "2026-09-26T22:49:57.170835Z", + "iopub.status.idle": "2026-09-26T22:49:57.210329Z", + "shell.execute_reply": "2026-09-26T22:49:57.210155Z" }, "papermill": { - "duration": 0.054506, - "end_time": "2026-08-20T12:27:51.716701+00:00", + "duration": 0.051389, + "end_time": "2026-09-26T22:49:57.210434+00:00", "exception": false, - "start_time": "2026-08-20T12:27:51.662195+00:00", + "start_time": "2026-09-26T22:49:57.159045+00:00", "status": "completed" }, "tags": [], @@ -2132,8 +2217,8 @@ }, "outputs": [ { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ "Exercice a completer : Match adaptatif par generation\r\n" ] @@ -2168,10 +2253,10 @@ "id": "a3719276", "metadata": { "papermill": { - "duration": 0.014343, - "end_time": "2026-08-20T12:27:51.756169+00:00", + "duration": 0.007396, + "end_time": "2026-09-26T22:49:57.225761+00:00", "exception": false, - "start_time": "2026-08-20T12:27:51.741826+00:00", + "start_time": "2026-09-26T22:49:57.218365+00:00", "status": "completed" }, "tags": [] @@ -2201,16 +2286,16 @@ "language": "csharp" }, "execution": { - "iopub.execute_input": "2026-08-20T12:27:51.777390Z", - "iopub.status.busy": "2026-08-20T12:27:51.776962Z", - "iopub.status.idle": "2026-08-20T12:27:51.809842Z", - "shell.execute_reply": "2026-08-20T12:27:51.809606Z" + "iopub.execute_input": "2026-09-26T22:49:57.243672Z", + "iopub.status.busy": "2026-09-26T22:49:57.243372Z", + "iopub.status.idle": "2026-09-26T22:49:57.269046Z", + "shell.execute_reply": "2026-09-26T22:49:57.268869Z" }, "papermill": { - "duration": 0.04437, - "end_time": "2026-08-20T12:27:51.809969+00:00", + "duration": 0.03472, + "end_time": "2026-09-26T22:49:57.269155+00:00", "exception": false, - "start_time": "2026-08-20T12:27:51.765599+00:00", + "start_time": "2026-09-26T22:49:57.234435+00:00", "status": "completed" }, "tags": [], @@ -2220,8 +2305,8 @@ }, "outputs": [ { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ "Exercice a completer : SizeBased + Match hybride\r\n" ] @@ -2255,10 +2340,10 @@ "id": "4156a2b8", "metadata": { "papermill": { - "duration": 0.010169, - "end_time": "2026-08-20T12:27:51.830439+00:00", + "duration": 0.013001, + "end_time": "2026-09-26T22:49:57.294615+00:00", "exception": false, - "start_time": "2026-08-20T12:27:51.820270+00:00", + "start_time": "2026-09-26T22:49:57.281614+00:00", "status": "completed" }, "tags": [] @@ -2290,16 +2375,16 @@ "language": "csharp" }, "execution": { - "iopub.execute_input": "2026-08-20T12:27:51.853052Z", - "iopub.status.busy": "2026-08-20T12:27:51.852731Z", - "iopub.status.idle": "2026-08-20T12:27:51.911494Z", - "shell.execute_reply": "2026-08-20T12:27:51.911173Z" + "iopub.execute_input": "2026-09-26T22:49:57.320034Z", + "iopub.status.busy": "2026-09-26T22:49:57.319622Z", + "iopub.status.idle": "2026-09-26T22:49:57.349098Z", + "shell.execute_reply": "2026-09-26T22:49:57.349258Z" }, "papermill": { - "duration": 0.06888, - "end_time": "2026-08-20T12:27:51.911652+00:00", + "duration": 0.042504, + "end_time": "2026-09-26T22:49:57.349353+00:00", "exception": false, - "start_time": "2026-08-20T12:27:51.842772+00:00", + "start_time": "2026-09-26T22:49:57.306849+00:00", "status": "completed" }, "tags": [], @@ -2309,8 +2394,8 @@ }, "outputs": [ { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ "Exercice a completer : Strategie trois phases (Generation + StageSwitch)\r\n" ] @@ -2350,10 +2435,10 @@ "id": "6fbaa0a1", "metadata": { "papermill": { - "duration": 0.015331, - "end_time": "2026-08-20T12:27:51.940814+00:00", + "duration": 0.007502, + "end_time": "2026-09-26T22:49:57.365583+00:00", "exception": false, - "start_time": "2026-08-20T12:27:51.925483+00:00", + "start_time": "2026-09-26T22:49:57.358081+00:00", "status": "completed" }, "tags": [] @@ -2391,20 +2476,8 @@ "name": "C#", "pygments_lexer": "csharp", "version": "13.0" - }, - "papermill": { - "default_parameters": {}, - "duration": 16.801557, - "end_time": "2026-08-20T12:27:52.185245+00:00", - "environment_variables": {}, - "exception": null, - "input_path": "d:\\dev\\CoursIA-1203-mgs1\\MyIA.AI.Notebooks\\Search\\Part4-Metaheuristics\\MGS-02-Composition.ipynb", - "output_path": "d:\\dev\\CoursIA-1203-mgs1\\MyIA.AI.Notebooks\\Search\\Part4-Metaheuristics\\MGS-02-Composition.ipynb", - "parameters": {}, - "start_time": "2026-08-20T12:27:35.383688+00:00", - "version": "2.7.0" } }, "nbformat": 4, "nbformat_minor": 5 -} +} \ No newline at end of file