0

Also versuche ich einen möglichen Pfad innerhalb 2D-Array zu finden und ich habe einen Quellpunkt (x, y) und einen Zielpunkt (destX, destY).Backtracking-Rekursion, um einen Pfad von Quelle zu Ziel im 2D-Array zu finden

Ich versuche, es in einer Backtracking-Rekursion Weise zu tun, da ich mich nicht um den Kürzesten Weg kümmern, alles was ich interessiere ist einen Weg zu finden.

Das Problem ist, dass es irgendwie innerhalb des Algorithmus geht es in eine Ecke und bleibt dort stecken ... Also ich denke, ich schrieb etwas falsch logisch.

Die Rekursion Funktion:

$scope.findPath = function(x, y, destX, destY) { 
     console.log("x: " + x + ", y: " + y); 
     if(x >= $scope.buttons.length || x < 0 || y >= $scope.buttons[0].length || y < 0) { 
      return false; 
     } 

     if(x == destX && y == destY) { 
      return true; 
     } 

     if(!$scope.checkIfButtonEmpty(x, y)) { 
      console.log("location not empty") 
      return false; 
     } 

     $scope.solution[x][y].marked = true; 

     if($scope.findPath(x + 1, y, destX, destY) === true) { 
      return true; 
     } 
     if($scope.findPath(x, y + 1, destX, destY) === true) { 
      return true; 
     } 
     if($scope.findPath(x - 1, y, destX, destY) === true) { 
      return true; 
     } 
     if($scope.findPath(x, y - 1 , destX, destY) === true) { 
      return true; 
     } 

     $scope.solution[x][y].marked = false; 

     return false; 
    }; 

Die Funktion, die die Rekursion ruft und nach einem Weg zu finden und es in einen boolean 2D-Array schreiben sollte den Pfad grafisch drucken:

$scope.startDrawingConnection = function() { 
     if($scope.startLocation.length == 2 && $scope.endLocation.length == 2){ 
      $scope.findPath($scope.startLocation[0], $scope.startLocation[1], $scope.endLocation[0], $scope.endLocation[1]); 
      console.log("Finished finding path"); 
      $scope.drawPath(); 
      console.log("Finished drawing path"); 
     } 
    }; 

Bitte helfen Sie mir herauszufinden, was ich falsch im Algorithmus gemacht habe. Vielen Dank im Voraus.

+0

eine Chance, dass '$ scope.startLocation [0 ] 'und' $ scope.startLocation [1] 'sind Zeichenketten anstelle von Zahlen? –

+1

@RickHitchcock Nein. Ich bin mir sicher, dass das Problem im Allgemeinen nicht von Syntax-/Tippproblemen herrührt, und abgesehen davon, dass $ scope.startLocation ein Array ist, das ich in Code definiere, den ich hier nicht gezeigt habe. Die Sache ist, dass der Code ausgeführt wird, und die Rekursion läuft für ein paar Aufrufe, bis es in eine Ecke gerät und darin gefangen wird, also muss es ein logischer Fehler sein, den ich beim Schreiben der Rekursionsfunktion gemacht habe. – user3672173

Antwort

1

Das Problem ist, dass Sie in Kreisen laufen werden, Knoten besuchen, die Sie bereits vorher (ohne Erfolg) ausprobiert haben, und sie erneut versuchen.

Die Suche sollte das gleiche Quadrat nie zweimal besuchen müssen. Behalte also den Überblick, wo du vorher warst, und zwar so, dass du diese Spur beim Backtracking nicht auslöschen und nie wieder eine Suche von diesem Quadrat aus starten wirst.

Dies kann man erreichen, indem eine zusätzliche Eigenschaft in Ihrer Lösung Knoten hinzufügen, und fügen Sie diese beiden Zeilen Code, kurz bevor Sie einen Knoten mit marked = true markieren:

if ($scope.solution[x][y].visited) return false; 
    $scope.solution[x][y].visited = true; 
+0

Vielen Dank für die einfache Lösung! Ich habe es vorher versucht, aber ich denke, die Reihenfolge und der Ort, an dem ich diese Zeilen geschrieben habe, haben es nicht funktionieren lassen. Nun, wenn ich den kürzesten Pfad finden möchte, gibt es eine Möglichkeit, den Code, den ich bereits geschrieben habe, zu refactorieren oder muss ich eine komplett neue Lösung schreiben, die einen Algorithmus wie Bellman ford, Dijkstra usw. verwendet? – user3672173

+0

DFS ist nicht am effizientesten, wenn Sie den kürzesten Pfad finden möchten. In einem Extremfall, in dem das Ziel nur einen Schritt entfernt ist, könnte eine DFS-Suche das gesamte Gitter aufsuchen, bevor es realisiert, dass es gerade dort ist. Also, ja, Sie würden nach BFS-basierten Algorithmen suchen. Sie könnten zum Beispiel [meine Antwort hier] ansehen (https://stackoverflow.com/a/46395006/5459839) – trincot

Verwandte Themen