Téma: Objektově orientované programování, simulace, fronty a algoritmy plánování.
Úloha „Simulátor výtahu“ modeluje provoz výtahu v budově s několika patry.
Cílem je navrhnout a implementovat systém, který obsluhuje požadavky cestujících podle zvolené strategie.
Výtah je fyzický systém, který:
- má aktuální patro (
CurrentElevatorFloor) a směr pohybu (CurrentElevatorDirection: nahoru / dolů / nečinný), - spravuje čekající požadavky (
PendingRequests) – cestující čekající na vyzvednutí, - spravuje aktivní cestující (
ActiveRiders) – cestující uvnitř výtahu směřující k cílovým patrům.
Každý krok simulace (TickOneTimeUnit) představuje jednu časovou jednotku:
- výtah se může pohnout o jedno patro (MoveUp/MoveDown),
- výtah může otevřít dveře (OpenDoors) – vyložit a naložit cestující,
- výtah může čekat nečinně (NoAction),
- během simulace průběžně přicházejí nové náhodné požadavky.
Chování výtahu závisí na zvolené strategii obsluhy (IElevatorStrategy), která rozhoduje o dalším kroku.
Implementované strategie:
- FIFO (First-In-First-Out) – obsluhuje požadavky v pořadí příchodu:
- Nejprve vyloží první aktivní cestující, pokud je na cílovém patře
- Poté vyzvedne čekající cestující z prvního požadavku, pokud je na správném patře
- Jinak se pohybuje směrem k cíli prvního požadavku/cestujícího
Další strategie lze implementovat rozšířením rozhraní IElevatorStrategy.
Aplikace nyní podporuje turnajový režim, který automaticky:
- Objeví všechny strategie v projektu
- Spustí každou strategii na více různých scénářích (seedech)
- Agreguje statistiky a vytvoří žebříček výkonnosti
- Seřadí strategie podle průměrné celkové doby (lower is better)
Jak přidat novou strategii:
- Vytvořte novou třídu ve složce
Strategies/ - Implementujte
IElevatorStrategy - Strategie se automaticky objeví v turnaji!
Detailní návod: viz TURNAJ_NAVOD.md
Konfigurace turnaje v Program.cs:
TournamentMode = true/false– zapne/vypne turnajový režimTournamentSeeds = { 42017, 12345, 99999, 54321, 77777 }– pole seedů pro různé scénáře (výchozí: 5 seedů)
-
ElevatorSystem– řídící třída výtahu s vlastnostmi:CurrentElevatorFloor– aktuální patroCurrentElevatorDirection– směr pohybuPendingRequests– čekající požadavkyActiveRiders– cestující ve výtahuStatistics– sledování metrik
-
RiderRequest– požadavek cestujícího:From– výchozí patroTo– cílové patroCreatedAt– čas vytvoření požadavkuPickedUpAt– čas vyzvednutíCompletedAt– čas dokončení
-
Building– konfigurace budovy (min/max patro, validace) -
Statistics– sledování výkonnosti strategie:- Průměrná doba čekání na vyzvednutí
- Průměrná doba cesty
- Průměrná celková doba
- Celkový kumulativní čas (hlavní metrika pro porovnání)
-
StrategyTournament– správa turnaje strategií:- Automatické objevování všech strategií v projektu
- Spuštění každé strategie na více seedech
- Agregace statistik přes všechny běhy
- Seřazení výsledků podle průměrné celkové doby
-
StrategyResult– výsledek jedné strategie v turnaji:- Název strategie
- Agregované statistiky (průměrné časy, počet dokončených požadavků)
=== ELEVATOR SIMULATION ===
🏁 STARTING STRATEGY TOURNAMENT
Testing with 5 different scenarios (seeds)
📋 Found 2 strategies:
- FIFO
- NEARESTFIRST
Running FIFO...
Seed 1/5 (seed=42017): Completed=9, Avg Total=47,22, Avg Wait=42,56
Seed 2/5 (seed=12345): Completed=8, Avg Total=35,12, Avg Wait=29,50
Seed 3/5 (seed=99999): Completed=7, Avg Total=30,00, Avg Wait=26,57
Seed 4/5 (seed=54321): Completed=3, Avg Total=29,33, Avg Wait=22,67
Seed 5/5 (seed=77777): Completed=6, Avg Total=31,83, Avg Wait=26,83
→ Overall: Avg Total Time = 36,00
Running NEARESTFIRST...
Seed 1/5 (seed=42017): Completed=9, Avg Total=34,78, Avg Wait=30,11
Seed 2/5 (seed=12345): Completed=8, Avg Total=34,12, Avg Wait=28,50
Seed 3/5 (seed=99999): Completed=7, Avg Total=30,00, Avg Wait=26,57
Seed 4/5 (seed=54321): Completed=3, Avg Total=27,67, Avg Wait=21,00
Seed 5/5 (seed=77777): Completed=6, Avg Total=23,33, Avg Wait=19,50
→ Overall: Avg Total Time = 30,00
====================================================================================================
TOURNAMENT RESULTS - RANKED BY AVERAGE TOTAL TIME
====================================================================================================
Rank Strategy Avg Total Avg Wait Avg Travel Completed
----------------------------------------------------------------------------------------------------
1 NEARESTFIRST 30,00 26,00 4,00 33
2 FIFO 36,00 31,00 5,00 33
====================================================================================================
🏆 WINNER: NEARESTFIRST with average total time of 30,00 steps
[01] 📞 Request #1: floor 2 → 7
[01] ⬆️ Move up to floor 1
[02] ⬆️ Move up to floor 2
[03] 🚪 Pick up passenger at floor 2 (→ 7)
[04] ⬆️ Move up to floor 3
[05] ⬆️ Move up to floor 4
[06] ⬆️ Move up to floor 5
[07] ⬆️ Move up to floor 6
[08] ⬆️ Move up to floor 7
[09] 🚪 Drop off passenger at floor 7
[20] ✅ Simulation completed
==================================================
SIMULATION STATISTICS
==================================================
Completed requests: 6
Average wait time: 4.33 steps
Average travel time: 5.17 steps
Average total time: 9.50 steps
Total cumulative time: 57 steps
==================================================
V souboru Program.cs:
TimeForRequests = 20– doba generování nových požadavkůMaxFloor = 9– nejvyšší patro budovy (0-9)RequestDensityPercent = 0.30– pravděpodobnost vytvoření požadavku v každém kroku (30%)RandomSeed = 42017– seed pro reprodukovatelnost (používá se v single mode)
TournamentMode = true– zapne turnajový režim (false = test jedné strategie)TournamentSeeds = { 42017, 12345, 99999, 54321, 77777 }– pole seedů pro různé scénáře
- Vytvořte novou třídu ve složce
Strategies/ - Implementujte rozhraní
IElevatorStrategy - Implementujte metodu
DecideNextMove(ElevatorSystem elevator) - Strategie bude automaticky objevena a zařazena do turnaje
Příklad:
namespace ElevatorSimulation.Strategies;
public class MojeStrategieStrategy : IElevatorStrategy
{
public MoveResult DecideNextMove(ElevatorSystem elevator)
{
// Váš algoritmus zde
// Máte přístup k:
// - elevator.CurrentElevatorFloor
// - elevator.CurrentElevatorDirection
// - elevator.PendingRequests
// - elevator.ActiveRiders
// - elevator.Building
return MoveResult.NoAction; // nebo MoveUp, MoveDown, OpenDoors
}
}Strategie se automaticky objeví v turnaji pod názvem "MOJESTRATEGIE" (bez přípony "Strategy").
Možnosti dalšího vývoje:
- Implementujte nové strategie (např. směrnou, optimalizační, SCAN)
- Přidejte podporu více výtahů koordinovaných dispečerem
- Rozšiřte vizualizaci (grafické zobrazení budovy a výtahů)
- Přidejte omezení kapacity výtahu
- Implementujte prioritní požadavky (např. požární poplach)