Skip to content

MetaGeneticSharp: le banc ne peut pas discriminer les strategies -- codage 64 bits a neutralite massive (best final = best initial) #17997

Closed

Description

@jsboige

Constat mesure (MGS-02-Composition, review #17924)

Le banc MetaGeneticSharp de MGS-02 ne peut pas distinguer les strategies : a seed egal, Default / SizeBased (p_c 0.95 vs 0.3) / Composee (Gen+Stage+Match) produisent des valeurs identiques run par run — les parametres de metaheuristic n'ont aucun effet observable.

Chaine de preuves (probes isoles, seed fixe)

  1. Override de probabilite no-op : DefaultMetaHeuristic avec ProbabilityConfig.Mutation OverwriteProbability + StaticProbability=1.0 (muter chaque offspring) vs defaut 0.2 → trajectoires identiques au 1e-4 pres.
  2. Match no-op : MatchMetaHeuristic Current+Neighbor vs Current+Best → identiques.
  3. Le GA vit : seed 7 vs 42 → valeurs differentes (12,32 vs 22,00) — seul le tirage initial compte.
  4. Best final = best INITIAL : apres 50 generations sur Sphere, le best reste 21,999665 (celui de la population initiale) — l'evolution n'ameliore jamais.
  5. Autopsie d'une generation : crossover manuel sur les parents selectionnes → 8/22 enfants phenotypiquement identiques a un parent, meilleur enfant a 234,9 vs best initial 22,0 (10x pire).

Cause racine candidate

Codage FloatingPointChromosome 64 bits/gene pour ~18 bits utiles ([-10,10] a 1e-4) : la redondance rend ~73% des mutations et la majorite des points de crossover phenotypiquement silencieux ; les rares coupes dans les bits hauts teleportent l'enfant loin de ses parents. Un codage serre (20 bits) est refuse par GeneticSharp : BinaryStringRepresentation.ToRepresentation leve ArgumentException (« needs 64 total bits ») sur l'aller-retour interne ToFloatingPoints/ToRepresentation — l'operateur exige la pleine largeur.

Pistes (submodule MetaGeneticSharp / GeneticSharp)

  • encodage compact compatible avec l'aller-retour interne, ou
  • crossover/mutation conscients de la longueur utile (masque des bits utiles), ou
  • validation/erreur explicite au constructeur quand totalBits >> bits utiles (detecter la neutralite au lieu de la subir).

Reproduction

Notebook sonde : probes A-D dans le transcript session po-2023 2026-09-27 (scratchpad). MGS-02-Composition.ipynb cellules 6/16/21 sur la branche feature/17863-mgs02-seed portent maintenant l'instrumentation (trace par generation, detail par run).

See #17863, #17924.

Activity

  1. added a commit that references this issue on Sep 26, 2026
  2. added a commit that references this issue on Sep 27, 2026
  3. jsboige commented on Sep 27, 2026

    @jsboige
    OwnerAuthor

    [CLAIMED] lane myia-po-2023:CoursIA-2 — #17997 : rendre le banc MGS-02 discriminant — operateur conscient de la largeur utile du gene (codage 64 bits a neutralite massive), puis re-mesure des trois strategies Default / SizeBased / Composee

    paths: MyIA.AI.Notebooks/Search/Part4-Metaheuristics/MGS-02-Composition.ipynb, MyIA.AI.Notebooks/Search/MetaGeneticSharp/**

  4. jsboige commented on Sep 27, 2026

    @jsboige
    OwnerAuthor

    Correctif livré — PR #18108. Le diagnostic de l'énoncé est confirmé en partie, et complété par une mesure

    Statut mesuré des pistes de l'énoncé

    Piste avancée ici Statut Mesure
    Redondance du codage (≈18 bits utiles sur 64) réelle, mais pas la cause opérante à codage inchangé (64 bits/gène), changer les seuls opérateurs fait passer le meilleur de la population de 22,0 à 0,0000
    (c) validation / erreur explicite quand totalBits >> bits utiles déjà satisfait, dans l'autre sens FloatingPointChromosome refuse un codage serré : ArgumentException: The value … needs 64 total bits to be represented. (Parameter 'value'), mesuré à totalBits = 32 et 20, avec fractionDigits 4/4/2. Le constructeur est déjà strict — on ne peut pas coder plus serré, seulement plus large
    Cause de l'inertie du banc trouvée ailleurs les deux opérateurs par défaut sont dégénérés (ci-dessous)

    Cause opérante : deux opérateurs dégénérés

    • new OnePointCrossover() vaut OnePointCrossover(0) : la coupe tombe toujours après le bit 0, donc un enfant ne diffère d'un parent que d'un seul bit sur 256. Mesuré sur 200 croisements (enfant 0 : 246 gènes différents de parent1, 1 de parent2).
    • new UniformMutation() vaut UniformMutation(false) : l'index mutable est tiré une fois puis mis en cache (m_mutableGenesIndexes) pour toute la durée de vie de l'opérateur. Mesuré : 1 index distinct touché (index 5, graine 42) sur 200 appels à probabilité 1.0 — contre 137 index distincts pour FlipBitMutation(), qui retire un bit au hasard à chaque appel.

    Ces deux défauts expliquent exactement le symptôme décrit dans l'issue : des enfants clonés ou téléportés, et un meilleur final figé au meilleur de la population initiale.

    Effet du correctif (banc MGS-02)

    Banc Avant Après
    Match (3 règles) 27,0000 pour les trois, vecteur x identique les trois atteignent 0,0000, traces divergentes dès la génération 10
    Stratégie composée amélioration 0,0 % +87,2 % (5,4777 → 0,6991), quasi-optimal sur 3 runs sur 5
    Rastrigin 4D 5,200 / 5,200 / 5,200, écarts +0,000 15,479 < 15,576 < 17,218, Composée rang 1/3

    Un second défaut, qui ne venait pas de cet énoncé

    fractionDigits = 0 sur le chromosome Rastrigin plaçait les gènes sur un réseau entier : là, cos(2·π·x) = 1 partout, donc f_Rastrigin(x) = Σxᵢ² exactement — le banc annoncé « multimodal » était unimodal. Corrigé en 4 décimales (même PR).

    Reste ouvert

    MGS-01-Introduction.ipynb porte le même lattice : fractionDigits = 0 sur les chromosomes Rastrigin des cellules de code 6, 9, 12 et 15 (vérifié first-hand sur main). Il n'est pas traité par #18108. Je ne le prends pas ici — un PR, un sujet.

    Après #18108, la réserve « aucune comparaison sur ce banc n'est interprétable » tombe pour MGS-02 : les trois bancs de la section 2 (match), 4 (composition) et 5 (Rastrigin) rendent des valeurs qui bougent avec la stratégie. La redondance du codage subsiste, mais elle n'empêche plus la mesure.

    See #18108

  5. added 3 commits that reference this issue on Sep 27, 2026
  6. added a commit that references this issue on Sep 29, 2026
  7. added
    candidate-deliveredReferenced by a merged PR with no post-merge activity -- candidate for close triage (#10466)
    on Oct 1, 2026
  8. myia-ai-01 commented on Oct 5, 2026

    @myia-ai-01
    Collaborator

    Fermeture — urne delivered, chaque critere du body confronte a origin/main par ai-01 (05/10)

    #18108, mergee le 29/09, remplace les operateurs degeneres de MGS-02 (UniformCrossover et FlipBitMutation) et corrige le reseau Rastrigin. Le banc discrimine maintenant les strategies : la re-mesure avant/apres est dans le body, avec un controle positif (« le banc evolue »). Sur main, le carnet a 11 cellules de code, sans execution_count nul ni erreur.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    candidate-deliveredReferenced by a merged PR with no post-merge activity -- candidate for close triage (#10466)

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions