Semestralne zadanie zaliczeniowe z Laboratorium Programowania Obiektowego.
Listopad’99.

Zaprojektuj i zaimplementuj w Smalltalku system symulujący ruch pociągów.

Symulacja ma obejmować zamknięta (tzn. pociągi nie wyjeżdżają poza nią) sieć kolejową. Sieć składa się z 
węzłów. Węzły reprezentują istotne punkty sieci kolejowej i mogą być:
- stacjami,
- mijankami (miejsca gdzie mogą się wyminąć dwa pociągi),
- rozgałęzieniami (miejsca gdzie tory się schodzą bądź rozchodzą. Uwaga: nie każda zwrotnica jest 
rozgałęzieniem, np. na stacji może być wiele zwrotnic z których żadna nie jest rozgałęzieniem),
- punktami synchronizującymi (długie odcinki torów są podzielone na segmenty z semaforami 
uniemożliwiającymi wjazd pociągu na kolejny segment torów, dopóki nie opuści go poprzedni pociąg 
jadący w tym samym kierunku),
- końcami torów (bocznica jest reprezentowana przez tor kończący się końcem torów).
Węzły są połączone torami. Dwa węzły mogą być połączone dowolną liczbą torów (>=0, w praktyce <=2). Na 
jednym torze między dwoma węzłami może naraz znajdować się co najwyżej jeden pociąg. Wszystkie tory mają 
swoją długość. Dla uproszczenia zakładamy, że mijanki i stacje są na tyle długie, że zmieści się na nich każdy 
pociąg. Każda stacja ma określoną liczbę torów na których mogą jednocześnie stać pociągi.

W sieci kursują pociągi. Pociągi składają się z wagonów. Każdy pociąg ma maksymalną dopuszczalną szybkość. 
Są różne rodzaje pociągów:
- pasażerskie (osobowe, pośpieszne i ekspresowe),
- towarowe,
- drezyny.
Pociągi pasażerskie mają rozkład wg którego kursują (a przynajmniej powinny). Pociągi towarowe i drezyny 
mają tylko miejsce przeznaczenia. Pociągi osobowe nie zmieniają swojego składu (zestawu wagonów). Pociągi 
towarowe mają dopuszczalną maksymalną liczbę wagonów. Wagony te są odczepiane i dołączane na stacjach. 
Każdy wagon towarowy ma swoje miejsce przeznaczenia (które się zmienia po dotarciu do niego). Miejsce 
przeznaczenia wagonu towarowego nie musi się pokrywać z miejscem przeznaczenia całego pociągu. Obsługa 
stacji stara się dołączać do przejeżdżających przez stacje pociągów (towarowych) wagony czekające na przejazd 
w kierunku zgodnym z kierunkiem jazdy przejeżdżającego pociągu. Zakładamy, że każda stacja ma górkę 
rozrządową i dodatkową bocznicę do przetrzymywania wagonów towarowych czekających na podłączenie do 
pociągu (a więc nie blokują one torów stacji). Dla uproszczenia zakładamy również, że stacje są w stanie 
pomieścić dowolną liczbę oczekujących wagonów towarowych. Pomijamy kwestie optymalności zestawiania 
pociągów towarowych, problemy z odłączaniem wagonu ze środka składu itp., jedyne wymaganie dotyczy tego, 
żeby wagony nie były złośliwie przetrzymywane na stacjach. Nowe miejsce przeznaczenia pociągu towarowego, 
który dojechał do stacji docelowej jest generowane przez system (np. na podstawie informacji o miejscach 
przeznaczenia wagonów towarowych znajdujących się na tej stacji). Drezyny są wysyłane co pewien czas ze 
stacji (np. w celu sprawdzenia torów), po dotarciu do stacji docelowej są zestawiane z torów (więc nie blokując 
torów mogą czekać, aż znów będą potrzebne). Minimalny czas postoju na stacji pociągu towarowego zależy 
liniowo od liczby dołączanych/odłączanych wagonów (w szczególności może wynosić 0, gdy nie ma takich 
operacji), postój pociągu pasażerskiego trwa przez czas określony w rozkładzie jazdy. Każdy pociąg ma średnią 
prędkość jazdy (używaną przez symulację do policzenia czasu przejazdu przez odcinek torów). Na mijankach i 
stacjach drezyny czekają na zbliżające się pociągi wszystkich pozostałych rodzajów, pociągi towarowe na 
pasażerskie, pociągi osobowe na pośpieszne i ekspresowe, a pośpieszne na ekspresowe.

System powinien zapewniać bezkolizyjne i w miarę możliwości zgodne z rozkładem jazdy kursowanie pociągów 
pasażerskich oraz zgodne z miejscem przeznaczenia kursowanie drezyn i pociągów towarowych. 

System powinien ponadto umożliwiać:
- podawanie w wygodny sposób parametrów symulacji (liczba pociągów i węzłów poszczególnych rodzajów, 
maksymalna liczba wagonów, maksymalna szybkość pociągów poszczególnych rodzajów, czasy postoju i 
przeładunku, średnia odległość między węzłami, itp.),
- wyświetlanie informacji o stanie wybranych stacji (inf. o oczekujących pociągach) i pociągów (jedzie/stoi, 
liczba wagonów, szybkość, miejsce docelowe, miejsce aktualne). W wersji podstawowej (<=4) stacje i 
pociągi można wybierać tylko z góry, w wersji rozszerzonej (<=5) także podczas symulacji,
- generowanie zdarzeń (awaria pociągu, uszkodzenie torów). W wersji podstawowej (<=4) można je 
generować tylko z góry (np. zadając ich prawdopodobieństwo), w wersji rozszerzonej (<=5) także podczas 
symulacji,
- wyświetlanie wyników symulacji (minimalny/średni/maksymalny/łączny czas spóźnienia pociągu, liczba 
przejechanych wagono-kilometrów itp.).
- 
W wersji rozszerzonej (<=5) można przyjąć dodatkowe założenia o rozmiarze sieci umożliwiające jej wygodną 
wizualizację (tak by użytkownik mógł łatwo wskazywać interesujące go obiekty). W wersji podstawowej 
wizualizacja symulacji może się ograniczyć do wyświetlania jedynie informacji tekstowych. Liczba parametrów 
symulacji/wyświetlanych wyników oraz wygoda ich zadawania/odczytywania będzie miała wpływ na końcową 
ocenę.