Der Begriff Rücksetzverfahren oder englisch Backtracking (Rückverfolgung) bezeichnet eine Problemlösungsmethode innerhalb der Algorithmik.
Allgemeiner Algorithmus Bearbeiten
Backtracking geht nach dem Versuch-und-Irrtum-Prinzip (trial and error) vor, das heißt, es wird versucht, eine erreichte Teillösung zu einer Gesamtlösung auszubauen. Wenn absehbar ist, dass eine Teillösung nicht zu einer endgültigen Lösung führen kann, wird der letzte Schritt beziehungsweise werden die letzten Schritte zurückgenommen, und es werden stattdessen alternative Wege probiert. Auf diese Weise ist sichergestellt, dass alle in Frage kommenden Lösungswege ausprobiert werden können (Prinzip des Ariadnefadens). Mit Backtracking-Algorithmen wird eine vorhandene Lösung entweder gefunden (unter Umständen nach sehr langer Laufzeit), oder es kann definitiv ausgesagt werden, dass keine Lösung existiert. Backtracking wird meistens am einfachsten rekursiv implementiert und ist ein prototypischer Anwendungsfall von Rekursion.
Funktion FindeLösung (Stufe, Vektor) 1. wiederhole, solange es noch neue Teil-Lösungsschritte gibt: a) wähle einen neuen Teil-Lösungsschritt; b) falls Wahl gültig ist: I) erweitere Vektor um Wahl; II) falls Vektor vollständig ist, return true; // Lösung gefunden! sonst: falls (FindeLösung(Stufe+1, Vektor)) return true; // Lösung! sonst mache Wahl rückgängig; // Sackgasse (Backtracking)! 2. Da es keinen neuen Teil-Lösungsschritt gibt: return false // Keine Lösung!
Zeitkomplexität Bearbeiten
Bei der Tiefensuche werden bei maximal möglichen Verzweigungen von jeder Teillösung aus und einem Lösungsbaum mit maximaler Tiefe von im schlechtesten Fall Knoten erweitert.
Die Tiefensuche und somit auch Backtracking haben im schlechtesten Fall mit und einem Verzweigungsgrad eine exponentielle Laufzeit. Je größer die Suchtiefe , desto länger dauert die Suche nach einer Lösung. Daher ist das Backtracking primär für Probleme mit einem kleinen Lösungsbaum geeignet.
Es gibt jedoch Methoden, mit welchen die Zeitkomplexität eines Backtracking-Algorithmus verringert werden kann. Diese sind unter anderem:
- Heuristiken
- Akzeptanz von Näherungslösungen und Fehlertoleranz
- Durchschnittliche Eingabemenge
Beispiele Bearbeiten
Bekannte Probleme, die sich mit Backtracking lösen lassen, sind unter anderem:
Viele dieser Probleme sind NP-vollständig.
Prolog Bearbeiten
Die Programmiersprache Prolog benutzt Backtracking zur Antwort-Generierung. Dabei probiert der Interpreter alle Beweismöglichkeiten der Reihe nach durch. Entscheidungspunkte werden dabei als Choice Point bezeichnet. Der so genannte Cut-Operator !
kann benutzt werden, um Choice-Points zu verwerfen.
Literatur Bearbeiten
- Robert Sedgewick: Algorithmen. 2. Auflage. Addison-Wesley, München 2002, ISBN 3-8273-7032-9.
- Niklaus Wirth: Algorithmen und Datenstrukturen. 3., überarbeitete Auflage. Teubner, Stuttgart 1983, ISBN 3-519-02250-8.