Backtracking-Algorithmus

Was ist ein Backtracking-Algorithmus?

Backtracking ist ein Algorithmus, der nach möglichen Kombinationen sucht, um Rechenprobleme. Es erstellt schrittweise Kandidaten und entfernt diejenigen, die die gegebenen Einschränkungen nicht erfüllen. Diese Technik ist sehr nützlich in Situationen, in denen Sie aus mehreren möglichen Ergebnissen eine praktikable Lösung auswählen müssen.

Dieser Algorithmus gilt als besser und effizienter als der Brute-Force-Ansatz. Im Gegensatz zu Bruteforce, das alle möglichen Lösungen ausprobiert, konzentriert sich Backtracking darauf, nur eine endgültige Lösung gemäß den gegebenen Einschränkungen. Es spart auch Zeit und Speicher, indem es den letzten Schritt rückgängig macht (Backtrack) und eine andere Option probiert, wenn man in eine Sackgasse gelangt. Außerdem stoppt es, sobald eine gültige Lösung gefunden wurde.

Backtracking ist eine weit verbreitete Technik, da sie komplexe Probleme ohne übermäßigen Ressourcenverbrauch lösen kann. Sie ist besonders nützlich für Probleme, bei denen zahlreiche Einschränkungen erfüllt werden müssen, wie Sudoku, das Königinnenproblem und die Zeitplanung. Durch intelligentes Navigieren durch mögliche Lösungen kann Backtracking eine Antwort finden, die alle Bedingungen erfüllt. Dies macht es für Aufgaben, die sowohl Präzision als auch Effizienz erfordern, von unschätzbarem Wert.

Wie funktioniert der Backtracking-Algorithmus?

Backtracking-Algorithmen sind eine Problemlösungstechnik, bei der Schritt für Schritt gültige Lösungen gefunden werden. Wenn die Einschränkungen eines Schritts bestimmte Bedingungen nicht erfüllen, kehrt der Algorithmus zum vorherigen Schritt zurück.

Backtracking-Algorithmus

Anschließend wird mit anderen möglichen Kombinationen fortgefahren, die die gegebenen Einschränkungen erfüllen. Da zahlreiche mögliche Kombinationen existieren, wählt es eine der zufriedenstellendsten Optionen aus und löst das Problem sequenziell. Diese algorithmische Technik ist nützlich, wenn Sie eine oder mehrere mögliche Optionen lösen müssen. Rückzug bedeutet, dass Sie Ihre Wahl annullieren, wenn eine Situation auftritt, die keine gültige Lösung ergibt.

Der Backtracking-Algorithmus umfasst im Allgemeinen die folgenden Schritte zur Lösung eines Problems:

Schritt 1) ​​Initialisierung: Beginnen Sie mit einer anfänglichen leeren/teilweisen Lösung.

Schritt 2) Auswahl: Wählen Sie basierend auf bestimmten Kriterien und Einschränkungen eine Option zur Erweiterung der aktuellen Lösung aus.

Schritt 3) Erkundung: Rekursives Lösen, indem der ausgewählte Kandidat berücksichtigt wird und im Problemlösungsprozess fortgefahren wird.

Schritt 4) Überprüfung der Einschränkungen: Überprüfen Sie, ob die aktuelle Teillösung bei jedem Schritt gegen irgendwelche Einschränkungen verstößt. Wenn dies der Fall ist, gehen Sie zum vorherigen Schritt zurück und versuchen Sie es mit einem anderen Kandidaten.

Schritt 5) Kündigung: Der Backtracking-Prozess stoppt, wenn entweder eine gültige Lösung gefunden wurde oder alle Kombinationen ausgeschöpft wurden.

Schritt 6) Zurückverfolgen: Wenn die aktuelle Option das gegebene Problem nicht löst, wird zum vorherigen Zustand zurückgekehrt. Anschließend wird die neue Option zur Lösung des gegebenen Problems in Betracht gezogen.

Schritt 7) Wiederholen: Fahren Sie mit diesen Schritten fort, bis das Problem behoben ist oder alle Optionen ausgeschöpft sind.

Rekursive Natur des Backtracking-Algorithmus

Backtracking-Algorithmen sind rekursiver Natur. Das heißt, der Algorithmus ruft sich selbst mit verschiedenen Parametern auf, bis er eine Lösung findet oder alle Möglichkeiten getestet hat:

def find_solutions(n, other_params):
    if found_a_solution():
        increment_solutions_found()
        display_solution()
        if solutions_found >= solution_target:
            exit_program()
        return	

    for val in range(first, last+1):
        if is_valid(val, n):
            apply_value(val, n)
            find_solutions(n + 1, other_params)
            remove_value(val, n)

Allgemeine Begriffe im Zusammenhang mit Backtracking-Problemen

Dies sind einige grundlegende Begriffe im Zusammenhang mit der Backtracking-Technik:

  • Lösungsvektor: Stellt Lösungen als n-Tupel dar, wie (X1, X2, …, Xn).
  • Einschränkungen: Regeln zur Begrenzung von X-Werten, implizit und explizit.
  • Lösungsraum: Alle gültigen X-Werte, die explizite Einschränkungen erfüllen.
  • Zustandsraumbaum: Stellt den Lösungsraum als Baum dar.
  • Zustandsraum: Beschreibt Pfade in einem Zustandsraumbaum.
  • Problemstatus: Knoten im Suchbaum, die Teillösungen darstellen.
  • Lösungszustände: Zustände, die gültige Lösungstupel in S bilden.
  • Antwortzustände: Erfüllen Sie implizite Einschränkungen und erzielen Sie die gewünschten Lösungen.
  • Vielversprechender Knoten: Führt zu gewünschten Lösungen und bleibt umsetzbar.
  • Nicht vielversprechender Knoten: Führt zu nicht realisierbaren Zuständen, die nicht weiter untersucht werden.
  • Live-Knoten: Generiert mit unerforschten Kindern.
  • E-Knoten: Live-Knoten mit laufender Kindgenerierung.
  • Toter Knoten: Keine weitere Erweiterung aller generierten Kinder.
  • Tiefensuche-Knotengenerierung: Verwendet den neuesten Live-Knoten als nächsten E-Knoten.
  • Begrenzungsfunktion: Maximiert oder minimiert B(x1, x2, …, Xa) zur Optimierung.
  • Statische Bäume: Baumformulierung unabhängig von der Probleminstanz.
  • Dynamische Bäume: Die Baumformulierung variiert je nach Probleminstanz.

Wann sollte ein Backtracking-Algorithmus verwendet werden?

Wir können die Backtracking-Technik zur Lösung eines komplexen Problems wählen, wenn:

  • Es gibt viele Möglichkeiten: Backtracking ist sinnvoll, wenn bei jedem Schritt des Problemlösungsprozesses mehrere Optionen vorhanden sind. Diese Optionen können sich auf die Auswahl von Elementen und Spielzügen beziehen.
  • Keine eindeutig beste Wahl: Wenn nicht genügend Informationen vorhanden sind, um die beste Wahl unter den verfügbaren Optionen zu bestimmen, kann ein Backtracking-Algorithmus verwendet werden.
  • Die Entscheidung führt zu weiteren Auswahlmöglichkeiten: Sie können wählen Backtracking-Technik zur systematischen Überprüfung von Entscheidungen.
  • Müssen alle möglichen Lösungen erkunden: Beim Backtracking werden alle Lösungen systematisch untersucht, indem eine Reihe aufeinander aufbauender Entscheidungen getroffen werden.

Arten von Backtracking-Problemen

Bei Backtracking-Algorithmen gibt es drei Arten von Problemen: Entscheidungsprobleme, Optimierungsprobleme und Aufzählungsprobleme. Im Folgenden erfahren Sie mehr darüber.

  1. Entscheidungsproblem: Bei dieser Art von Problem besteht das Ziel darin, festzustellen, ob eine mögliche Lösung existiert. Wir überprüfen „Ja“- und „Nein“-Antworten. Beispielsweise das n-Damen-Problem. Es ist ein Entscheidungsproblem, bei dem die Wahrscheinlichkeit untersucht wird, n Damen auf einem n × n-Schachbrett zu platzieren, ohne sich gegenseitig anzugreifen.
  2. Optimierungsproblem: Bei Optimierungsproblemen besteht das Ziel darin, aus vielen Optionen die bestmögliche Lösung zu finden. Dies kann die Bestimmung der Maximal- und Minimalwerte einer bestimmten Funktion oder Variable beinhalten. Betrachten wir beispielsweise das Rucksackproblem, bei dem das Ziel darin besteht, den Gesamtwert der Gegenstände in der Tasche zu maximieren und gleichzeitig das Gewichtslimit einzuhalten.
  3. Aufzählungsproblem: Ziel ist es, alle möglichen Lösungen für ein gegebenes Problem zu finden. Wir listen alle gültigen Optionen ohne Auslassungen auf. Ein Beispiel wäre das Generieren aller möglichen Buchstabenkombinationen aus einem gegebenen Zeichensatz.

Anwendungen von Backtracking und Beispiele

Es gibt verschiedene Anwendungen von Backtracking. Einige davon werden unten mit ihrem Pseudocode erklärt.

  1. Sudoku Solver: Dieses Problem enthält ein 3×3-Untergitter mit doppelten Zahlen. Die Backtracking-Technik zeigt, dass die Lösung „false“ zurückgibt, was bedeutet, dass die Zahlen anders platziert werden müssen.
  2. function solveSudoku(board):
        if no empty cells:
            return true  # Sudoku is solved
        for each empty cell (row, col):
            for num from 1 to 9:
                if num is valid in (row, col):
                    place num in (row, col)
                    if solveSudoku(board):
                        return true
                    remove num from (row, col)
        return false  # No valid solution
    
  3. N-Damen-Problem: Der Backtracking-Ansatz bestimmt, wie die Damen auf einem N × N Schachbrett präsentiert werden, sodass keine von ihnen die anderen bedroht.
  4. function solveNQueens(board, col):
        if col >= N:
            return true  # All queens are placed
        for each row in the column col:
            if isSafe(board, row, col):
                place queen at (row, col)
                if solveNQueens(board, col + 1):
                    return true
                remove queen from (row, col)
        return false  # No valid solution in this branch
    
  5. Teilsummenproblem: Wird verwendet, um die Teilmenge von Zahlen aus einer gegebenen Menge zu finden, deren Summe eine bestimmte Zielsumme ergibt.
  6. function subsetSum(nums, target, index, currentSubset):
        if target == 0:
            print(currentSubset)  # Subset with the target sum found
            return
        if index >= len(nums) or target < 0:
            return
       currentSubset.add(nums[index])
       subsetSum(nums, target - nums[index], index + 1, currentSubset)
       currentSubset.remove(nums[index])
       subsetSum(nums, target, index + 1, currentSubset)
    
  7. Hamilton-Zyklus-Problem: Backtracking kann angewendet werden, um eine geschlossene Tour in einem Graphen zu finden, die jeden Knoten genau einmal besucht.
  8. Ratte im Labyrinth-Problem: Die Backtracking-Technik wird verwendet, um den Weg einer Ratte vom Ausgangspunkt des Labyrinths bis zum Ausgang zu finden.

Vor- und Nachteile des Backtracking-Algorithmus

Vorteile des Backtracking-Algorithmus

Backtracking-Techniken werden zur Lösung komplexer Probleme eingesetzt. Sie bieten viele Vorteile, wie:

  • Die Backtracking-Technik eignet sich gut zum Umgang mit Einschränkungen.
  • Diese Methode eignet sich gut zum Lösen von Optimierungsproblemen.
  • Die Technik funktioniert bei verschiedenen Arten von Problemen.
  • Dieses Verfahren kann dabei helfen, alle möglichen Lösungen zu prüfen.
  • Da es zurückverfolgt wird, spart es mehr Speicher als die Bruteforce-Technik.

Nachteile des Backtracking-Algorithmus

Backtracking-Techniken unterliegen auch einigen Einschränkungen, wie z. B. der zeitlichen Komplexität. Diese Technik hat die folgenden Nachteile:

  • Es gibt keine garantierte Lösung.
  • Es ist aufgrund der vielen Kombinationen langsamer.
  • Aufgrund der vielen Möglichkeiten weist es eine hohe zeitliche Komplexität auf.
  • Es ist für Echtzeitbeschränkungen ungeeignet, da das Finden der besten Lösung lange dauern kann.
  • Die Effizienz hängt vom Komplexitätsgrad des Problems ab.

Unterschied zwischen Backtracking und Rekursion

Rekursion Backtracking
Ruft sich selbst auf, bis der Basisfall erreicht ist. Verwendet Rekursion, um alle Möglichkeiten zu prüfen, bis das beste realisierbare Ergebnis gefunden ist.
Bottom-up-Ansatz. Top-Down-Ansatz.
Es wird kein Wert verworfen. Nicht umsetzbare Lösungen werden abgelehnt.

Fazit

Backtracking ist eine nützliche algorithmische Strategie zur Lösung komplexer Probleme, indem man systematisch mögliche Lösungen untersucht und bei Bedarf zurückverfolgt. Wir können davon ausgehen, dass sich Backtracking-Techniken mit der Verbesserung der Rechenleistung und der algorithmischen Effizienz verbessern werden. Diese Fortschritte werden es ihnen ermöglichen, größere und komplexere Probleme effizient anzugehen.

Darüber hinaus können Modelle des maschinellen Lernens Backtracking-Entscheidungen auf der Grundlage zuvor erlernter Muster leiten.

All diese technologischen Innovationen werden Backtracking-Algorithmen revolutionieren und sie zu einem leistungsstarken und vielseitigen Werkzeug zur Lösung komplizierter Probleme in verschiedenen Bereichen machen.