Ce projet implémente une simulation de circulation de trains sur une ligne ferroviaire avec gares et sections. Il utilise la programmation concurrente en Java avec des mécanismes de synchronisation pour éviter les collisions et les interblocages.
trains_project/
├── bin/
│ └── train/ # Fichiers compilés (.class)
├── src/
│ └── train/ # Code source Java
│ ├── BadPositionForTrainException.java # Exception pour position invalide
│ ├── Direction.java # Énumération des directions (LR/RL)
│ ├── Element.java # Classe abstraite pour éléments de la ligne
│ ├── Station.java # Gare
│ ├── Section.java # Section de voie ferrée
│ ├── Position.java # Position d'un train (élément + direction)
│ ├── Train.java # Représentation d'un train
│ ├── Railway.java # Gestion de la ligne et synchronisation
│ ├── RailwayView.java # Interface de visualisation
│ ├── RailwayFrame.java # Fenêtre graphique
│ └── Main.java # Point d'entrée du programme
└── README.md # Ce fichier
Element (abstract)
├── Station # Gare (aux extrémités)
└── Section # Section de voie ferrée
Train (Runnable) # Train autonome (thread)
Position # Position = Élément + Direction
Direction (enum) # LR (Left-Right) ou RL (Right-Left)
Railway # Gestionnaire de la ligne ferroviaire
- Capacité : n quais (peut accueillir n trains simultanément)
- Position : Aux extrémités de la ligne (début ou fin)
- Fonction : Point de départ/arrivée des trains
- Règle : Les trains changent de direction automatiquement en arrivant
- Capacité : 1 train maximum
- Fonction : Tronçon de voie entre deux gares
- Règle : Un seul train à la fois pour éviter les collisions
Chaque train réserve une place à la gare de destination avant de quitter sa gare actuelle. Cela garantit qu'il aura une place en arrivant.
État de la gare :
- Places totales : size
- Places occupées : trainCount
- Places réservées : reservedSpots
- Places disponibles : size - trainCount - reservedSpots
Gestion par Segment :
La ligne est divisée en segments (portions entre deux gares). Chaque segment a son propre contrôle de direction.
Configuration :
GareA ── AB ── BC ── CD ── GareD
Règle :
- Un train ne peut entrer sur la ligne que si aucun train ne circule en sens inverse
- Les trains dans le même sens peuvent se suivre (mais pas se doubler)
Une section ne peut contenir qu'un seul train à la fois
Implémentation :
Section.canAccept()retournetrueseulement sitrainCount == 0- Utilisation de
synchronizeddansRailway.move()
Si un train circule dans une direction, aucun train ne peut circuler en sens inverse sur les sections
Implémentation :
- Compteurs
trainsOnSectionsLRettrainsOnSectionsRL: nombre de trains par direction - Méthode
canLeaveStation(): vérifie qu'aucun train n'est en sens inverse - Vérification avant chaque départ de gare
Un train doit réserver une place à la gare de destination avant de partir
Pourquoi ? Sans réservation, plusieurs trains pourraient partir vers une gare qui n'a pas assez de places.
Solution : Le train réserve une place dès qu'il décide de partir. La réservation est convertie en occupation réelle à l'arrivée.
┌─────────────────────────────────────────┐
│ 1. Train dans une GARE │
│ Veut aller vers une SECTION │
└──────────────┬──────────────────────────┘
│
▼
┌─────────────────────────────────────────┐
│ 2. Vérifications (attente si nécessaire)│
│ - Section suivante libre ? │
│ - Trains opposés SUR CE SEGMENT ? │
│ - Gare destination a des places ? │
└──────────────┬──────────────────────────┘
│ OUI à toutes
▼
┌─────────────────────────────────────────┐
│ 3. Réservation │
│ - Réserver place à gare destination │
│ - Quitter gare actuelle │
│ - Entrer dans section │
│ - Enregistrer train sur le segment │
└──────────────┬──────────────────────────┘
│
▼
┌─────────────────────────────────────────┐
│ 4. Train sur SECTION │
│ Veut aller vers SECTION ou GARE │
└──────────────┬──────────────────────────┘
│
▼
┌─────────────────────────────────────────┐
│ 5. Si vers SECTION : │
│ - Attendre que section soit libre │
│ - Quitter section actuelle │
│ - Entrer dans nouvelle section │
│ │
│ Si vers GARE : │
│ - Quitter section │
│ - Libérer le segment │
│ - Consommer réservation │
│ - Entrer dans gare │
└──────────────┬──────────────────────────┘
│
▼
┌─────────────────────────────────────────┐
│ 6. Changement de direction si besoin │
│ - À l'extrémité droite : LR → RL │
│ - À l'extrémité gauche : RL → LR │
└──────────────┬──────────────────────────┘
│
▼
Recommencer
- Java JDK 8 ou supérieur
- Terminal PowerShell (Windows) ou terminal Unix
Windows (PowerShell) :
# Se placer dans le répertoire du projet
cd "\trains_project"
# Compiler tous les fichiers Java
javac -d bin src/train/*.javaWindows (PowerShell) :
# Exécuter le programme
java -cp bin train.MainSi vous utilisez VS Code :
- Ouvrir le dossier du projet
- Ouvrir src/train/Main.java
- Cliquer sur "Run" au-dessus de la méthode
main
Éditer src/train/Main.java :
// Configuration actuelle : 4 trains
Train t1 = new Train("T1", new Position(A, Direction.LR), railway);
Train t2 = new Train("T2", new Position(A, Direction.LR), railway);
Train t3 = new Train("T3", new Position(D, Direction.RL), railway);
Train t4 = new Train("T4", new Position(D, Direction.RL), railway);// Exemple actuel
Station A = new Station("GareA", 3); // Gare gauche, 3 places
Station D = new Station("GareD", 3); // Gare droite, 3 places
Section AB = new Section("AB");
Section BC = new Section("BC");
Section CD = new Section("CD");
Element[] elements = { A, AB, BC, CD, D };Pour modifier la capacité d'une gare :
Station A = new Station("GareA", 5); // 5 places au lieu de 3Le programme affiche :
- Fenêtre graphique : Visualisation de la ligne avec les trains
- Console : Journal des événements (départs, arrivées, attentes, réservations)
Ligne de chemin de fer: GareA--AB--BC--CD--GareD
Configuration: 2 gares terminales (3 places chacune)
Train T1 créé à GareA, direction → droite
Train T2 créé à GareA, direction → droite
Train T3 créé à GareD, direction ← gauche
Train T4 créé à GareD, direction ← gauche
Démarrage de la simulation avec 4 trains...
Train[T1] démarre
Train[T2] démarre
Train[T3] démarre
Train[T1] réserve une place à GareD (disponibles: 2/3)
Train[T3] réserve une place à GareA (disponibles: 2/3)
Train[T1] is on AB going from left to right
Train[T3] is on CD going from right to left
...
Résultat attendu : Les trains circulent sans blocage grâce à la règle de sens unique
Résultat attendu : Les trains réservent leur place avant de partir, pas de surcharge des gares
Résultat attendu : L'interface graphique affiche les trains et leurs mouvements en temps réel
- Auteurs originaux : Fabien Dagnat, Philippe Tanguy, Mayte Segarra (IMT Atlantique)
- Modifications : Extension avec système de réservation et visualisation graphique
Projet à des fins éducatives - IMT Atlantique
Dernière mise à jour : Février 2026