PmkHampsterMapped2

Version 0.72 vom 29.04.2002

Worum geht es hier?

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.

top

Warum dieser Name?

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.

top

Strategie (erster Ansatz)

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:

  1. Betreten eines Feldes (beim Start: Position = Heimatfeld).
  2. So viele Körner aufsammeln, wie ins Maul passen.
  3. Falls immernoch Körner auf dem Feld liegen:
  4. Ausrichtung nach Norden.
  5. Schon alle Sechs Richtungen geprüft? Dann gehe aufs Herkunfsfeld zurück.
  6. Prüfen, ob er vorwärts gehen kann.
  7. Rotation nach Links. Weiter bei 5.

top

Umsetzung in JAVA

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.

top

Erste Versuche und Verbesserungen

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.

  1. Schnellerer Weg nach Hause beim Körenerablegen: Der Hamster merkt sich für jedes Feld, das er betritt die Richtung aus der er es betreten hat, und wieviele Schritte es von dort nach Hause sind. Trifft er nun bei seinen Erkundungen auf ein Feld, auf dem er bereits war, und von dort geht es schneller nach Hause, als auf dem Weg, auf dem er das Feld betrat, nimmt der Hamster nun bei Bedarf diesen kürzeren Weg nach Hause. Insbesondere bei Freiflächen traten erhebliche Punktsteigerungen durch diese Verbesserung auf.
  2. Sackgassen-Erkennung: Liegt vor dem Hamster ein noch nicht erkundetes Feld, auf dem keine Körner liegen, und von dem der Hamster schon weiß, das es runherum von Mauern umgeben ist, oder nur erkundete Felder angrenzen, so betritt der Hamster das Feld nicht. Brachte nur geringe Punktsteigerung.
  3. Verbesserte Rückwegsgestaltung: Brachte eine erhebliche Punktsteigerung. Bisher war es so, das der Hamster genau auf seinem Hinweg auch zurückläuft, und das auch dann, wenn schon alle Felder erkundet waren und er eigentlich nur noch nach Hause laufen müsste. Jetzt ist es so, das der Hamster zu dem Feld geht, auf dem noch etwas zu tun ist. Gibt es davon keine mehr, geht der Hamster nach Hause.
  4. Aufgeben bei Lauf gegen die Wand: Falls es unter ganz widrigen Umständen dazu kommt, daß der Hamster gegen die Wand navigiert wird, beended sich der Hamster an der Stelle und kassiert dafür einmalig 1000 Minus-Punkte fürs Beenden außerhalb des Heimatfeldes. Das ist aber immernoch besser, als orientierungslos durch die Pr&rie zu irren, und immer noch weiter Minus-Punkte für Kollisionen mit Wänden zu kassieren, bis dem ein Ende durch die 10.000 Minus-Punkte Grenze gesetzt wird. Dies hat sich insbesondere bei unvorhergesehen Wendungen als sehr sinnvoll erwiesen: Lieber -1.000 Punkte als -10.000 Punkte.

top

Strategie komplett

  1. Betreten eines Feldes (beim Start: Position = Heimatfeld).
  2. So viele Körner aufsammeln, wie ins Maul passen.
  3. Falls immernoch Körner auf dem Feld liegen:
  4. Ausrichtung nach Norden.
  5. Schon alle Sechs Richtungen geprüft? Beende Ab-Arbeitung dieses Feldes
  6. Prüfen, ob er vorwärts gehen kann.
  7. Rotation nach Links. Weiter bei 5.
Wenn fertig: Stelle sicher, das der Hamster sich auf dem HeimatFeld befindet und beende ordnungsgemäß.

top

Wie funktioniert die "Verbesserte Rückweggestaltung"?

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.

top

Gewinnchancen

top

Wie funktioniert das eingebaute Debugging?

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.

top

Über den Autor

Autor des Hamster PmkHampsterMapped2 ist Peter M. Kruse.

top





(c) 2002 Peter M. Kruse. All rights reserved.