Beitragvon hartmut » 11. Juni 2001, 09:42
Hallo Peer,
>>> wenn ich den Freund von Campus (der hat sich gemeldet und ich habe ihn an meinen Bekannten weitergeleitet) richtig verstanden hat, geht es in seiner Arbeit wohl allegemein über Problemlössungsalgorythmen ... <<<
Das kann ich dann schon eher nachvollziehen. Ein RR-Algorithmus alleine wäre keine Kunst.
>>> Ob "Brute Force" tatsächlich der beste (schnellste) Algorythmus ist, wage ich mal zu bezweifeln (Pro Zug gibt es ca. 4*4=16 Möglichkeiten, folglich 16^n Möglichkeiten bei n Zügen). Allerdings bin ich kein Informatiker und mag mich daher verschätzen. <<<
Im ersten Ansatz ist das richtig, aber ein guter Algorithmus berücksichtigt die spezifischen Modelleigenschaften und geht über dumpfes Ausprobieren hinaus. So sollte man im Baum die Abhängigkeit bzw. Unabhängigkeit von Teilzügen berücksichtigen. Ob man erst A nach rechts, dann B nach unten oder umgekehrt zieht, ist unter leicht zu bestimmenden Voraussetzungen (A versperrt B den Weg usw.) voneinander abhängig oder nicht. Bei unabhängigen Teilzügen genügt somit das Verfolgen genau einer Kombination daraus. Die unterdrückten Kombinationen unabhängiger Teilzüge interessieren dann nicht mehr, da sie zum selben Ergebnis führen.
Hier noch etwas Stoff für unseren Diplomanden (obwohl ich glaube, soweit ist er auch ohne mich gekommen). Eine mögliche Implementierung dieser Idee: Jeder Roboter hat in jeder der vier Richtungen einen Status, ob er in diese Richtung noch ziehen soll oder nicht. Zu Beginn steht alles auf JA, außer bei den Richtungen, bei denen der Roboter schon direkt an der Wand oder neben einem anderen Roboter steht. Wenn ein Roboter zieht, setzt man den Status der Richtung, aus der er kommt, auf NEIN (vermeidet hin-und-herziehen) und auch den der Richtung, in die er gegangen ist (er steht ja nun vor der Wand oder einem anderen Roboter). Die seitlichen Richtungen gehen auf JA, sofern sie nicht ebenfalls durch Wand oder anderen Roboter direkt blockiert sind.
Der Richtungs-Status anderer (!) Roboter wird ggf. auf JA aktualisiert, wenn er auf NEIN stand und der andere Roboter (nennen wir einen beliebigen anderen Roboter B - der gezogene Roboter ist A) folgende Bedingungen erfüllt: 1. B kann das Startfeld oder Zielfeld von A erreichen bzw. überqueren (A versperrt B auf dem Zielfeld den Weg, bzw. gibt diesen auf dem Startfeld frei). Ein Zug von B sieht ja jetzt anders aus als vorher (mehr oder weniger weit). 2. Für alle überquerten Felder auf dem Weg von A wird geprüft, ob B (d.h. irgendein anderer Roboter) dieses Feld erreichen und genau darauf stehenbleiben kann (seitliche Wand bzw. anderer Roboter begrenzt den Zug). Diese Richtung von B erhält dann den Wert JA, denn wenn B direkt auf ein von A überquertes Feld zieht, wird ein Rückzug von A wieder mit JA aktiviert (siehe 1. Bedingung), da A ja dann nicht den ganzen Zug zurücknimmt, sondern nur einen Teil. Dadurch ergibt sich ein neuer Verlauf der Roboterwege.
Der Rest ist dann das, was Du Brute-Force nennst. Probier auf jeder Zug-Ebene nacheinander alle Richtungen aller Roboters aus, aber ziehe nur, wenn der Status der Kombination Roboter-Richtung auf JA steht. Die Kombinationsvielfalt mag ich nicht bestimmen, es dürfte aber ein verschwindend geringer Bruchteil Deiner Rechnung sein. Vielleicht gibt es ja noch sinnvollere Ansätze als meinen.
So man im Backtracking-Verfahren einen Zug zurücknimmt, muss man natürlich den Zustand aller Status-Variablen auf den Wert zurücksetzen, der vorher galt (für ALLE Roboter!). Die gerade erprobte Richtung des gezogenen Roboters wird natürlich auf NEIN gesetzt (mit dem ist man ja jetzt durch).
Der Algorithmus braucht sinnvollerweise eine Zugbegrenzung, da ich ad hoc irgendwelche endlosen "Kreisbewegungen" mehrerer Roboter nicht ausschließen möchte. Nach gefundener Lösung (steht Roboter X auf Zielfeld Y?) kann man die Suchtiefe auf die gerade gefundene Anzahl Züge begrenzen, was den Algorithmus ggf. beschleunigt (jenachdem, wie schnell ein Optimum erreicht werden kann, was davon abhängt, ob man zufällig mit dem "richtigen" Zug beginnt oder nicht). Ohne Lösung muss man das vorgegebene Limit erhöhen.
Allen Hobby-Programmierern viel Spaß am Tüfteln
Hartmut