Wenn Sie sich für eine einfache-ish Lösung suchen, könnte darauf hindeuten, ich ein bisschen Randomisierung?
Was ich meine, ist dies: in der Cokeandcode-Beispiel gibt es die Nested-for-Loops, die die "Nachfolgerstaaten" generieren (um den AI-Begriff zu verwenden). Ich beziehe mich auf den Punkt, an dem es sich über das 3x3-Quadrat um den "aktuellen" Zustand dreht, und fügt neue Positionen auf dem Stapel hinzu, die berücksichtigt werden sollen.
Eine relativ einfache Lösung wäre, dass Code ein Bit (sollte :)) werden isolieren und haben es, sagen wir, eine LinkedList von Knoten vor dem Rest der Verarbeitungsschritt erzeugt. Dann Containers.Shuffle (oder ist es Generics.Shuffle?), Verknüpfte Liste, und setze die Verarbeitung dort fort. Im Grunde genommen, haben Sie eine Routine sagen "createNaiveNeighbors (Knoten)" , die eine LinkedList = {(node.x-1, node.y), (node.x, node.y-1) ...} zurückgibt (bitte Verzeihen Sie das Pidgin-Java, ich versuche (und immer scheitere), kurz zu sein.
Sobald Sie die verknüpfte Liste jedoch erstellen, sollten Sie nur in der Lage sein, eine "für (Node n: myNewLinkedList)" anstelle von die
for (int x=-1;x<2;x++) {
for (int y=-1;y<2;y++) {
und noch genau die gleichen Körper-Code verwenden!
Was dies tun würde, im Idealfall ist, eine Art „shake up“ die Reihenfolge der Knoten betrachtet und Wege zu erzeugen, näher die Diagonale, aber ohne die Heuristik zu ändern. Die Pfade sind immer noch die effizientesten, aber normalerweise näher an der Diagonale.
Der Nachteil ist natürlich, wenn Sie mehrmals von A nach B gehen, kann ein anderer Weg genommen werden. Wenn das nicht akzeptabel ist, müssen Sie möglicherweise eine drastische Änderung in Betracht ziehen.
Hoffe, das hilft! -Agor
+1 für das Video –
Einverstanden, das Video ist eine ausgezeichnete Idee. –
Yeh, Screenjelly ist genial für solche Dinge! – Relequestual