Inteligentna symulacja skrzyżowania napisana w Javie wraz z JavaFX, która dostosowuje cykle świateł do natężenia ruchu w czasie rzeczywistym. Projekt łączy w sobie klasyczną maszynę stanów z zaawansowaną logiką unikania korków i zagłodzenia pasów ruchu.
Sercem symulacji jest klasa Intersection, która w każdym ticku podejmuje decyzje o zmianie świateł. Algorytm symuluje realne przepisy ruchu drogowego:
- pojazdy skręcające w lewo na pełnym zielonym ustępują pierwszeńśtwa autom jadącym z naprzeciwka.
- ruch na zielonej strzałce jest warunkowy - pojazd ustępuje każdem, kto wjeżdża na pas na pełnym zielonym świetle
Algorytm nie opiera się na prostym timerze, lecz na dynamicznym wyborze celu (Target State Selection). Kiedy nie zostaje wykryty żaden ze specjalnych scenariuszy drogowych opisanych niżej, skrzyżowanie przyznaje zielone światło przeciwgległym drogom, a pozostałym dwóm przyznaje czerwone światło ze strzałką warunkową w prawo.
Logika podzielona jest na dwie niezależne warstwy:
-
Warstwa Planowania (determineTargetState): Analizuje licznik pojazdów na każdej drodze i decyduje, kto powinien otrzymać zielone światło.
-
Warstwa Wykonawcza (handleTransitions): Realizuje bezpieczne przejście do celu poprzez sekwencję: Zielone → Żółte → Czerwone → Czerwono-Żółte → Zielone.
-
Tryb dużego natężenia ruchu w pojedynczej drodze: Jeśli liczba aut na konkretnym pasie przekroczy próg 6 pojazdów i stanowi większość ruchu, system izoluje ten kierunek, nadając mu priorytetowy stan.
-
Zapobieganie zagłodzeniu : Aby uniknąć sytuacji, w której boczna uliczka nie dostaje zielonego światła, wprowadzono licznik stepsInCurrentTarget. Po osiągnięciu przez niego 15 kroków system wymusza zmianę fazy, nawet jeśli ulica mające zielone nie zostałą rozładowana.
-
Tryb nocny: Gdy skrzyżowanie pozostaje puste przez 5 kroków symulacji, przechodzi w tryb ostrzegawczy. Wszystkie sygnalizatory migają na żółto, a pojazdy mogą przejeżdżać natychmiast po sprawdzeniu konfliktów kolizyjnych. Powrót do normalnego trybu następuje dopiero po dwóch krokach symulacji pod rząd z oczekującymi samochodami.
Projekt korzysta z Gradle. Aby uruchomić symulację z własnym plikiem konfiguracji wykonaj:
./gradlew run --args="input.json output.json"
gdzie input.json to zadany plik wejściowy, a output.json to plik wyjściowy, który symulacja stworzy.
W głównym folderze projektu znajdują się 3 przykładowe pliki wejściowe do przetestowania działania symulacji.


