Alle Tabs der Lerneinheit (Erklärung · Interaktiv verstehen · Praxis-Übung · Klausur-Quiz) als durchgehender Text. Ideal zum Wiederholen vor der Klausur, und für Suchmaschinen wie Google, Bing und KI-Suche (ChatGPT, Perplexity).
Erklärung
Du bist in einem Labyrinth und triffst eine Sackgasse. Was machst du? Du gehst zurück und probierst eine andere Abzweigung. Genau das ist Backtracking: systematisches Durchprobieren mit Rückzug bei Sackgassen. Klausur-Klassiker für NP-schwere Probleme wie 8-Damen, Sudoku, TSP. 8/17 WInf-Algo-Klausuren.
Die Idee in einem Satz
Backtracking: Erweitere eine Teil-Lösung schrittweise. Wenn der aktuelle Pfad zu keiner gültigen Lösung führen kann (Sackgasse), gehe einen Schritt zurück und probiere eine Alternative.
Backtracking als Such-Baum
Stelle dir alle möglichen Lösungs-Kandidaten als Baum vor:
- Wurzel: leere Teil-Lösung
- Kanten: "fügt nächstes Element hinzu"
- Blätter: komplette Lösungen (gültig oder nicht)
Backtracking führt eine Tiefensuche (DFS) über diesen Baum durch, mit Pruning: schneide unmögliche Pfade früh ab.
Klassisches Beispiel: 8-Damen-Problem
Problem: Platziere 8 Damen auf einem 8×8-Schachbrett, sodass keine eine andere bedroht (keine in gleicher Zeile, Spalte oder Diagonale).
Backtracking-Lösung:
solve(board, col):
if col == 8: return True # alle Damen platziert
for row in 0..7:
if isSafe(board, row, col):
board[row][col] = "Q" # versuche Position
if solve(board, col + 1):
return True
board[row][col] = "." # backtrack: entferne Versuch
return False
Pro Spalte: versuche alle 8 Zeilen. Wenn keine funktioniert → rückwärts. Mit Pruning sind nur wenige Tausend statt 8⁸ = 16 Millionen Versuche nötig.
Pseudocode-Schema
backtrack(partial_solution):
if is_complete(partial_solution):
record_solution(partial_solution)
return
for candidate in next_candidates(partial_solution):
if is_promising(candidate, partial_solution):
extend(partial_solution, candidate)
backtrack(partial_solution)
undo(partial_solution, candidate) # backtrack!
Pruning: das Geheimnis
Ohne Pruning ist Backtracking = brute-force-Tiefensuche (O(b^d)).
Mit Pruning sind nur wenige Pfade tatsächlich besucht. Pruning-Strategien:
- Constraint Propagation: Schließe Zellen aus, die andere Damen-Positionen blockieren
- Branch-and-Bound: Bei Optimierungs-Problemen: schneide Pfade ab, deren bestmögliche Lösung schlechter als bestes gefundenes Optimum ist
- Ordering Heuristics: Probiere "vielversprechendere" Kandidaten zuerst
Weitere klassische Probleme
Sudoku
Backtracking pro leere Zelle: probiere 1-9, prüfe Sudoku-Regeln, weiter zur nächsten Zelle.
Knapsack (0/1)
Für jedes Item: nimm oder nimm nicht. Backtracking über alle 2ⁿ Kombinationen, mit Pruning bei Kapazitäts-Überschreitung viel weniger.
Traveling Salesman (TSP)
Permutationen aller Städte. Pruning: wenn aktuelle Teil-Tour bereits länger als beste komplette Tour → abbrechen.
Graph-Färbung
Färbe Knoten mit minimaler Farben-Anzahl, so dass keine 2 adjazenten gleich sind.
N-Queens
Verallgemeinerung von 8-Damen für beliebiges n.
Subset Sum
Wähle Teilmenge der Eingabe-Zahlen, die exakt zu einer Ziel-Summe addieren.
Backtracking vs. DP vs. Greedy
| Paradigma | Eigenschaften |
|---|---|
| Greedy | Lokal beste Wahl, nie zurück, schnell, nicht immer optimal |
| DP | Speichert überlappende Teil-Lösungen, optimal, polynomial |
| Backtracking | Systematisches Durchprobieren mit Rückzug, optimal, oft exponentiell |
| D&C | Teile + löse Teile + kombiniere, polynomial bei unabhängigen Teilen |
Wann Backtracking? Wenn es viele Lösungs-Kandidaten gibt und keine bessere Strategie (DP, Greedy) funktioniert, typisch bei NP-schweren Problemen.
Komplexität
Worst Case: O(b^d) mit b = Branching-Faktor, d = Tiefe.
Average Case: durch Pruning deutlich besser. Schwer allgemein zu beschreiben, hängt vom Problem ab.
Beispiel 8-Damen: 8⁸ = 16M ohne Pruning, ~15k mit guten Constraints.
Branch-and-Bound (Spezialform)
Für Optimierungs-Probleme: erweitere Backtracking um eine Schranke für den noch erreichbaren best/schlechtesten Wert.
branch_and_bound:
best_so_far = infinity
for each candidate:
if upper_bound(candidate) < best_so_far:
skip # diese Teil-Lösung kann nicht besser sein
else:
extend and recurse
Anwendung: optimale TSP-Lösung, optimaler Knapsack mit garantierter Optimalität.
Klausur-Faustregeln
1. Backtracking = systematische Tiefensuche mit Rückzug.
2. Pruning ist essentiell. Ohne Pruning oft exponentiell und unbenutzbar.
3. Pseudocode-Schema: if complete → record; for each candidate → extend + recurse + undo.
4. Klassiker: 8-Damen, Sudoku, N-Queens, Knapsack, TSP, Graph-Färbung.
5. Branch-and-Bound: Backtracking + Schranke für Optimierungs-Probleme.
Häufige Stolpersteine
1. undo vergessen. Beim Rückzug MUSS die Teil-Lösung wieder in den vorherigen Zustand gebracht werden. Sonst falsche Ergebnisse.
2. Constraint-Check zu spät. Wenn du erst am Ende prüfst, ob die Lösung gültig ist, hast du gar nicht backtracking, sondern brute force.
3. Backtracking als immer optimal annehmen. Korrektheit ist garantiert (findet ALLE Lösungen oder die beste), aber Laufzeit kann exponentiell sein.
4. Pruning vergessen. Ohne Pruning oft unbenutzbar in der Praxis. Constraints früh propagieren.
5. Backtracking mit Greedy verwechseln. Greedy macht eine Wahl und vergisst Alternativen. Backtracking probiert systematisch ALLE.
Interaktiv verstehen
4-Damen-Backtracking-Stepper
Sieh das 4-Damen-Problem mit Backtracking gelöst. Pro Schritt:
- Aktuelle Brett-Position
- Versuchte Damen-Position (gelb)
- Konflikte (rot markiert)
- Backtrack-Schritte wenn keine Lösung in Sicht
So entwickelst du Intuition für "systematisch durchprobieren mit Rückzug".
Interaktive Visualisierung
Interaktive Komponente: probiere sie im Topic-Player oben aus.
Klausur-Tipp: Bei Backtracking-Aufgaben zeichne den Such-Baum: jeder Knoten = Teil-Lösung, Kanten = Erweiterungen. Markiere Pruning-Stellen, das zeigt, warum Backtracking effizient bleibt trotz exponentiellem Worst Case.
Praxis-Übung
Backtracking, Praxis-Übung
6 Aufgaben zu Backtracking-Prinzip, Pruning, klassischen Problemen.
Klausurfragen mit Lösungen (6)
- F1.Was ist die Grundidee von Backtracking?
Antwort: Systematisches Durchprobieren mit Rückzug bei Sackgassen
Erklärung: Backtracking: Tiefensuche durch alle Kandidaten, mit Rückzug bei Sackgassen (Constraints verletzt). Schließt unmögliche Pfade früh aus (Pruning) um exponentielle Laufzeit zu reduzieren.
- F2.Welches Problem ist KEIN klassisches Backtracking-Problem?
Antwort: Binäre Suche
Erklärung: Binäre Suche ist Divide-and-Conquer, KEIN Backtracking. Es teilt das Suchintervall und geht in eine Richtung, kein Rückzug nötig. 8-Damen, Sudoku, 0/1-Knapsack sind Backtracking-Klassiker.
- F3.Backtracking ohne Pruning entspricht brute-force-Tiefensuche mit O(b^d) Worst Case.
Antwort: Wahr
Erklärung: RICHTIG. Ohne Constraint-Check + früher Abbruch ist Backtracking = einfacher rekursiver Such-Baum-Durchlauf. Mit b Verzweigungen pro Knoten und Tiefe d: O(b^d). Pruning macht den Unterschied praktisch und theoretisch.
Typ: Wahr/Falsch
- F4.Was bedeutet 'Pruning' bei Backtracking?
Antwort: Unmögliche Pfade früh abschneiden, bevor sie komplett exploriert werden
Erklärung: Pruning: bei Constraint-Verletzung sofort den ganzen Teilbaum verwerfen statt blind weiterzusuchen. Beispiel: 8-Damen, wenn 2 Damen in gleicher Diagonale → keine weitere Spalte versuchen, direkt zurück.
- F5.Welche Aussagen über Backtracking sind RICHTIG?
Richtige Antworten: Backtracking findet alle Lösungen, wenn man weiter sucht; Branch-and-Bound ist Backtracking + Schranke für Optimierung; 8-Damen kann mit Backtracking effizient gelöst werden; Backtracking hat im Worst Case exponentielle Laufzeit
Erklärung: Richtig: findet alle Lösungen, Branch-and-Bound, 8-Damen, exponentieller Worst Case. Falsch: Backtracking funktioniert AUCH bei NP-schweren Problemen (nur halt exponentiell); DP ist oft schneller bei überlappenden Teilproblemen.
Typ: Multi-Select
- F6.Ordne Paradigma der Strategie zu:
Zuordnungen:
- Greedy → Lokal beste Wahl, kein Rückzug
- Dynamische Programmierung → Überlappende Teilprobleme cachen
- Divide-and-Conquer → Unabhängige Teilprobleme rekursiv lösen
- Backtracking → Systematisches Durchprobieren mit Rückzug
Erklärung: Vier algorithmische Paradigmen. Jedes mit eigener Stärke. Backtracking ist die 'Try-everything-Methode' mit Smart-Pruning.
Typ: Zuordnung
Klausur-Quiz
Klausurfragen mit Lösungen (6)
- F1.Was ist die zentrale Schleife im Backtracking-Pseudocode?
Antwort: for candidate in next_candidates: extend, recurse, undo
Erklärung: Standard-Schleife: für jeden Kandidaten: erweitere Teil-Lösung, rekursiv weiter, undo (zurücksetzen für nächsten Kandidaten). Das undo ist DER Backtracking-Schritt.
- F2.Branch-and-Bound nutzt eine Schranke, um Pfade abzuschneiden, deren bestmögliche Lösung schlechter als das bisher gefundene Optimum ist.
Antwort: Wahr
Erklärung: RICHTIG. Branch-and-Bound = Backtracking + zusätzliche Pruning-Regel: Berechne Upper Bound für jeden Pfad. Wenn UB < bisheriges Bestes → Pfad nicht weiter verfolgen. Sehr effektiv bei TSP, Knapsack.
Typ: Wahr/Falsch
- F3.Beim 8-Damen-Problem: Wie viele NAIVE Brute-Force-Versuche ohne Pruning?
Antwort: 8⁸ ≈ 16 Mio
Erklärung: Naiv: für jede der 8 Spalten 8 mögliche Zeilen → 8⁸ = 16.777.216 Versuche. Mit Backtracking + Pruning: nur ca. 15.000 tatsächlich besuchte Pfade. Pruning macht's praktisch.
- F4.Welcher Algorithmus ist KEIN Backtracking?
Antwort: Quicksort (Standard-Implementation)
Erklärung: Quicksort ist DIVIDE-AND-CONQUER, kein Backtracking. Es teilt um ein Pivot, sortiert rekursiv beide Hälften, kein Rückzug. 8-Damen, Sudoku, TSP-B&B sind Backtracking/Branch-and-Bound.
- F5.Backtracking ist {{1}}-Suche mit Rückzug bei Sackgassen. Die {{2}}-Strategie schneidet unmögliche Pfade früh ab. Bei Optimierungs-Problemen erweitert {{3}} um eine Schranke. Klassische Beispiele: {{4}}-Damen-Problem, Sudoku, Knapsack. Worst-Case-Laufzeit: {{5}} (b = Verzweigung, d = Tiefe).
Lösungen pro Lücke:
- {{1}}: Tiefen / DFS / tiefen
- {{2}}: Pruning
- {{3}}: Branch-and-Bound / Branch and Bound
- {{4}}: 8 / acht
- {{5}}: O(b^d) / O(b^d) / O(b^d)
Erklärung: Backtracking-Vokabular. Tiefensuche, Pruning, Branch-and-Bound, 8-Damen, exponentielle Worst-Case-Laufzeit.
Typ: Lückentext
- F6.Sortiere: Backtracking-Schritt.
Richtige Reihenfolge:
- Ist Teil-Lösung komplett? → Lösung speichern, fertig
- Wähle nächsten Kandidaten (z.B. nächste Zelle, nächste Damen-Position)
- Ist Kandidat vielversprechend (Constraints OK)?
- Wenn ja: erweitere Teil-Lösung um Kandidaten
- Rekursiver Aufruf für nächsten Schritt
- Zurück: undo des Kandidaten (BACKTRACK)
Erklärung: Standard-Backtracking-Schleife. Check → Kandidat → Constraint-Test → Erweitern → Rekursion → Undo. Letzteres ist der namensgebende Schritt.
Typ: Reihenfolge