Dies ist ein Hamster. Natürlich kein echter (biologischer) Hamster, sondern ein Computerprogramm. Es dient zur Teilnahme am Programmier-Wettbewerb 2002, welcher an der Otto-von-Guericke-Universität Magdeburg im Rahmen der Vorlesung Algorithmen und Datenstrukturen durchgeführt wird.
Eigentlich sollte der Hamster einen Finnischen Namen bekommen, doch mir fiel keiner ein. Ich haben dann einfach den internen Projektnamen verwendet. Pmk sind meine Initialen, Hampster ist das englischen Wort für Hamster, Mapped weil der Hamster eine Map (eine Karte) benutzt, um sich zu orientieren und 2 weil der erste Hamster mit Map nichts geworden ist.
Das sechseckige "Spielfeld", auf dem der Hamster läuft, besteht aus vielen einzelnen Sechsecken. Es besteht für den Hamster die theoretische Möglichkeit, in alle sechs Richtungen zu laufen. Da es sich bei dem Spielfeld jedoch um ein Labyrinth handelt, welches auch Wänden enthält, stehen dem Hamster nicht immer alle sechs Richtungen zur Verfügung.
PmkHampsterMapped2 geht nun folgendermaßen vor:
Der Hamster nutzt zur Orientierung auf dem Gesamtfeld eine quadratische Karte, da sich die sechseckig realisierte Karte - bereits fertiggestellt - als zu Berechnungs- (und somit Zeit-) intensiv erwies. In der quadratischen Karte bleiben einige Felder ungenutzt. Ergebnis: Läuft schneller, braucht aber mehr Speicher.
Für jedes Kartenfeld (im Maximalfall bis zu 3481 Felder) merkt sich der Hamster, ob er es schon fertig abgeerntet hat, in welche der sechs Richtungen er schon gegangen ist, aus welcher Richtung er das Feld betreten hat, und welches der kürzeste Weg nach Hause ist.
Alle Kartenfelder sind der Reihe nach durchnumeriert. Das erste Feld der ersten Reihe hat Nummer 1, das zweite Feld Nummer 2 usf. bis zum letzten Feld der letzten Reihe mit Nummer 3481. Die quadratische Lösung hat der weiteren Vorteil, dass man sehr schnell umliegende Feldnummern berechnen kann.
(Falls das mit der Numerierung nicht klar geworden ist, kann vielleicht ein Blick in die beiliegenden Excel Dateien Klarheit bringen.)
Immer dann, wenn vor dem Hamster noch unerkundete Felder liegen, und das Maul voll mit Körnern ist, merkt er sich sein aktuelles Feld, geht auf dem Weg, den er hergekommen ist, zurück zum Heimatfeld, legt alle Körner ab und macht dann an der gemerkten Position weiter.
Mit dieser rekursiven Methode arbeitet der Hamster nun jedes Labyrint vollständig ab. Es zeigt sich allerdings, das er nicht immer den optimalen Weg nimmt, und es teilweise zu langen Rückwegen kommt.
Die Funkion comeHere (int Target) macht einfach gesagt nichts anderes, als den Hamster
von seiner aktuellen Position (immer gespeichert in Main.pos) auf die im Parameter Target
angegebene Position zu bewegen. Liegen beide Felder auf einer Geraden, so werden alle Felder zwischen
Start und Ziel zu einer LinkedList hinzugefügt. Ist das nicht der Fall, so wird ein
willkürlicher Weg mit einem Knick bestimmt und in die LinkedList geschrieben. Wird in der
anschließden Prüfung festgestellt, das dieser Weg nicht möglich ist (weil z. B. Wände
im Weg sind), fällt die Funktion in den "Classic"-Modus zurück, es wird einfach der Hinweg in
umgekehrter Reihenfolge in die LinkedList geschrieben.
Es wird noch eine zweite Route bestimmt: Da für jedes Feld der kürzeste Weg nach Hause
gesichert ist, vergleicht der Hamster, ob sich die zwei Heimwege schneiden, und danach, ob
ein im Schnittpunkt zusammengesetzter Weg kürzer ist als die erste Route aus dem "Classic"-Mode.
Der so gefundene Weg wird dann abgearbeitet und das Erkunden/Absammeln der Felder wird fortgesetzt.
Mit der Konstanten final int DEBUG_LEVEL kann das eingebaute Debugging aktiviert werden. Dies muß im Quelltext geschehen und dieser muß danach neu kompiliert werden. Je größer der Wert von DEBUG_LEVEL, desto mehr Informationen über Programmvorgänge werden auf der Ausgabe/Konsole ausgegeben. Die folgende Tabelle listet mögliche Werte für DEBUG_LEVEL auf.
| 0: | Kein Debugging |
| 2: | inkl. Entscheidungen für Rückwege |
| 3: | inkl. detailierter Entscheidungen für Rückwege |
| 4: | inkl. HomeWeg Setzen |
| 5: | inkl. Feld-Entscheidungen |
| 8: | inkl. Dead-End Erkennung |
Bei Hohen Werten sind die darunter liegenden Ebenen mit eingeschlossen.
Der aktuelle Wert des Debug-Levels wird auch beim Laden des Hamsters als Teil der Versions-Information mit ausgegeben.
Autor des Hamster PmkHampsterMapped2 ist Peter M. Kruse.