Ce projet modélise un boulevard typique de Kinshasa avec intersections, feux de signalisation et trafic mixte (voitures, taxis, bus). L'objectif est de comparer une gestion classique des feux (cycles fixes) avec une approche par apprentissage par renforcement (RL) où un agent décide du feu à chaque intersection pour minimiser l'attente et favoriser les transports en commun.
projet/
├── network/
│ ├── boulevard.nod.xml # Nœuds (intersections)
│ ├── boulevard.edg.xml # Arêtes (routes)
│ ├── boulevard.net.xml # Réseau complet (généré par netconvert)
│ └── additional.add.xml # Arrêts de bus
├── routes/
│ ├── generate_routes.py # Génération aléatoire des flux de véhicules
│ └── routes.rou.xml # Fichier de routes (exemple 1500 véhicules)
├── simulations/
│ ├── no_ai/ # Résultats simulation sans IA
│ │ ├── tripinfo.xml
│ │ ├── summary.xml
│ │ ├── queue.xml
│ │ └── results.csv
│ │ ├── run_no_ai.py # Lance simulation sans IA
│ └── with_ai/ # Résultats simulation avec IA
│ │ ├── tripinfo_ai.xml
│ │ └── results_ai.csv
│ │ ├── train_ai.py # Entraîne l'agent RL
│ │ ├── run_ai.py # Lance simulation avec modèle entraîné
│ │ └── kinshasa_env.py # (esquisse) Environnement personnalisé
├── compare.py # Compare les deux scénarios
├── models/ # Modèles entraînés
│ ├── best/ # Meilleur modèle (checkpoint)
│ └── vec_normalize.pkl # Normalisation
├── config.sumocfg # Configuration SUMO (générée dynamiquement)
└── README.md # Ce fichier
- SUMO (version ≥ 1.18)
Télécharger SUMO
Après installation, définir la variable d'environnementSUMO_HOME(ex:C:\Program Files (x86)\Eclipse Sumo). - Python 3.8+ avec les paquets :
(sumo-rl est une bibliothèque qui fait le pont entre SUMO et Gym)
pip install pandas matplotlib stable-baselines3 sumo-rl gymnasium xmltodict
Le réseau est défini dans les fichiers .nod.xml et .edg.xml. Pour créer le fichier .net.xml :
netconvert --node-files network/boulevard.nod.xml --edge-files network/boulevard.edg.xml --output-file network/boulevard.net.xmlLe script generate_routes.py crée 1500 véhicules (80% voitures, 15% taxis, 5% bus) avec des origines/destinations aléatoires, triés par temps de départ. Les bus sont prioritaires dans la récompense de l'agent.
python routes/generate_routes.pyLe script run_no_ai.py :
- Vérifie que le réseau est valide (le génère si nécessaire)
- Modifie
config.sumocfgpour ajouter les sorties (tripinfo, summary, queue) - Lance SUMO (interface graphique) avec les feux programmés fixes (définis dans le réseau)
- Extrait les métriques (temps d'attente, perte de temps, vitesse) et les sauvegarde dans
simulations/no_ai/results.csv
Lancer :
python scripts/run_no_ai.pyL'agent utilise l'algorithme PPO (Stable-Baselines3) et interagit avec l'environnement via sumo-rl.
La récompense personnalisée est définie dans train_ai.py :
- Pénalité = somme des temps d'attente sur toutes les voies
- Bonus = +20 par bus présent à l'intersection
- Pénalité supplémentaire = -5 si une voie a plus de 10 véhicules à l'arrêt (pour éviter la saturation)
L'entraînement utilise 4 environnements en parallèle (DummyVecEnv) et normalise les observations/récompenses (VecNormalize). Des callbacks sauvegardent les meilleurs modèles.
python scripts/train_ai.pyLes modèles sont stockés dans models/ et models/best/.
Le script run_ai.py :
- Charge le meilleur modèle entraîné et les statistiques de normalisation
- Lance SUMO en mode graphique avec l'agent qui contrôle les feux (actions déterministes)
- Génère un fichier
tripinfo_ai.xmletresults_ai.csv(mêmes métriques que sans IA)
python scripts/run_ai.pyLe script compare.py lit les deux fichiers CSV (results.csv et results_ai.csv) et affiche un tableau comparatif ainsi qu'un graphique à barres.
python scripts/compare.pyExemple de sortie :
=== COMPARAISON ===
Temps d'attente moyen (s) Perte de temps moyenne (s) Vitesse moyenne (m/s)
Sans IA 45.2 38.7 8.3
Avec IA 32.1 27.4 10.1
Le graphique est sauvegardé sous comparison.png.
- La fonction de récompense peut être affinée (intégrer la consommation, les émissions, la priorité aux taxis…).
- L'observation pourrait inclure plus d'informations (positions précises, vitesses).
- Le réseau peut être étendu à plusieurs intersections avec un agent multi‑têtes ou multi‑agents.
- Les temps de cycle des feux sont discrets (changement toutes les N secondes) – on pourrait autoriser des durées variables.
Ce projet est développé à des fins pédagogiques. Vous êtes libres de l'utiliser et de l'adapter.
Auteurs : gb el salvador et patrick misam – dans le cadre d'un cours de telematiqe.