Choix de conception, organisation modulaire et stratégie d'optimisation du moteur BikeOptim.
Le moteur BikeOptim s'inspire du papier HABX mais résout un problème fondamentalement différent. Comprendre ces écarts est crucial pour justifier nos choix d'architecture.
Le papier HABX traite des modules rigides : meubles aux dimensions fixes, murs porteurs, cloisons. Les pièces ont des formes figées et le Constraint Programming (CP) gère le placement.
BikeOptim traite des pièces déformables avec des contraintes continues : circulation, accessibilité, entraxes variables. Le constructeur remplace le CP pour le placement.
L'optimiseur manipule un génome structurel compact. Le constructeur le décode en un phénotype complet évaluable.
Le vecteur de décision manipulé par NSGA-II. Compact, il encode les choix structurants :
| Gène | Type | Description |
|---|---|---|
cut | float | Position de coupe le long du segment principal |
system_key | enum | Système de stationnement choisi |
rows_along_s | bool | Rangées parallèles au segment principal |
reverse | bool | Inversion de la direction de placement |
depth_reverse | bool | Inversion de la profondeur |
double_loaded | bool | Bandes chargées des deux côtés |
reserve_corridor | bool | Réservation d'un couloir central |
L'implantation complète produite par le constructeur à partir du génome :
| Composant | Description |
|---|---|
| Emprises | Rectangles au sol de chaque emplacement vélo |
| Allées | Corridors de desserte entre les rangées |
| Circulation | Graphe de connectivité portes → vélos |
| Capacité | Nombre total de places et places accessibles |
| Coût | Somme des distances de circulation |
Le moteur est découpé en 7 modules indépendants avec des responsabilités claires et des dépendances minimales.
| Module | Responsabilité | Dépendances |
|---|---|---|
io |
Chargement JSON, dump Revit — import/export des données de pièces | stdlib |
core |
RoomModel, géométrie, analyse — modèle de salle et opérations géométriques | shapely, numpy |
catalog |
Systèmes de stationnement — catalogue des râteliers, resserres, arceaux | stdlib |
solve |
Constructeur, packing, zones — algorithmes de placement | ortools |
circulation |
Dijkstra, BFS, couloir — analyse d'accessibilité et coûts | numpy |
optimize |
NSGA-II, genome, phénotype — boucle d'optimisation multi-objectif | random |
viz |
Rendu matplotlib — visualisation des implantations | matplotlib |
optimize appelle solve qui appelle core — jamais l'inverse.
Le moteur optimise deux objectifs contradictoires simultanément, formant un front de Pareto.
Maximiser le nombre de vélos accessibles depuis au moins une porte. Le signe négatif convertit la maximisation en minimisation pour NSGA-II.
Minimiser la somme des distances de parcours entre les portes et les emplacements vélo.
chevauchements = 0 — Aucune emprise ne peut en chevaucher une autre.
reconnect = 0 — Tout vélo doit être relié au graphe de circulation.
NSGA-II utilise trois opérateurs pour explorer l'espace de solutions.
La mutation perturbe un individu existant de trois façons possibles :
reverse, double_loaded)cutsystem_key par un système aléatoire du catalogueLe croisement uniforme combine deux parents pour produire un enfant :
La sélection par tournoi binaire avec tri non dominé :
Le moteur est conçu pour une utilisation interactive. Chaque évaluation doit être rapide.