Skip to content

Gbelsalvador/kinshasa-traffic-rl

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

13 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Projet de Simulation et Régulation du Trafic à Kinshasa avec SUMO et Apprentissage par Renforcement

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.

📁 Structure du projet

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

⚙️ Prérequis

  • SUMO (version ≥ 1.18)
    Télécharger SUMO
    Après installation, définir la variable d'environnement SUMO_HOME (ex: C:\Program Files (x86)\Eclipse Sumo).
  • Python 3.8+ avec les paquets :
    pip install pandas matplotlib stable-baselines3 sumo-rl gymnasium xmltodict
    
    (sumo-rl est une bibliothèque qui fait le pont entre SUMO et Gym)

🗺️ Génération du réseau et des flux

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.xml

Le 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.py

🚦 Simulation sans IA (référence)

Le script run_no_ai.py :

  • Vérifie que le réseau est valide (le génère si nécessaire)
  • Modifie config.sumocfg pour 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.py

🤖 Entraînement de l'agent RL

L'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.py

Les modèles sont stockés dans models/ et models/best/.

🧪 Simulation avec IA

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.xml et results_ai.csv (mêmes métriques que sans IA)
python scripts/run_ai.py

📊 Comparaison

Le 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.py

Exemple 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.

🧠 Remarques et perspectives

  • 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.

📄 Licence

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.

About

Apprentissage par renforcement pour la régulation des feux de signalisation sur un boulevard typique de Kinshasa

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages