Interaktives Graphentheorie-Lernen
Interaktives Graphentheorie-Lernen
Guest User
Using app without sign in
Finder für Hamiltonpfade
Findet Pfad, der jeden Knoten genau einmal besucht
Wählen Sie einen Algorithmus und generieren Sie Schritte, um die Visualisierung zu beginnen
Ein Hamiltonpfad besucht jeden Knoten eines Graphen genau einmal; ein Hamiltonkreis kehrt zusätzlich zum Startknoten zurück. Zu entscheiden, ob ein solcher Pfad existiert, ist NP-vollständig, im scharfen Gegensatz zum Eulerpfad, der in linearer Zeit prüfbar ist.
Exakte Algorithmen nutzen Backtracking: einen Teilpfad um jeweils einen Knoten erweitern und abschneiden, wenn der aktuelle Knoten keinen unbesuchten Nachbarn hat. Dynamische Programmierung über Teilmengen (dieselbe Bitmasken-Technik wie Held-Karp) löst das Problem in O(n hoch 2 mal 2 hoch n). Nützliche Abschneideregeln sind Gradprüfungen und Zusammenhangstests des Restgraphen. Für spezielle Graphklassen wie Turniere oder Graphen mit Dirac- oder Ore-Gradbedingungen ist die Existenz garantiert und es gibt konstruktive Algorithmen.
Hamiltonpfade erscheinen bei der Genom-Assemblierung, im Schaltungsentwurf und -test, in Rätselspielen wie Springerrundreisen und als struktureller Kern des TSP. In Interviews ist die Bitmasken-DP-Lösung eine klassische schwere Frage, und der Kontrast zum Eulerpfad prüft die konzeptionelle Klarheit.
Es ist kein polynomieller Algorithmus bekannt, die ehrliche Formulierung ist also Backtracking mit Pruning. Erst das Pruning macht ihn überhaupt brauchbar.
Hamiltonweg(graph):
für jeden Startknoten s:
wenn backtrack([s], {s}): gib den Weg zurück
gib keinen zurück
backtrack(weg, besucht):
wenn besucht alle Knoten enthält: gib wahr zurück
u = weg.letzter
für jeden unbesuchten Nachbarn v von u:
// Pruning, das sich selbst bezahlt macht:
// - ein unbesuchter Knoten jetzt unerreichbar -> scheitern
// - zwei oder mehr unbesuchte Knoten mit Grad 1
// im Restgraphen -> scheitern
besucht.hinzufügen(v)
wenn backtrack(weg + [v], besucht): gib wahr zurück
besucht.entfernen(v) // rückgängig, nächsten probieren
gib falsch zurückDas Erreichbarkeits-Pruning ist das wichtigste. Nach der Wahl eines Teilwegs führe einen schnellen Durchlauf über die unbesuchten Knoten aus; ist einer davon vom aktuellen Endpunkt abgeschnitten, ist der Zweig tot und kann sofort verworfen werden, statt erst nach dem Durchsuchen eines ganzen Teilbaums. Auf dünnen Graphen verwandelt das eine unlösbare Suche in eine schnelle, auch wenn der schlechteste Fall exponentiell bleibt.
Suche einen Hamiltonweg von A auf einem Graphen mit fünf Knoten und sieh, warum derselbe Graph keinen Hamiltonkreis besitzt.
Beispielgraph: Ungerichtete Kanten A-B, B-C, C-D, D-E, dazu die beiden Sehnen A-C und B-D.
Es existieren zwei Hamiltonwege, A-B-C-D-E und A-C-B-D-E, aber kein Hamiltonkreis. Der Knoten E vom Grad 1 klärt beide Fragen beinahe im Alleingang: er zwingt sich selbst zum Wegendpunkt und schließt jeden Kreis aus, da ein Kreis von jedem Knoten mindestens Grad 2 verlangt. Die Grade vor der Suche zu prüfen ist billig und oft entscheidend.
Zeit: O(V!) naiv, O(V^2·2^V) mit DP · Speicher: O(V·2^V) mit DP
Naives Backtracking durchsucht Permutationen und ist im schlechtesten Fall O(V Fakultät), was jenseits von etwa 12 Knoten aussichtslos ist. Held-Karp-Dynamikprogrammierung über Teilmengen schneidet weit besser ab: der Zustand ist eine Teilmenge besuchter Knoten zusammen mit dem aktuellen Endpunkt, was 2 hoch V mal V Zustände ergibt, und jeder Übergang kostet O(V), insgesamt also O(V hoch 2 mal 2 hoch V) Zeit und O(V mal 2 hoch V) Speicher. Das ist bis etwa 20 Knoten praktikabel, wo 2 hoch 20 mal 20 rund 20 Millionen Zustände sind. Das Problem ist NP-vollständig, ein polynomieller Algorithmus wird also nicht erwartet; gepruntes Backtracking endet auf realen dünnen Graphen dennoch oft rasch.
Kläre, welches Problem du wirklich hast, bevor du zu exponentieller Maschinerie greifst, denn zwei davon sind leicht.
| Alternative | Vorzuziehen, wenn | Kosten |
|---|---|---|
| Eulerweg | Du brauchst jede KANTE einmal statt jeden Knoten. Lineare Zeit über eine Gradzählung. | O(V + E) |
| Held-Karp-DP | Unter etwa 20 Knoten und du brauchst ein definitives Ja oder Nein. | O(V^2·2^V) |
| TSP-Heuristiken | Der Graph ist vollständig und gewichtet, und du willst eine gute Tour statt eines Existenzbeweises. | O(n^2) je 2-opt-Durchgang |
| Hinreichende Bedingungen von Dirac und Ore | Du musst nur zeigen, dass ein Kreis existiert. Ist jeder Grad mindestens V/2, existiert einer, ganz ohne Suche. | O(V) |
| Topologische Sortierung | Der Graph ist ein DAG. Ein Hamiltonweg existiert genau dann, wenn aufeinanderfolgende Knoten der eindeutigen topologischen Ordnung benachbart sind. | O(V + E) |
Verwandte Algorithmen: Eulerscher Pfad (Ungerichtet), Handlungsreisender-Problem, Tiefensuche