MODULE Migros; (* RandomNumbers brauchen wir für die Exponentialverteilung und Out brauchen wir für die Ausgabe auf dem Bildschirm *) IMPORT RandomNumbers, Out; CONST Simulationsdauer = 100000; (* simulation soll nach 100000 iterationen stoppen *) (* die Welt besteht aus Kunden und Kassen. Die Kunden sind in Warteschlangen bzw. linearen Listen (lies dazu mein Skript). Die Kassen haben immer eine Warteschlange zugeteilt. Die Kassen selbst befinden sich in einer Ringliste damit man während der Simulation immer alle Kassen durchgehen kann. *) TYPE Kunde = POINTER TO RECORD (* stellt einen Kunden dar *) eintrittszeit : REAL; (* zu welcher Zeit trat er in die Warteschlange ein? *) naechster : Klient; (* nachfolgender Kunde in der Warteschlange *) END; Kasse = POINTER TO RECORD (* stellt eine Kasse dar *) warteschlange : Kunde; (* erster (am längsten anstehende) Kunde der dazugehörenden Warteschlange *) warteschlange2 : Kunde; (* brauchen wir, wenn die Kasse zwei Warteschlangen hat *) freium : REAL; (* zeit, in welcher die kasse wieder frei sein wird 0 bedeutet sofort frei, sonst ist es wenn (freium = Time()) wahr ist *) naechste : Kasse; (* naechste zur Verfügung stehende Kasse *) END; VAR Kassenring : Kasse; (* eine Kasse aus dem Kassenring, damit wir darauf zugreifen können *) (* Varialben für Statistiken *) VAR BedienteKunden : INTEGER; (* wieviele Kunden wurden bedient? *) DurchschnittlicheWartezeit : REAL; MaximaleWartezeit : REAL; (* maximal registrierte Wartezeit *) (* Dinge, die wir mit Warteschlangen tun können *) (* neuer Kunde "k" in Warteschlange "warteschlange" aufnehmen. w ist dabei irgendein Kunde aus der Warteschlange *) PROCEDURE KundeEinfuegen(k : Kunde; warteschlange : Kunde); BEGIN (* TODO : Kunde k in warteschlange anhängen *) END KundeEinfuegen; (* Dinge, die wir mit Kassen tun können *) PROCEDURE AmerikanischeKasseÖffnen(); BEGIN (* TODO: Neue Kasse k erstellen & dem Kassenring hinzufügen, und einen letzten Sentinelkunden in warteschlange tun. *) END AmerikanischeKasseÖffnen; PROCEDURE EuroKasseÖffnen(); BEGIN (* TODO: Neue Kasse k erstellen & dem Kassenring hinzufügen, und einen letzten Sentinelkunden in warteschlange tun. *) END EuroKasseÖffnen; (* Dinge, die wir während der Simulation brauchen *) PROCEDURE KasseNimmtNaechsten(k : Kasse); BEGIN (* TODO: Kasse nimmt nächsten Kunden & berechnet, wenn sie wieder frei sein wird *) INC(BedienteKunden); (* Statistik nachführen *) END KasseNimmtNaechsten; PROCEDURE EinKundeKommt(); BEGIN (* TODO: Kunde wird eingefügt mit zeit, wenn er eintrat. zusätzlich musst man entscheiden, an welcher schlange er ansteht - zufällig eine Kasse im Kassenring nehmen und dort an eine zufällige Warteschlange hängen *) END EinKundeKommt; PROCEDURE NaechsteKasse( VAR k : Kasse; VAR t : REAL ); BEGIN (* TODO: welche Kasse wird als naechstes frei? die mit der kleinsten freium zahl. das ist dann auch die aktuelle zeit (sofern dieses freium <> 0) *) END NaechsteKasse; (* Simuliere das Ganze *) PROCEDURE SimuliereEuro()*; VAR t : REAL; (* aktuelle Zeit *) VAR aktuelle : Kasse; (* aktuelle Kasse *) BEGIN (* TODO: alle linearen Listen initialisieren *) (* TODO: Statistiken auf null setzen *) (* TODO: Zeit auf null *) (* TODO: europäische Kasse öffnen *) (* TODO: erster Kunde soll kommen *) (* mache solange, bis Simulationsdauer erreicht *) WHILE t <= Simulationsdauer DO EinKundeKommt(); (* füge neuen Kunden ein *) NaechsteKasse( aktuelle, t ); (* nächste Kasse finden und Zeit aktualisieren *) KasseNimmtNaechsten( aktuelle ); (* aktuelle Kasse soll nächsten Kunden bedienen *) END; (* alle Statistiken ausgeben *) Out.String("Statistik zu Simulation"); END SimuliereEuro; PROCEDURE SimuliereAmerika()*; VAR t : REAL; (* aktuelle Zeit *) VAR aktuelle : Kasse; (* aktuelle Kasse *) BEGIN (* TODO: alle linearen Listen initialisieren *) (* TODO: Statistiken auf null setzen *) (* TODO: Zeit auf null *) (* TODO: europäische Kasse öffnen *) (* TODO: erster Kunde soll kommen *) (* mache solange, bis Simulationsdauer erreicht *) WHILE t <= Simulationsdauer DO EinKundeKommt(); (* füge neuen Kunden ein *) NaechsteKasse( aktuelle, t ); (* nächste Kasse finden und Zeit aktualisieren *) KasseNimmtNaechsten( aktuelle ); (* aktuelle Kasse soll nächsten Kunden bedienen *) END; (* alle Statistiken ausgeben *) Out.String("Statistik zu Simulation"); END SimuliereAmerika; BEGIN END Migros. Migros.SimuliereAmerika ~ Migros.SimuliereEuro ~