Le M5 explore l'espace des configurations par algorithme évolutionnaire multi-objectif. Il découvre des layouts que le constructeur seul ne peut pas imaginer.
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 |
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.
Le génome ne place aucun vélo directement. Il paramètre le constructeur M2-M4 qui, lui, construit l'implantation.
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.
Pour chaque individu, le pipeline complet est exécuté :
Deux objectifs antagonistes, un front de Pareto.
À 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.
À 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.
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.
Le Non-dominated Sorting Genetic Algorithm II de Deb et al. (2002), adapté à l'implantation de parkings vélo.
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.
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₂).
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.
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.
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é.
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.
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.
L'évolution s'arrête dès que l'un des deux budgets est atteint :
Ne pas retourner les N meilleurs — retourner les N meilleurs les plus différents.
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.
Pour sélectionner les N variantes les plus éloignées les unes des autres :
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.
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 |
Meilleur gain (Pièce 46)
Évaluations max
Budget temps