Le génome structurel

Chaque individu de la population est défini par un vecteur de gènes qui encode une configuration d'implantation complète.

Gène Type Valeurs Rôle
cut float [0, 1] Point de partition de la zone — 0 = pas de découpe, sinon position relative de la coupure
system_key enum Râtelier Resserré Longi Double Type de système de stationnement par zone
rows_along_s bool true / false Orientation des rangées — le long de l'axe s (longueur) ou t (profondeur)
reverse bool true / false Sens de parcours de l'axe principal — détermine le point de départ de la pose
depth_reverse bool true / false Ordre d'empilement des bandes — de l'avant vers l'arrière ou inversement
double_loaded bool true / false Bandes doubles (dos-à-dos) ou simples — double = plus dense mais plus profond
reserve_corridor enum none / side / center Topologie de la réservation de couloir de circulation
📐
Espace de recherche : avec 7 gènes et une pièce pouvant être découpée en 2 zones (chacune avec son propre system_key, rows_along_s, etc.), l'espace combinatoire dépasse les 10 000 configurations uniques par pièce. L'exploration exhaustive est impossible — d'où le NSGA-II.

Construction du phénotype

Le génome ne place aucun vélo directement. Il paramètre le constructeur M2-M4 qui, lui, construit l'implantation.

Séparation génome / constructeur

Le constructeur M2 (pose des bandes), le packing M3 (optimisation exacte) et la circulation M4 (couloirs + accessibilité) sont réutilisés tels quels. Le génome encode uniquement les paramètres de ces modules : quel système utiliser, dans quel sens poser, faut-il réserver un couloir, etc.

Pipeline d'évaluation

Pour chaque individu, le pipeline complet est exécuté :

Génome M2 Constructeur M3 Packing M4 Circulation Fitness
♻️
Zéro duplication : le code du constructeur n'est pas copié ni adapté pour le NSGA-II. C'est exactement le même code qui tourne en mode « single-shot » et en mode « évolutionnaire ». Cela garantit la cohérence des résultats et simplifie la maintenance.

Optimisation multi-objectif

Deux objectifs antagonistes, un front de Pareto.

f₁ = −capacité_accessible

À maximiser. Le nombre de vélos qui peuvent être atteints depuis une porte via un couloir de 1,20 m. C'est la métrique reine — l'objectif principal du moteur.

f₂ = coût_circulation

À minimiser. Le nombre de vélos retirés pour créer les couloirs, plus les pénalités de virage. Un couloir efficace coûte peu de vélos.

Domination de Pareto

Un individu A domine B si et seulement si A est au moins aussi bon que B sur tous les objectifs et strictement meilleur sur au moins un. Les individus non dominés forment le front de Pareto F₁ — l'ensemble des compromis optimaux.

A ≻ B   ⟺   (f₁(A) ≥ f₁(B)) ∧ (f₂(A) ≤ f₂(B)) ∧ (f₁(A) > f₁(B) ∨ f₂(A) < f₂(B))

NSGA-II pas à pas

Le Non-dominated Sorting Genetic Algorithm II de Deb et al. (2002), adapté à l'implantation de parkings vélo.

1

Population initiale

Générer pop_size = 40 individus aléatoires. Un individu spécial est injecté : le baseline, qui correspond à la meilleure configuration trouvée par le constructeur M2/M3 seul. Cela garantit que le NSGA-II démarre au moins aussi bien que le pipeline déterministe.

2

Évaluation

Chaque individu est décodé en configuration, passé au constructeur M2, optimisé par M3, puis évalué par M4 (circulation + accessibilité). Le résultat est un vecteur fitness (f₁, f₂).

3

Tri non dominé

Les individus sont répartis en fronts de Pareto : F₁ (non dominés), F₂ (dominés uniquement par F₁), F₃, etc. Le front F₁ contient les meilleurs compromis capacité/coût.

4

Crowding distance

Au sein d'un même front, les individus sont classés par crowding distance — une mesure de diversité. Les individus les plus « isolés » dans l'espace des objectifs sont préférés, ce qui maintient la diversité du front de Pareto.

5

Sélection par tournoi binaire

Deux individus sont tirés au hasard. Le gagnant est celui du meilleur front ; en cas d'égalité, celui avec la plus grande crowding distance. Ce mécanisme favorise à la fois la qualité et la diversité.

6

Mutation + crossover

Les gagnants des tournois sont combinés (crossover uniforme sur les gènes) et mutés (perturbation aléatoire d'un ou plusieurs gènes). Le résultat est une nouvelle génération de pop_size enfants.

7

Élitisme

Parents et enfants sont fusionnés (pool de 2 × pop_size). Le tri non dominé + crowding distance sélectionne les pop_size meilleurs. Les individus dominés sont éliminés, les bons parents survivent.

8

Budgets durs

L'évolution s'arrête dès que l'un des deux budgets est atteint :

200max_evals
30sbudget_s

Top-N variantes diverses

Ne pas retourner les N meilleurs — retourner les N meilleurs les plus différents.

Distance de Hamming sur bitmaps

Chaque implantation est convertie en un bitmap d'occupation — une image binaire où chaque pixel correspond à une cellule de la grille (occupée ou libre). La distance de Hamming entre deux bitmaps mesure le nombre de cellules différentes. Plus la distance est grande, plus les layouts sont visuellement distincts.

Clustering max-min

Pour sélectionner les N variantes les plus éloignées les unes des autres :

  1. Commencer par le meilleur individu du front F₁
  2. À chaque itération, ajouter l'individu dont la distance minimale aux individus déjà sélectionnés est la plus grande
  3. Répéter jusqu'à avoir N variantes

Cela garantit que les N variantes retournées couvrent uniformément l'espace des solutions possibles. L'utilisateur voit des layouts réellement différents, pas des variations mineures du même plan.

🎯
En pratique : N = 3 à 5 variantes sont retournées. Chaque variante représente un compromis différent : densité maximale, couloir le plus court, mixte râtelier/resserré, etc. L'utilisateur choisit celle qui correspond le mieux au contexte du projet.

Résultats : NSGA-II vs Baseline

L'optimisation génétique découvre des configurations inaccessibles au constructeur déterministe.

Pièce / Configuration M3 (Baseline) NSGA-II Gain
Pièce 46 — resserré 14 28 +100% 🚀
Pièce 47 — râtelier 10 12 +20%
Pièce 47 — mixte 12 13 +1
Pièce 48 — râtelier 10 10 stable
+100%

Meilleur gain (Pièce 46)

200

Évaluations max

30s

Budget temps

💡
D'où vient le +100% sur la pièce 46 ? Le constructeur déterministe testait uniquement la configuration « resserré dense en double rangée ». Le NSGA-II a découvert qu'un layout partitionné en sous-zones à rangée simple exploite mieux l'espace dans cette géométrie en L. La capacité passe de 14 à 28 vélos accessibles — un doublement que l'heuristique gloutonne ne pouvait pas trouver car elle ne remet jamais en question la topologie globale du layout.