Ce projet apprend à de petites voitures à conduire toutes seules sur des circuits, sans jamais leur expliquer comment faire. Personne ne programme « tourne à gauche ici » ou « freine avant ce virage » : les voitures partent de zéro, la plupart s'écrasent immédiatement contre les murs… puis, génération après génération, une population entière finit par apprendre à enchaîner les tours proprement.
Le tout est piloté par la combinaison de deux idées :
- un réseau de neurones sert de « cerveau » à chaque voiture (il transforme ce qu'elle perçoit en gestes de conduite) ;
- un algorithme génétique joue le rôle de la sélection naturelle (les meilleures voitures se reproduisent, les pires disparaissent).
Une vidéo présente un résultat obtenu après apprentissage (cliquez sur l'image) :
Chaque voiture est autonome. À chaque instant, elle ne dispose que de ce qu'elle « voit » autour d'elle, et elle doit décider quoi faire.
- 9 capteurs de distance, comme des rayons partant de la carrosserie dans plusieurs directions (devant, sur les côtés, en diagonale). Chaque capteur mesure la distance jusqu'au bord de la piste. C'est sa seule vision du circuit.
- L'angle courant du volant (normalisé), pour qu'elle sache où en est sa direction avant de décider de tourner davantage — indispensable pour anticiper l'inertie du volant.
- Sa propre vitesse, pour qu'elle puisse adapter sa conduite selon qu'elle roule vite ou lentement.
Le cerveau est composé de 3 neurones, chacun responsable d'une décision élémentaire, prise à chaque pas de temps :
| Neurone | Rôle |
|---|---|
| Vitesse | accélérer ou freiner |
| Direction + | tourner d'un côté |
| Direction − | tourner de l'autre côté |
Chaque neurone combine les entrées à sa façon, passe le résultat dans une fonction de décision (sigmoïde) et déclenche son action si un certain seuil est franchi. Toutes ces valeurs (le poids donné à chaque capteur, les seuils, etc.) constituent les gènes de la voiture : c'est exactement ce que l'évolution va faire varier.
Quatre contraintes « physiques » réalistes sont intégrées :
- plus une voiture roule vite, moins elle peut tourner serré — foncer en ligne droite est tentant, mais ingérable dans les virages ;
- plus une voiture roule vite, moins ses freins sont efficaces — à pleine vitesse les freins ne valent que 70 % de leur puissance nominale, ce qui force la voiture à anticiper le freinage ;
- plus une voiture roule vite, moins elle accélère fort — la puissance moteur disponible diminue à haute vitesse, comme sur une vraie voiture ;
- le volant a de l'inertie — impossible de passer de plein gauche à plein droite en un seul instant ; la direction doit d'abord revenir au neutre, ce qui impose des trajectoires plus douces et plus réalistes. Virer entraîne également une légère perte de vitesse (frottement latéral des pneus).
La voiture doit donc apprendre à doser vitesse, trajectoire, freinage et anticipation.
On ne corrige jamais une voiture individuellement. On fait évoluer une population entière (200 voitures) sur plusieurs générations.
Une génération se déroule ainsi :
-
Épreuve. Les 200 voitures sont lâchées en même temps sur un circuit. Chacune roule avec son propre cerveau jusqu'à ce qu'elle sorte de la piste, atteigne l'arrivée, ou que le temps imparti soit écoulé.
-
Notation. Chaque voiture reçoit un score qui récompense :
- la distance parcourue le long du tracé (avoir franchi le plus de jalons possible) ;
- finir le tour, et le finir vite ;
- une vitesse de pointe élevée ;
…et qui pénalise une conduite hésitante (trop de petits coups de volant) ainsi que les trajectoires longues : parmi les voitures qui bouclent le tour, celles qui ont parcouru moins de kilomètres sont favorisées, ce qui fait émerger la corde dans les virages.
-
Sélection. On classe les voitures par score. La meilleure moitié survit, la pire moitié est éliminée.
-
Reproduction. Les survivantes se « croisent » deux à deux : leurs enfants héritent d'un mélange des gènes de leurs deux parents pour repeupler la moitié éliminée.
-
Mutation. Une partie des enfants subit de petites altérations aléatoires de leurs gènes. C'est ce qui introduit de la nouveauté et évite que toute la population se fige sur une même façon (imparfaite) de conduire.
Si une génération est globalement catastrophique (l'élite elle-même n'avance pas), du « sang neuf » entièrement aléatoire est réinjecté pour relancer la recherche.
Au fil des générations, les bonnes stratégies de conduite se diffusent dans la population et se raffinent.
Le danger d'un apprentissage sur un seul circuit, c'est qu'une voiture apprenne le tracé par cœur au lieu d'apprendre à conduire. Pour l'éviter, l'entraînement tourne sur 12 épreuves : 6 circuits différents, chacun parcouru dans les deux sens.
L'objectif ultime est de produire des voitures championnes, c'est-à-dire capables de boucler les 12 circuits. Une voiture qui réussit cet exploit a démontré qu'elle a appris un véritable comportement de conduite, généralisable, et non une recette propre à un tracé.
Le « cerveau » de ces championnes peut alors être exporté (au format JSON) pour être conservé, partagé ou rejoué.
Une fois qu'on possède un ou plusieurs cerveaux de champions, le mode Verdict permet de les rejouer sur un circuit d'évaluation (un tracé « normal » ou une variante « fun »). On voit alors directement, à l'écran, les voitures apprises se débrouiller sur un parcours qu'elles n'ont pas servi à les entraîner — la preuve par l'image que l'apprentissage a fonctionné.
L'interface (Qt) affiche le circuit et la nuée de voitures en train de rouler en temps réel, avec le chrono et le suivi de la meilleure voiture. On y trouve aussi :
- des réglages d'entraînement : nombre de tentatives par circuit avant de passer au suivant, nombre de champions visés, export d'images de la simulation ;
- des outils de mise au point : piloter soi-même une voiture au clavier (utile pour « sentir » la physique et visualiser les capteurs), tester un angle de départ, ou générer les jalons d'un nouveau circuit.
L'export d'images successives permet, après coup, d'assembler une vidéo de la progression de l'apprentissage.
Le projet est écrit en C++ avec Qt 5 et utilise json-c pour la sérialisation des cerveaux.
Dépendances (exemple sous Debian/Ubuntu) :
sudo apt install qtbase5-dev libjson-c-devCompilation puis lancement :
qmake
make
./iaDans la fenêtre, lancez un entraînement, ou ouvrez le mode Verdict pour rejouer des cerveaux déjà appris.
Pour comprendre le fonctionnement interne (physique des voitures, capteurs, structure du
réseau de neurones, détail de l'algorithme génétique, format de sérialisation), voir la
documentation technique → ARCHITECTURE.md.
On ne dit jamais aux voitures comment conduire. On leur donne des yeux (des capteurs), un cerveau minuscule (3 neurones), et une seule règle : les meilleures se reproduisent. Le reste émerge tout seul.

