Tout ce qu'il faut savoir sur BikeOptim en un seul endroit : réponses aux questions courantes, définitions des termes techniques et carte des modules.
Les 8 questions les plus posées sur le moteur BikeOptim, avec des réponses détaillées.
BikeOptim est un moteur autonome en CPython, successeur du moteur pyRevit (IronPython) gelé dans legacy/.
Il apporte trois avancées majeures :
Les fichiers Revit stockent les coordonnées en pieds (unité interne de Revit), mais le moteur BikeOptim travaille exclusivement en mètres.
La conversion est effectuée à l'import (module io). Ce choix est motivé par :
Pour ajouter une pièce au moteur :
bikeoptim-room/1 dans data/rooms/L'optimiseur maximise la capacité accessible, pas la capacité brute. Un placement glouton peut entasser 35 vélos, mais si 10 sont injoignables depuis les portes, la solution est moins bonne qu'un placement de 28 vélos tous accessibles.
29 places brutes
15 injoignables
= 14 accessibles
28 places brutes
0 injoignable
= 28 accessibles ✓
Oui. Les poteaux sont modélisés comme des obstacles internes dans le JSON de la pièce.
Le constructeur les évite automatiquement : les emprises vélo doivent être intégralement contenues dans le polygone de la pièce, sans chevaucher aucun obstacle.
C'est la garantie que le moteur ne peut jamais produire un résultat inférieur au glouton.
Le mécanisme est simple : pour chaque configuration, deux algorithmes sont évalués en parallèle :
On garde le meilleur résultat. Impossible de régresser par rapport à l'heuristique.
Tout aléa dans le moteur passe par un unique générateur : random.Random(seed).
Deux exécutions avec le même seed donnent exactement le même résultat : même population initiale, mêmes mutations, même front de Pareto final.
La feuille de route post-M5 inclut :
Définitions de tous les termes techniques utilisés dans la documentation BikeOptim.
| Terme | Définition |
|---|---|
| Emprise | Rectangle au sol d'un emplacement vélo, incluant le dégagement nécessaire |
| Entraxe | Distance entre les centres de deux emprises adjacentes dans une même rangée |
| Bande | Une rangée d'emplacements vélo + son allée de desserte associée |
| Golden numbers | Capacités de référence du moteur legacy, utilisées comme benchmark de régression |
| Glissement | Algorithme leftmost-fit pour placer les vélos séquentiellement dans une rangée |
| Front de Pareto | Ensemble des solutions non dominées — aucune autre solution n'est meilleure sur tous les objectifs |
| Crowding distance | Mesure de diversité dans NSGA-II : écart moyen aux voisins sur le front de Pareto |
| Death penalty | Pénalité infinie attribuée à un vélo inaccessible depuis toute porte |
| CP-SAT | Solveur de programmation par contraintes d'OR-Tools, utilisé pour le packing exact |
| NSGA-II | Non-dominated Sorting Genetic Algorithm II — algorithme d'optimisation multi-objectif évolutionnaire |
| AABB | Axis-Aligned Bounding Box — boîte englobante alignée sur les axes, utilisée pour le pré-filtrage de collisions |
| SAT | Separating Axis Theorem — théorème de l'axe séparateur pour la détection exacte de chevauchement entre polygones convexes |
| DP | Dynamic Programming — programmation dynamique, utilisée pour optimiser certains sous-problèmes de placement |
Vue synthétique de l'organisation du code source BikeOptim, avec les fichiers clés de chaque module.
| Module | Fichiers clés | Rôle |
|---|---|---|
bikeoptim.io |
rooms.py, revit_dump.py |
I/O — Import JSON et export Revit |
bikeoptim.core |
room_model.py, geometry.py, analysis.py |
Géométrie — Modèle de salle et opérations spatiales |
bikeoptim.catalog |
systems.py |
Systèmes — Catalogue des équipements vélo |
bikeoptim.solve |
constructor.py, packing.py, rows.py, zone.py |
Construction — Placement et packing des emprises |
bikeoptim.circulation |
access.py, connect.py |
Circulation — Accessibilité et graphe de parcours |
bikeoptim.optimize |
genome.py, phenotype.py, nsga2.py, diversity.py |
Optimisation — NSGA-II et gestion du front de Pareto |
bikeoptim.viz |
render.py |
Visualisation — Rendu matplotlib des plans |
__init__.py qui expose l'API publique.
Les détails d'implémentation restent privés (préfixe _).