Das in 4.1. vorgestellte Modell eines Bedienungssystems
(Joe's Barbershop) ist aus methodischen Gründen extrem einfach:
Es kommt mit zwei Klassen von Modellelementen (Transaktionen und Einrichtungen) und
nur fünf verschiedenen Blöcken aus.
Mit diesem Einführungsmodell gibt es noch keine Antwort auf die folgenden Fragen: Wie lang wird die Warteschlange im Mittel und maximal? Wie lang müssen die Kunden im Durchschnitt warten? Wieviele Kunden können ohne zu warten sofort nach ihrem Eintreffen bedient werden?
Mit den bisher eingeführten Modellelementklassen und Anweisungen ist es nicht möglich,
das Modell so zu modifizieren, dass es die folgende neue Situation berücksichtigt:
Joe arbeitet nicht länger allein. Er beschäftigt zwei Gehilfen.
Zur Beantwortung dieser Fragen und zur Einführung der neuen Situation in das Modell
müssen neue Klassen von Modellelementen und neue Blöcke eingeführt werden:
oder Queues dienen der statistischen Erfassung von Wartezeiten
eintretender Transaktionen und der Berechnung von Attributen,
die auf das Warten bezogen sind: Mittlere und maximale Länge der Warteschlange,
Anzahl der ohne Warten durchlaufenden Transaktionen und einige andere.
Als Beispiel dient ein Modell von Joe's Barbershop mit zwei Warteschlangen
oder Storages benutzt man für Modelle mit mehreren,
parallel arbeitenden Bedienern, Bedienungsstationen oder -kanälen.
Ein mehrkanaliges Bedienungssystem kann mehrere Forderungen gleichzeitig bedienen.
Ein Speicher hat ein definiertes Fassungsvermögen, seine Kapazität.
Wenn sie erreicht ist, müssen eintreffende Transaktionen warten,
bis Platz frei wird.
Als Beispiel dient ein Modell eines Salons mit zwei Friseuren.
Warteschlangen oder Queues dienen der
Erfassung statistischer Daten über Verzögerungs-, Warte- oder Blockierzeiten von Transaktionen.
Sie bilden wie die Einrichtungen eine Klasse statischer, passiver, permanenter Modellelemente.
Sie dienen ausschließlich statistischen Zwecken und haben
keinen Einfluß auf den Ablauf der Prozesse und die Folge der Ereignisse im Modell.
Sie sind durch eine Nummer identifizierbar und können darüber hinaus einen Namen tragen.
Transaktionen, die eine Warteschlange betreten, müssen diese auch wieder
verlassen, bevor sie (z.B. durch TERMINATE) vernichtet werden.
Wenn eine Transaktion eine Warteschlange betritt (QUEUE) oder
verläßt (DEPART), wird die Zeitdifferenz
zwischen dem aktuellen Wert der Simulationsuhr
und ihrem Wert zum Zeitpunkt des letzten Ein- oder Austritts aus der Schlange berechnet.
Das Simulationssystem aktualisiert dann automatisch solche statistischen Werte wie
die mittlere Länge der Warteschlange, den maximalen Inhalt und
die mittlere Verweilzeit von Transaktionen in der Schlange.
Beliebig viele Transaktionen dürfen gleichzeitig eine Schlange belegen.
Jede Transaktion darf gleichzeitig mehreren (maximal 6) Warteschlangen angehören.
Transaktionen betreten eine Warteschlange in dem Moment, wo sie einen QUEUE-Block erreichen.
Sie verlassen sie mit dem Erreichen des DEPART-Blockes.
Die Steueranweisung QTABLE,
die später in Verbindung mit der Einführung von Tabellen vorzustellen sein wird,
veranlaßt die Sammlung einer Wartezeitstatistik in Gestalt einer Häufigkeitstafel.
veranlaßt jede eintreffende Transaktion dazu, die Warteschlange zu betreten,
deren Name oder Nummer als erster Operand (Operand A) angegeben ist.
Im Normalfall wächst die aktuelle Länge der Warteschlange beim Betreten
des QUEUE-Blockes um 1. Wenn aber ein zweiter Operand angegeben ist,
bestimmt dessen Wert den Längenzuwachs der Warteschlange.
Operand
Inhalt
A
Nummer oder Name der Schlange
B
Anzahl der Einheiten, um die der Inhalt der Warteschlange zu erhöhen ist,
wenn eine Transaktion den Block betritt
veranlaßt die eintretende Transaktion, die Warteschlange zu verlassen.
Operand
Inhalt
A
Nummer oder Name der Warteschlange
B
Anzahl der Einheiten, um die der Inhalt der Warteschlange zu verringern ist,
wenn eine Transaktion den Block betritt
leer: 1
Numerische Standardattribute von Warteschlangen
NSA
Bedeutung
Qj
Aktueller Inhalt (Länge)
QAj
Mittlerer Inhalt
QCj
Gesamtzahl der Eintritte
QMj
Maximaler Inhalt
QTj
Mittlere Verweildauer aller eingetretenen Einheiten
QXj
Mittlere Verweildauer aller echten Warteeinheiten
QZj
Anzahl der ohne Warten durchgelaufenen Einheiten
j bezeichnet in der obenstehenden Tabelle einen Identifikator
eines statischen Objektes. Für Identifikatoren, die auf ein bestimmtes Modellelement seiner Klasse
(hier: Warteschlangen) verweisen, gibt es die folgenden drei Darstellungsformen:
xpr : numerischer Ausdruck (z.B. Konstante)
$ name
(name)
Beispiele Numerischer Standardattribute für Schlangen
Q3
Aktueller Inhalt (Anzahl der Einheiten) der Warteschlange mit der Nummer 3
QC$SALON
Anzahl der in die Schlange mit dem Namen SALON eingetretenen Einheiten
QM(WAIT)
Maximaler Inhalt der Warteschlange mit dem Namen WAIT
Joe's Barbershop mit zwei Warteschlangen
Die Resultate der Abarbeitung des obigen Programms sind durch den Programmstart direkt erhältlich.
Sie werden hier noch einmal auszugsweise als konstanter Text wiedergegeben.
Der Auszug aus dem LIS-File beschränkt sich auf die Warteschlangenstatistik. SLX-Modell ge("und Resultate","and results") ?>
Resultate: Joe's Barbershop mit zwei Warteschlangen
QUEUE MAXIMUM AVERAGE TOTAL ZERO PERCENT AVERAGE $AVERAGE
CONTENTS CONTENTS ENTRIES ENTRIES ZEROS TIME/UNIT TIME/UNIT
SALOON 2 0.942 101 0 16.600 16.600
WAITJOE 1 0.062 101 60 59.4 1.101 2.712
Wie man sieht, enthält die GPSS/H-Standardausgabe eine Reihe von statistischen Werten,
die in vielen Anwendungsfällen ausreichen. Wenn man weitere Informationen benötigt,
kann man mit Hilfe der QTABLE-Anweisung
ein Histogramm der Wartezeiten erzeugen.
Speicher oder Storages werden benutzt, um mehrkanalige Bedienungssysteme zu modellieren.
Damit sind Bedienungssysteme gemeint, die zur selben Zeit mehr als eine Forderung bedienen können.
Sie eignen sich ebenso zur Nachbildung von Vorratsbehältern für Güter aller Art,
in denen ein- und ausgelagert werden kann.
Speicher haben eine Kapazität, deren Größe man definieren kann.
Sie stellt den maximalen Inhalt dar. Der minimale Inhalt ist Null.
Wenn man die Speicherkapazität nicht definiert, wird sie als unendlich (praktisch 2^31) angenommen.
Sie sind durch eine Nummer identifizierbar und können darüber hinaus einen Namen tragen.
Sie gehören zu den passiven, permanenten, statischen, speziellen Modellelementen.
Beispiele für die Nutzung von Speichern in GPSS-Modellen sind
5 gleichschnell arbeitende Kassiererinnen in einer Kaufhalle,
3 gleiche Verarbeitungsmaschinen in einer Werkstatt,
ein Autobus mit 50 Plätzen,
ein Hotel mit 100 Betten,
ein Kohlenbunker mit einer Kapazität von 50 Tonnen oder
ein Schiff mit einer Ladekapazität von 120 000 Tonnen.
Transaktionen werden daran gehindert, etwas im Speicher einzulagern,
wenn dort zu wenig oder gar kein Platz mehr vorhanden ist.
Transaktionen können andererseits aus dem Speicher etwas entnehmen, solange genügend Inhalt vorhanden ist.
ist eine Steueranweisung, mit der man die Kapazität eines oder mehrerer Speicher definieren kann.
Zwei Formate sind möglich:
sname
STORAGE
capacity
STORAGE
Storage(s),capacity[Storage(s),capacity] ...
Im ersten Format spezifiziert die Marke sname
den Namen oder die Nummer eines Speichers. capacity bezeichnet eine Konstante,
deren Wert die Kapazität des Speichers festlegt.
Das ist die Anzahl der Einheiten, die er maximal zu fassen vermag.
In diesem Format kann man mit einer Anweisung nur eine Speicherkapazität festlegen.
Beispiele für STORAGE-Anweisungen im ersten Format
SAM STORAGE 30
3 STORAGE 100
Das zweite Format der STORAGE-Anweisung erlaubt die
Definition von mehr als einer Speicherkapazität in einer Anweisung. Sj steht hier für den Speicher mit dem Identifikator
j.
S2 bezeichnet den Speicher mit der Nummer 2.
S(name) und S$name
sind gleichbedeutende Bezeichnungen für einen durch seinen Namen identifizierten Speicher.
Sj-Sk mit j < k
bezeichnet alle Speicher mit den Nummern
j, j+1, ..., k.
S(SAM)-S(JOE)
kann man schreiben, wenn man die interne Numerierung kennt und genau weiß,
welche Speichernummern zwischen den Nummern der Speicher SAM und JOE liegen.
Das folgende Beispiel zeigt die Definition mehrerer Speicherkapazitäten
durch eine einzige STORAGE-Anweisung: STORAGE S1,10/S2-S4,20/S(SAM)-S(JOE),1000
ist ein Block, der es Transaktionen erlaubt, die Speicherkapazität dynamisch,
d.h. während der Phase der Blockabarbeitung, festzulegen oder zu modifizieren. BSTORAGE stimmt in seinen Operanden und seiner Funktion im übrigen
mit der STORAGE-Steueranweisung überein.
Für Speicher, deren Kapazität undefiniert bleibt, wird als Default-Wert Unendlich
(de facto 2^31) angenommen.
Sind Einrichtungen gleich Speichern der Kapazität 1? Nein. Das sind die Hauptunterschiede:
Wenn eine Transaktion eine Einrichtung belegt, muß sie diese auch wieder verlassen.
Wenn sie später vernichtet werden soll, gilt eine noch bestehende Einrichtungszugehörigkeit als Modellfehler.
Wenn eine Transaktion einen ENTER-Block betritt, entsteht keine Bindung an den Speicher.
Eine andere Transaktion, welche nie ENTER betreten hat, kann den Speicher mittels LEAVE entlasten.
Für jede Einrichtung besteht die Möglichkeit der Verdrängung einer
gerade in ihr befindlichen Transaktion durch eine andere Transaktion.
Für Speicher gibt es kein Verdrängungs- oder Vorrangbelegungskonzept.
ist ein Block, der die Belastung oder Füllung eines Speichers
beschreibt. Eine ankommende Transaktion darf ihn nur dann betreten, wenn genügend
Platz im Speicher vorhanden ist, um eine oder mehrere Einheiten aufzunehmen.
Sonst muß sie warten, bis genügend Platz frei ist.
Der Block hat maximal zwei Operanden:
Operand
Inhalt
A
Nummer oder Name des Speichers
B
Anzahl der in den Speicher aufzunehmenden Einheiten pro Eintritt einer Transaktion
ist ein Block, bei dessen Betreten eine Transaktion veranlaßt, dass ein Speicher unverfügbar
(Not Available) wird. Die nächste Transaktion, die den Speicher beladen will,
muß vor ENTER warten, bis der Speicher wieder verfügbar ist.
SUNAVAIL beeinflußt den LEAVE-Block nicht:
die Entlastung des Speichers ist auch weiterhin möglich.
ist das Gegenstück zu SUNAVAIL: die ihn betretende Transaktion veranlaßt,
dass ein zuvor gesperrter Speicher wieder freigegeben wird,
so dass ein auf ihn bezogener ENTER-Block wieder betreten werden darf.
Operand
Inhalt
A
Nummer oder Name des Speichers, der wieder verfügbar gemacht werden soll
Numerische und Logische Standardattribute von Speichern
Rj
j
Sj
Aktueller Inhalt (Kapazität = S+R)
SAj
Mittlerer Inhalt
SCj
Gesamtzahl der Einheiten, die den Speicher betreten haben
SEj
Wahr, wenn der Speicher leer ist
SFj
Wahr, wenn der Speicher voll ist
SMj
Maximaler Inhalt
SNEj
Wahr, wenn der Speicher nicht leer ist
SNFj
Wahr, wenn der Speicher nicht voll ist
SNVj
Wahr, wenn der Speicher nicht verfügbar ist
SPUj
Anteil der Zeit der Nichtverfügbarkeit an der gesamten Simulationsdauer
in Promille
SPVj
Anteil der Zeit der Verfügbarkeit an der gesamten Simulationsdauer
in Promille
SRj
Mittlere Auslastung in Promille
SRUj
Mittlere Auslastung während der Zeit der Unverfügbarkeit in Promille
SRVj
Mittlere Auslastung während der Zeit der Verfügbarkeit in Promille
STj
Mittlere Verweildauer einer Einheit im Speicher
SUAj
Mittlere Zeitdauer der Perioden der Unverfügbarkeit
SUNj
Anzahl der Perioden der Unverfügbarkeit
SUTj
Gesamtdauer der Unverfügbarkeit
SVj
Wahr, wenn der Speicher verfügbar ist
Beispiele Numerischer Standardattribute für Speicher
S4
Aktueller Inhalt (Anzahl der Einheiten) des Speichers mit der Nummer 4
SNV$SHOP
Wahr, wenn der Speicher mit dem Namen SHOP nicht verfügbar ist
SA(BUNKER)
Mittlerer Inhalt des Speichers mit dem Namen
BUNKER
Eine der Neuigkeiten in diesem Programm besteht darin, dass
die Blöcke ENTER CHAIRS und LEAVE CHAIRS je zweimal
auftreten. Hier wird folgendes sichtbar: Zwei verschiedene Ströme von
Transaktionen dürfen durchaus auf dieselbe Ressource, im Beispiel auf den
Speicher CHAIRS zugreifen. Die später zu behandelnde Interne
Steuerung sichert, dass beide Ströme nach dem FIFO-Prinzip in eine Kette
wartender Transaktionen eingereiht werden, so dass derjenige Kunde/ diejenige
Kundin zuerst einen Stuhl erhält, der/die zuerst angekommen ist.
Auch der Zutritt zur Schlange WAITAREA kommt in beiden Strömen vor.
Übrigens ist es ziemlich einfach, das Modell so einzurichten,
dass wartende Herren wartenden Damen den Vortritt lassen: Man gibt den Damen bei ihrer Generierung durch
GENERATE
eine höhere Priorität. Den Rest regelt die Interne Steuerung.
Ein weiteres Problem ist anzumerken: Es soll hier nur mit einer Frage angedeutet werden:
Kann es vorkommen, dass ein männlicher Kunde wartet und JOE gleichzeitig ebenfalls auf einen Kunden wartet?
Antwort und Lösung des Problems erfolgen im nächsten Abschnitt.
Zuordnung von Modellelementen zu realen Objekten
In einer tabellarischen Übersicht soll dargestellt werden, welche Modellelementklassen ausgewählt worden sind,
um reale Objekte abzubilden.
Reales Objekt
Name
Modellelementklasse
Kunde
-
Transaktion
Kunden, die auf einen freien Stuhl warten
WAITAREA
Warteschlange
Fünf Stühle für wartende Kunden
CHAIRS
Speicher mit der Kapazität 5
Joe
JOE
Einrichtung
Zwei Damenfriseusen
HAIRDRS
Speicher mit der Kapazität 2
Dem Leser wird empfohlen, über die Zweckmäßigkeit
der gewählten Zuordnung nachzudenken.
Wozu benötigt man die Warteschlange für Warten auf freie Stühle?
Die Resultate der Abarbeitung des obigen Programms sind durch den Programmstart direkt erhältlich.
Sie werden hier noch einmal auszugsweise als konstanter Text wiedergegeben.
Resultate zum Modell: Salon mit 2 Friseuren
RELATIVE CLOCK: 480.0000 ABSOLUTE CLOCK: 480.0000
BLOCK CURRENT TOTAL BLOCK CURRENT TOTAL BLOCK CURRENT TOTAL
1 25 11 37 21 1
2 25 12 37 22 1
3 25 13 37
4 25 14 37
5 25 15 37
6 25 16 37
7 25 17 37
8 1 25 18 37
9 24 19 37
10 24 20 37
--AVG-UTIL-DURING--
FACILITY TOTAL AVAIL UNAVL ENTRIES AVERAGE CURRENT PERCENT SEIZING PREEMPTING
TIME TIME TIME TIME/XACT STATUS AVAIL XACT XACT
JOE 0.788 25 15.125 AVAIL 62
--AVG-UTIL-DURING--
STORAGE TOTAL AVAIL UNAVL ENTRIES AVERAGE CURRENT PERCENT CAPACITY AVERAGE CURRENT MAXIMUM
TIME TIME TIME TIME/UNIT STATUS AVAIL CONTENTS CONTENTS CONTENTS
CHAIRS 0.431 62 16.665 AVAIL 100.0 5 2.153 0 5
HAIRDRS 0.943 37 24.458 AVAIL 100.0 2 1.885 0 2
QUEUE MAXIMUM AVERAGE TOTAL ZERO PERCENT AVERAGE $AVERAGE QTABLE CURRENT
CONTENTS CONTENTS ENTRIES ENTRIES ZEROS TIME/UNIT TIME/UNIT NUMBER CONTENTS
WAITAREA 1 0.012 62 60 96.8 0.091 2.811 0
Nun ist es auch möglich, die mit der Einführung des obigen Modellbeispiels gestellte Frage
zu beantworten:
Im Tagesverlauf ist es tatsächlich zweimal vorgekommen, dass Kunden auf einen freien Stuhl warten mußten.
Insgesamt sind 62 Einheiten eingetreten; davon brauchten 60 nicht zu warten.
Die Standardausgabe gibt Aufschluß über den zum Schluß des Simulationslaufes erreichten Stand.
Wie man den Speicherinhalten und dem Zustand der Einrichtung entnimmt, ist nach 8 Stunden folgender Stand eingetreten: JOE hat gerade einen Kunden auf dem Stuhl. Er war zu 78.8% ausgelastet.
Seine beiden Mitarbeiterinnen sind momentan nicht beschäftigt. Ihre durchschnittliche Auslastung beträgt 94.3%. Klar ist, dass diese an einem Tag beobachteten Werte zufällig sind
und dass ein neuer Lauf mit anderen Zufallszahlen andere Resultate hervorbringt.
Wie man Serien von Zufallsexperimenten veranlaßt und steuert,
wird im Abschnitt 5.6 beschrieben.
Joe's Salon mit Mittagspause und Ladenschluß
In den bisher vorgestellten Beispielen sind die Blöcke SAVAIL und SUNAVAIL
nicht benutzt worden. Das folgende Beispiel soll veranschaulichen, wie man vorgehen kann,
um in den durch den Transaktionsfluß bestimmten Ablauf eines Bedienungsprozesses einzugreifen
und diesen Prozeß durch die Vorgabe einer Pausen- und einer Ladenschlußzeit zu steuern.
Das obige Modell hat einige Ungereimtheiten. Ist es wirklich sinnvoll,
die Simulation genau eine Stunde nach Ladenschluß abzubrechen?
Sollte man nicht lieber warten, bis der letzte Kunde bedient ist?
Ist es richtig, anzunehmen, dass auch während der Mittagspause
ankommende Kunden auf den Stuehlen Platz nehmen und darauf warten, dass die Friseure ihre Arbeit wieder aufnehmen?
Im nächsten Abschnitt sollen die Voraussetzungen dafür geschaffen werden,
derartige Ungereimtheiten zu beseitigen.