GeeksforGeeks

Voraussetzungen :

  • Rekursion
  • Komplexitätsanalyse

Backtracking ist eine algorithmische Technik zur rekursiven Lösung von Problemen, indem versucht wird, eine Lösung schrittweise Stück für Stück zu erstellen, wobei die Lösungen entfernt werden, die die Einschränkungen des Problems zu keinem Zeitpunkt erfüllen (mit Zeit wird hier die Zeit bezeichnet, die verstrichen ist, bis eine beliebige Ebene des Suchbaums erreicht wurde).

Gemäß der Wiki-Definition,

Backtracking kann als allgemeine algorithmische Technik definiert werden, bei der jede mögliche Kombination durchsucht wird, um ein Rechenproblem zu lösen.

Es gibt drei Arten von Problemen beim Backtracking –

  1. Entscheidungsproblem – Hier suchen wir nach einer praktikablen Lösung.
  2. Optimierungsproblem – Hier suchen wir nach der besten Lösung.
  3. Enumerationsproblem – Darin finden wir alle möglichen Lösungen.

Wie kann festgestellt werden, ob ein Problem mithilfe von Backtracking gelöst werden kann?

Im Allgemeinen kann jedes Constraint Satisfaction-Problem, das klare und genau definierte Einschränkungen für eine objektive Lösung aufweist, einen Kandidaten schrittweise zur Lösung aufbaut und einen Kandidaten aufgibt („Backtracks“), sobald festgestellt wird, dass der Kandidat möglicherweise nicht zu einer gültigen Lösung vervollständigt werden kann, durch Backtracking gelöst werden. Die meisten Probleme, die diskutiert werden, können jedoch mit anderen bekannten Algorithmen wie dynamischer Programmierung oder gierigen Algorithmen in logarithmischer, linearer, linear-logarithmischer Zeitkomplexität in der Reihenfolge der Eingabegröße gelöst werden und überstrahlen daher den Backtracking-Algorithmus in jeder Hinsicht (da Backtracking-Algorithmen im Allgemeinen sowohl zeitlich als auch räumlich exponentiell sind). Es gibt jedoch noch einige Probleme, die bisher nur durch Backtracking-Algorithmen gelöst werden können.

Stellen Sie sich eine Situation vor, in der Sie drei Kisten vor sich haben und nur eine davon eine Goldmünze enthält, aber Sie wissen nicht, welche. Also, um die Münze zu bekommen, müssen Sie alle Boxen eins nach dem anderen zu öffnen. Sie werden zuerst das erste Kästchen ankreuzen, wenn es die Münze nicht enthält, müssen Sie es schließen und das zweite Kästchen ankreuzen und so weiter, bis Sie die Münze finden. Das ist es, was Backtracking ist, das heißt, alle Teilprobleme nacheinander zu lösen, um die bestmögliche Lösung zu finden.

Betrachten Sie das folgende Beispiel, um den Backtracking-Ansatz formeller zu verstehen:

Bei einer Instanz eines Rechenproblems P und Daten D Entsprechend Der Instanz werden alle Einschränkungen, die erfüllt sein müssen, um das Problem zu lösen, durch C dargestellt. Ein Backtracking-Algorithmus funktioniert dann wie folgt:

Der Algorithmus beginnt mit dem Aufbau einer Lösung, beginnend mit einem leeren Lösungssatz S . S = {}

  1. Fügen Sie zu S den ersten noch verbleibenden Zug hinzu (Alle möglichen Züge werden nacheinander zu S hinzugefügt). Dies erzeugt nun einen neuen Unterbaum s im Suchbaum des Algorithmus.
  2. Überprüfen Sie, ob S+s jede der Einschränkungen in C erfüllt.
    • Wenn ja, dann ist der Unterbaum s „berechtigt“, weitere „Kinder“ hinzuzufügen.
    • Andernfalls ist der gesamte Unterbaum s unbrauchbar, kehrt also mit dem Argument S zu Schritt 1 zurück.
  3. Im Falle der „Berechtigung“ des neu gebildeten Unterbaums s kehrt er mit dem Argument S+s zu Schritt 1 zurück.
  4. Wenn die Prüfung auf S+s zurückgibt, dass es sich um eine Lösung für die gesamten Daten D handelt. Ausgabe und beenden Sie das Programm.
    Wenn nicht, geben Sie zurück, dass mit den aktuellen s keine Lösung möglich ist, und verwerfen Sie sie daher.

Unterschied zwischen Rekursion und Backtracking:

Bei der Rekursion ruft sich die Funktion selbst auf, bis sie einen Basisfall erreicht. Beim Backtracking verwenden wir die Rekursion, um alle Möglichkeiten zu erkunden, bis wir das beste Ergebnis für das Problem erhalten.

Pseudocode für Backtracking :

1. Rekursive Backtracking-Lösung.

void findSolutions(n, other params) : if (found a solution) : solutionsFound = solutionsFound + 1; displaySolution(); if (solutionsFound >= solutionTarget) : System.exit(0); return for (val = first to last) : if (isValid(val, n)) : applyValue(val, n); findSolutions(n+1, other params); removeValue(val, n);

2. Finden, ob eine Lösung existiert oder nicht

boolean findSolutions(n, other params) : if (found a solution) : displaySolution(); return true; for (val = first to last) : if (isValid(val, n)) : applyValue(val, n); if (findSolutions(n+1, other params)) return true; removeValue(val, n); return false;

Lassen Sie uns versuchen, ein Standard-Backtracking-Problem, das N-Queen-Problem, zu lösen.
Die N-Dame ist das Problem, N Schachköniginnen auf ein N×N-Schachbrett zu legen, so dass sich keine zwei Königinnen gegenseitig angreifen. Im Folgenden finden Sie beispielsweise eine Lösung für das 4-Königin-Problem.

Die erwartete Ausgabe ist eine binäre Matrix mit 1s für die Blöcke, in denen Königinnen platziert werden. Im Folgenden finden Sie beispielsweise die Ausgabematrix für die obige 4d-Lösung.

{ 0, 1, 0, 0}{ 0, 0, 0, 1}{ 1, 0, 0, 0}{ 0, 0, 1, 0}

Backtracking-Algorithmus: Die Idee ist, Königinnen nacheinander in verschiedenen Spalten zu platzieren, beginnend mit der Spalte ganz links. Wenn wir eine Königin in eine Spalte setzen, prüfen wir, ob es zu Zusammenstößen mit bereits platzierten Königinnen kommt. Wenn wir in der aktuellen Spalte eine Zeile finden, für die es keinen Konflikt gibt, markieren wir diese Zeile und Spalte als Teil der Lösung. Wenn wir eine solche Zeile aufgrund von Konflikten nicht finden, gehen wir zurück und geben false zurück.

1) Start in the leftmost column2) If all queens are placed return true3) Try all rows in the current column. Do following for every tried row. a) If the queen can be placed safely in this row then mark this as part of the solution and recursively check if placing queen here leads to a solution. b) If placing the queen in leads to a solution then return true. c) If placing queen doesn't lead to a solution then unmark this (Backtrack) and go to step (a) to try other rows.3) If all rows have been tried and nothing worked, return false to trigger backtracking.

Sie können sich auf den Artikel über Backtracking | Set 3 (Verschachteltes Problem) beziehen, um den obigen Ansatz vollständig zu implementieren.
Weitere Backtracking-Probleme:

  • Backtracking/Set 1 (Die Ritter tour problem)
  • Backtracking/Set 2 (Ratte in einem Labyrinth)
  • Backtracking/Set 4 (Teilmenge Summe)
  • Backtracking|Set 5 (m Färbung Problem)
  • –> Klicken sie Hier für Mehr
Artikel Tags:
Praxis Tags:

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.