Worum geht’s
Sehr viele Probleme der KI lassen sich auf dieselbe abstrakte Form bringen: Man steht in einem Zustand, kann ihn mit Aktionen verändern und sucht eine Folge von Aktionen, die in einen Zielzustand führt — möglichst billig. Der Foliensatz fragt genau das: Lassen sich die Suchalgorithmen auch für anderes als die Wegplanung einsetzen? Die Antwort lautet ja, sofern man einen diskreten Zustandsraum hat, eine feste Anzahl ausführbarer Aktionen , und jede Aktion einen Zustandswechsel bewirkt. Als Beispiele nennen die Folien das n-Damen-Problem, das 8er-Puzzle und Krypto-Rätsel — und historisch den General Problem Solver von H. Simon und A. Newell, der zu zwei Zuständen und eine Folge von Operatoren sucht, die in überführt, und dabei bevorzugt solche Operatoren wählt, die die Differenz zwischen und verkleinern.
Was mich an diesem Kapitel überzeugt, ist die saubere Trennung von Modell und Verfahren. Hat man ein Problem einmal als Zustandsraum formalisiert, kann man beliebige Suchalgorithmen darauf ansetzen, ohne das Modell anzufassen. Die ganze Kunst verlagert sich auf zwei Fragen: In welcher Reihenfolge expandiere ich Knoten — und wie viel Wissen über das Ziel lasse ich in diese Reihenfolge einfließen. Genau an dieser zweiten Frage scheidet sich blinde von informierter Suche, und sie entscheidet darüber, ob ein Verfahren Millionen oder nur Tausende Zustände anfasst, bevor es dieselbe optimale Lösung findet.
Kernkonzepte
Suchraum gegen Suchbaum
Der erste Begriff, der sauber sitzen muss, ist der Unterschied zwischen dem Suchraum (auch Zustandsraum) und dem Suchbaum, den ein Algorithmus über ihm aufspannt. Sie werden gern verwechselt, weil ein Bild oft beide zugleich zeigt.
Konkret: Im 8-Puzzle gibt es genau erreichbare Zustände — das ist der Suchraum, und er ändert sich nie. Lässt eine naive Tiefensuche jedoch zu, dass sie eben getane Züge sofort wieder rückgängig macht, erzeugt sie einen unendlich tiefen Suchbaum über diesem endlichen Graphen. Der praktische Trick, der Suchbaum klein gegen den Suchraum hält, ist deshalb das Führen einer Menge bereits gesehener Zustände (graph search statt tree search) — die Folien nennen für das 8-Puzzle die Reduktion „mit Vermeidung von repeated states” von auf Zustände.
Backtracking am n-Damen-Problem
Das durchgängige Beispiel der Folien für blinde Suche ist nicht eine abstrakte Algorithmenfamilie, sondern das n-Damen-Problem: Platziere Damen auf ein -Brett, ohne dass eine die andere bedroht. Der Clou liegt schon in der Repräsentation — und genau dort, sagen die Folien, „steckt die KI”: Statt aller -aus-Brettkonstellationen kodiert man eine Lösung als Vektor , wobei die Spalte der Dame in Zeile ist ( = noch nicht platziert). Verschiedene Zeilen und die Forderung schließen Zeilen- und Spaltenbedrohungen schon konstruktiv aus, so dass nur noch statt aller Konstellationen bleiben (für : Blätter).
Das einzige problemspezifische Stück ist der Zulässigkeitstest. Da Zeilen und Spalten schon ausgeschlossen sind, prüfen die Folien nur noch Diagonalen: Zwei Damen und stehen genau dann auf einer Diagonalen, wenn gilt. Im Worst Case läuft Backtracking den ganzen exponentiellen Suchbaum ab; im Mittel verwirft es ganze Teilbäume früh und sieht nur einen Bruchteil der Knoten.
Blinde Suche
Blinde (uninformierte) Verfahren kennen nur die Problemstruktur, nicht aber die „Richtung” zum Ziel. Sie unterscheiden sich allein durch die Reihenfolge, in der sie die Randmenge (engl. frontier) abarbeiten:
- Breitensuche (BFS) expandiert ebenenweise (FIFO-Rand). Sie ist vollständig und bei Einheitskosten optimal, kostet aber Speicher — die gesamte Ebene muss gehalten werden.
- Tiefensuche (DFS) geht zuerst in die Tiefe (LIFO-Rand). Sie braucht nur Speicher, ist aber weder vollständig (unendliche Pfade) noch optimal.
- Iterative Tiefensuche (IDS) ruft DFS mit wachsender Tiefenschranke wiederholt auf. Sie verbindet den geringen Speicher von DFS mit der Vollständigkeit/Optimalität von BFS; die wiederholten Läufe kosten asymptotisch kaum etwas, da die unterste Ebene dominiert.
- Uniform-Cost-Suche (UCS) expandiert den Randknoten mit den kleinsten bisherigen Pfadkosten . Sie ist auch bei ungleichen Kantenkosten optimal — sie ist Dijkstras Algorithmus, von einer Quelle aus formuliert.
- Bidirektionale Suche lässt zwei Fronten gleichzeitig vom Start und vom Ziel laufen, bis sie sich treffen. Statt expandiert sie nur etwa Knoten — eine Wurzelersparnis —, verlangt aber umkehrbare Operatoren und einen effizienten Schnitt-Test der beiden Ränder.
Informierte Suche
Informierte Verfahren nutzen eine Heuristik , die die Restkosten von zum Ziel schätzt. Damit lenken sie die Suche gezielt in vielversprechende Regionen.
- Gierige Bestensuche expandiert stets den Knoten mit kleinstem . Das ist schnell, aber kurzsichtig: Sie ignoriert die schon zurückgelegten Kosten und ist daher weder optimal noch vollständig — sie kann in eine Sackgasse rennen, die dem Ziel nur scheinbar nahe ist.
- A* kombiniert beides zur Bewertungsfunktion
also bisherige Kosten plus geschätzte Restkosten. schätzt damit die Kosten des besten Pfades durch . A* expandiert immer den Knoten mit kleinstem — gierige Bestensuche ist der Sonderfall , UCS der Sonderfall .
Unter den zulässigen Heuristiken zählt die Dominanz: Gilt für alle (beide zulässig), so expandiert A* mit nie mehr Knoten als mit . „Höher schätzen, ohne zu überschätzen” ist also immer besser — der ideale Grenzfall liefe ohne Umweg direkt zum Ziel. Genau diese Theorie macht der nächste Abschnitt am 8-Puzzle messbar.
Praxis
Übungsblatt 4
a) Der Suchraum ist der durch das Problem festgelegte Graph aller Zustände und Übergänge — er ist objektiv und algorithmusunabhängig. Der Suchbaum ist die vom jeweiligen Verfahren erzeugte Aufzählung von Pfaden in diesem Graphen; ein Zustand kann darin (über verschiedene Wege) mehrfach auftauchen. Kurz: Der Suchraum ist was es zu durchsuchen gibt, der Suchbaum wie ein Algorithmus es tatsächlich abläuft.
b) Blinde (uninformierte) Suche kennt nur Start, Operatoren und Zieltest und entscheidet die Expansionsreihenfolge allein aus der Baumstruktur bzw. den bisherigen Pfadkosten (BFS, DFS, IDS, UCS, bidirektional). Heuristische (informierte) Suche nutzt zusätzlich eine Schätzfunktion der Restkosten, um bevorzugt in Richtung Ziel zu expandieren (Gierige Bestensuche, A*). Der Gewinn ist drastisch weniger Arbeit; der Preis ist, dass man eine gute, im Idealfall zulässige Heuristik finden muss.
Repräsentation. Ein Zustand ist die Position des Suchenden im Gitter. Startzustand , Zielzustand . Eine (Teil-)Lösung ist die Knotenfolge des bisher gefundenen Pfades; gespeichert wird sie über Vorgängerzeiger.
Operatoren. Die acht Richtungen (4 orthogonal, 4 diagonal). Ein Zug ist erlaubt, wenn das Zielfeld im Gitter liegt und nicht tabu ist.
Zieltest. . Da ein optimaler Pfad verlangt ist, wird er nicht beim ersten Erreichen, sondern erst beim Expandieren mit minimalem als endgültig akzeptiert (so garantiert A* die Optimalität).
Pfadkosten. Schrittkosten pro Zug: orthogonal , diagonal (die euklidische Schrittweite). Die Pfadkosten sind die Summe der Schrittkosten, .
. Als Heuristik passt bei Diagonalkosten die Diagonal-/Octile-Distanz zum Ziel (bei Einheitskosten für Diagonalen wäre es die Chebyshev-Distanz), denn sie überschätzt die echten Restkosten in einem 8-Nachbarschafts-Gitter nicht und ist damit zulässig. A* expandiert dann stets den Randknoten mit kleinstem : ist das gesicherte Wissen über den Weg hierher, die optimistische Vorschau auf den Rest. Das Übungsblatt notiert allgemeiner — mit ist es klassisches A*; ergibt UCS, gierige Bestensuche, ein großes ergibt schnelleres, aber nicht mehr optimales gewichtetes A*.
Pseudocode (b–e). Drei der vier Strategien — Uniform-Cost (c), gierige Bestensuche (d) und A* (e) — sind dasselbe Verfahren, eine Best-First-Suche mit Prioritätswarteschlange; sie unterscheiden sich allein im Sortierschlüssel des Randes. Das ist genau die Trennung von Modell und Verfahren aus den Kernkonzepten:
BEST-FIRST(Start, Ziel, key): # key = c) g | d) h | e) g+h
rand ← Prioritätsschlange, sortiert nach key; rand.push(Start)
g[Start] ← 0; vorg[Start] ← null
while rand nicht leer:
n ← rand.pop() # kleinster key-Wert
if n = Ziel: return Pfad(vorg, Ziel) # bei optimaler Suche: erst beim Pop
markiere n als besucht (Reihenfolge protokollieren)
for (m, schritt) in Nachbarn(n): # 8 Richtungen, m nicht tabu/außerhalb
g_neu ← g[n] + schritt # orthogonal 1, diagonal √2
if g_neu < g.get(m, ∞):
g[m] ← g_neu; vorg[m] ← n; rand.push(m mit key(m))
Setzt man key = g, ist es Uniform-Cost; key = h (Octile-Distanz) macht
daraus die gierige Bestensuche, die ignoriert; key = g + h ist A*. Die
bidirektionale Breitensuche (b) fällt aus dem Schema, weil sie zwei Fronten
führt und Einheits-Schritte zählt:
BIDIR-BFS(A, B):
vorne ← FIFO[A]; hinten ← FIFO[B]; vorgV[A]=null; vorgH[B]=null
while beide Fronten nicht leer:
expandiere eine ganze Ebene von vorne (Nachbarn in vorgV eintragen)
if vorgV ∩ vorgH ≠ ∅: return Naht(vorgV, vorgH) # Treffpunkt gefunden
expandiere eine ganze Ebene von hinten (Nachbarn in vorgH eintragen)
if vorgV ∩ vorgH ≠ ∅: return Naht(vorgV, vorgH)
Ich habe alle vier auf dem aus dem Blatt rekonstruierten Labyrinth laufen lassen (die Wandzellen habe ich pixelgenau aus dem Aufgabenbild ausgelesen) und für jede Strategie den Lösungspfad sowie die Reihenfolge der besuchten Felder markiert:
Dasselbe Labyrinth, vier Strategien. Rot: der gefundene Pfad von nach . Die getönten Felder sind die besuchten (expandierten) Positionen, dunkler = früher besucht, mit eingetragener Besuchsnummer. Gut sichtbar: Uniform-Cost (c) wächst kreisförmig und fasst die meisten Felder an; A* (e) zieht denselben kostenoptimalen Pfad mit deutlich weniger Expansionen; die gierige Bestensuche (d) ist am sparsamsten, läuft aber auf einen teureren Weg.
=== Blatt 4, Aufgabe 2 — Gitter-Labyrinth (A=(2,3), B=(7,6)) ===
Strategie Pfadlen Kosten besucht
----------------------------------------------------------------
b) bidirektionale Breitensuche 13 12.00 78
c) Uniform-Cost-Suche 14 15.07 98
d) gierige Bestensuche 14 16.73 27
e) A* (f = g + h) 14 15.07 78
Zwei Befunde sind lehrreich. Erstens liefern UCS und A* exakt denselben kostenoptimalen Pfad (Kosten ), A* besucht dafür aber weniger Felder ( statt ) — die Heuristik spart Arbeit, nicht Qualität. Die gierige Suche ist mit nur besuchten Feldern am billigsten, zahlt das aber mit einem teureren Weg (): Sie ist eben nicht optimal. Zweitens findet die bidirektionale BFS einen Pfad mit nur Zügen (Pfadlänge 13) — weniger Züge als die 13 Züge der kostenoptimalen Lösung. Das ist kein Widerspruch, sondern der Unterschied der Gütemaße: BFS zählt jeden Zug als (auch diagonale) und minimiert die Zuganzahl, während UCS/A* die geometrischen Kosten mit Diagonalgewicht minimieren. Wer Diagonalen „gratis” bewegen darf, nimmt lieber mehr Diagonalschritte.
f) Bewegliches Ziel. Verändert während der Suche seine Position, ist der einmal berechnete Pfad veraltet. Drei Stufen der Reaktion: (i) Neuplanung von Grund auf — bei jeder Zielbewegung A* neu starten; korrekt, aber teuer. (ii) Inkrementelle Suche — Algorithmen wie D* Lite oder LPA* speichern die Suchbaum-Information und reparieren nur die von der Änderung betroffenen Knoten, statt alles zu verwerfen; das ist um Größenordnungen billiger, wenn sich das Ziel nur lokal bewegt. (iii) Verfolgungssuche wie Moving-Target D*, eigens für ein flüchtendes Ziel. Praktisch heißt das: bleibt eine zulässige Schätzung zum aktuellen ; nach jedem Zielsprung werden die -Werte der offenen Knoten mit dem neuen aktualisiert und betroffene Teilbäume neu bewertet.
g) Dynamische Hindernisse. Dürfen während der Suche Wände entstehen oder verschwinden, ist es derselbe Mechanismus wie in f), nur auf der Kantenseite: Eine neue Wand macht Kanten ungültig (Kosten ), eine entfernte Wand gibt neue Kanten frei. Genau dafür wurde D* (Dynamic A*) entworfen — der Standard in der mobilen Robotik (Mars-Rover): Es plant rückwärts vom Ziel, und wenn der Roboter eine Kartenabweichung entdeckt, propagiert es nur die Kostenänderungen lokal, statt komplett neu zu planen. Der Brückenschlag zu 2.1 ist offensichtlich: Eine spontan abgestellte Kiste ist exakt das „nicht kartierte Hindernis”, das dort den Wechsel auf einen reaktiven Bug-Reflex auslöste — hier bleibt man im globalen Planer, repariert ihn aber inkrementell.
i) Skizze zu . Die Formel teilt die geschätzten Gesamtkosten eines Pfades durch in zwei Hälften: das gesicherte Wissen über den bereits zurückgelegten Weg vom Start bis und die optimistische Vorschau auf den Rest bis zum Ziel.
(durchgezogen) ist der gemessene Weg Start→, (gestrichelt) die geschätzte Restdistanz →Ziel. A* expandiert den Knoten mit kleinstem . Mit ist es klassisches A*; ergibt UCS (nur Rückschau), gierige Bestensuche (nur Vorschau).
Modellierung (b). Zustand = Belegung der Felder (Tupel der Kacheln, für das Leerfeld); Operatoren = Schieben einer angrenzenden Kachel ins Leerfeld; Schrittkosten ; Zieltest = geordnete Stellung. Darauf läuft A* mit .
Vier Heuristiken (c).
- — fehlplatzierte Steine (Hamming): Anzahl der Kacheln, die nicht auf ihrem Zielfeld stehen (Leerfeld ausgenommen). Genau dieses steht im Foliensatz, mit dem Beispielwert für eine Stellung, in der nur Kachel 7 schon richtig liegt.
- — Manhattan-Distanz: Summe der Gitterabstände jeder Kachel zu ihrem Zielfeld. Die Folien nennen sie „Summe der Manhattan-Entfernungen zur richtigen Position” ( im selben Beispiel).
- — Tauschkonfigurationen (Folien: „ Anzahl direkter Spielsteintausche”): Mindestzahl direkter Vertauschungen, wenn man (relaxiert) zwei Kacheln direkt tauschen dürfte — zulässig, „da die Anzahl der nötigen direkten Vertauschungen nie größer wird als die tatsächliche Schrittzahl”.
- — Manhattan + Linear Conflicts (Lehrbuch-Verschärfung, nicht in den Folien): Manhattan plus für jedes Paar Kacheln, die in ihrer Zielzeile/-spalte stehen, sich aber gegenseitig überholen müssen.
Anforderungen (e). Zulässigkeit: — die Heuristik überschätzt die wahren Restkosten nie. Zweck: Sie garantiert die Optimalität von A*. Konsistenz (Monotonie): — die Schätzung fällt über jeden Schritt höchstens um die Schrittkosten. Zweck: Die -Werte wachsen monoton, ein einmal expandierter Knoten ist optimal, und A* braucht keine bereits geschlossenen Knoten erneut zu öffnen. Konsistenz impliziert Zulässigkeit, aber nicht umgekehrt. Wünschenswert ist außerdem Informiertheit (möglichst hohe, dominante Werte) bei billiger Berechenbarkeit.
Bewertung (f). Alle vier sind zulässig (sie entstehen aus Relaxationen des Problems); , und sind zudem konsistent. Die Folien prüfen die Zulässigkeit explizit über , also : ist erlaubt, weil jede falsch stehende Kachel mindestens einmal bewegt werden muss; , weil jede Verringerung des Abstands einer Kachel mindestens eine Verschiebung kostet. Es gilt die Dominanzkette : zählt für jede fehlplatzierte Kachel mindestens den einen Zug, den als bucht, also nie weniger; addiert nur nichtnegative Konfliktkosten. Damit ist am schärfsten und expandiert am wenigsten — solange seine teurere Berechnung sich lohnt. ist die schwächste, weil sie die Entfernung einer Kachel zu ihrem Ziel ignoriert. (Tauschen) liegt nicht generell über und dominiert Manhattan nicht; die Folien führen es als eigenständige, ebenfalls zulässige Variante. Genau diese Rangfolge bestätigt die empirische Tabelle der Folien: Bei Lösungslänge 24 expandiert A* mit rund , mit nur Knoten — „mit zunehmender Problemgröße ist spürbar besser als ”.
Assistent-Heuristiken (d) und deren Bewertung durch den Assistenten (g). Das Blatt verlangt ausdrücklich, einen KI-Assistenten nach n-Puzzle-Heuristiken zu fragen und ihn die Heuristiken anschließend selbst bewerten zu lassen. Ich habe das getan und die Antwort gegen meine eigene Lösung geprüft, statt sie zu übernehmen. Der Assistent nannte zu (d): fehlplatzierte Kacheln (Hamming), Manhattan-Distanz, Linear-Conflict (Manhattan + 2 je Konfliktpaar), Pattern-Database-Heuristiken (vorab gelöste Teilmengen, in einer Tabelle gespeichert) und die Walking-Distance/Gaschnig-Heuristik. Das deckt sich mit meinen und ergänzt zwei stärkere, in der Vorlesung nicht behandelte Verfahren: Pattern Databases dominieren Manhattan oft um Größenordnungen, sind aber speicher- statt rechenintensiv — ein lehrreicher Hinweis, den ich übernehme.
Zur Selbstbewertung (g) ordnete der Assistent die Heuristiken korrekt nach Zulässigkeit (alle genannten sind zulässig) und Informiertheit () und benannte den Zielkonflikt Schärfe gegen Berechnungskosten. Ein Punkt war jedoch ungenau: Er bezeichnete pauschal „alle gängigen Heuristiken” als konsistent. Das stimmt für Hamming, Manhattan und Linear Conflict, ist bei manchen additiven Pattern Databases aber begründungsbedürftig. Genau das ist die Lehre des Blattes: Der Assistent liefert eine schnelle, weitgehend korrekte Landkarte, aber die Garantien (Zulässigkeit und Konsistenz) muss man fallweise selbst nachweisen — was ich für oben über die Relaxations-Argumente getan habe.
Implementierung: A* am 8-Puzzle
Den Kern der Theorie — Zulässigkeit (gleiche optimale Länge) und Dominanz (weniger Expansionen) — habe ich für und in reinem Python nachgerechnet und BFS als blinde Referenz daneben gestellt. Alle drei lösen dieselbe feste Startstellung. (Die Folien wählen als Zieltest „Blank in der Mitte”; ich nutze die geläufigere Zielstellung mit Leerfeld unten rechts — am Vergleich von Zulässigkeit und Dominanz ändert das nichts.) Das Herzstück ist A* mit einer Prioritätswarteschlange nach :
def astar(start, h):
counter = 0
frontier = [(h(start), 0, counter, start)] # (f, g, tie, zustand)
best_g = {start: 0}
expanded = 0
while frontier:
f, g, _, state = heapq.heappop(frontier)
if g > best_g.get(state, g):
continue # veralteter Eintrag
if state == GOAL:
return {"loesungslaenge": g, "expandiert": expanded}
expanded += 1
for nxt in nachbarn(state): # Operatoren: Kachel schieben
ng = g + 1
if ng < best_g.get(nxt, 1 << 30):
best_g[nxt] = ng
counter += 1
heapq.heappush(frontier, (ng + h(nxt), ng, counter, nxt))
Das vollständige Skript (beide Heuristiken, BFS, Plots) liegt in
python/src/eport_figures/praxis/p_2_2_suche.py. Seine Ausgabe:
8-Puzzle — A* mit f(n) = g(n) + h(n)
Start: 8 6 7 | 2 5 4 | 3 _ 1
Ziel: 1 2 3 | 4 5 6 | 7 8 _
Startwerte der Heuristiken: h1 = 7 (fehlplatzierte Steine), h2 = 21 (Manhattan)
Strategie Laenge expandiert
----------------------------------------------------
BFS (blind, h = 0) 31 181438
A*, h1 fehlplatzierte Steine 31 143848
A*, h2 Manhattan-Distanz 31 21197
-> Alle drei finden dieselbe optimale Laenge (31 Zuege): empirischer Beleg fuer Zulaessigkeit.
-> h1 spart gegenueber BFS Faktor 1.3 an Expansionen;
h2 spart gegenueber h1 noch einmal Faktor 6.8.
-> Dominanz h2 >= h1: 21 >= 7 => h2 ist die schaerfere Heuristik.
-> Entlang des optimalen Pfads gilt h1, h2 <= h* an jedem Knoten: ja (nie ueberschaetzt).
Drei Befunde, die die Theorie tragen. Erstens: Alle drei Verfahren finden eine Lösung der Länge — der empirische Beleg, dass und zulässig sind und die Optimalität von A* nicht verletzen. Zweitens: Die blinde BFS fasst gut Knoten an, bei Gesamtzuständen also fast den ganzen Suchraum; kommt mit aus, einer knappen Größenordnung weniger. Drittens die Dominanz: punktweise (am Start ), und entsprechend expandiert rund -mal weniger als .
Expandierte Knoten je Strategie (logarithmische Achse). Von der blinden BFS über die schwache Heuristik zur dominanten fällt der Aufwand um fast eine Größenordnung — bei identischer optimaler Lösungslänge.
Dass die Heuristiken nie überschätzen und enger an der Wahrheit liegt, sieht man am direktesten, wenn man ihre Werte entlang des optimalen Pfades gegen die echten Restkosten aufträgt:
Entlang des optimalen Pfads bleiben beide Heuristiken stets unter den echten Restkosten (Zulässigkeit). (Manhattan) schmiegt sich enger an als — genau diese geringere Lücke übersetzt sich in weniger Expansionen.
a) Vorgehen und Startposition. Versucht man es von Hand, lernt man schnell die entscheidende Falle: Man darf sich nicht in eine Ecke des noch freien Gebiets manövrieren, von der aus kein unbesuchtes Feld mehr erreichbar ist. Intuitiv steuert man deshalb zuerst die schwer erreichbaren Randfelder an und hebt sich die gut vernetzten Zentrumsfelder auf. Die Startposition ändert nichts an der grundsätzlichen Lösbarkeit (auf dem -Brett existieren Springerwege von jedem Feld aus), aber sie verschiebt, wie früh man in Engpässe gerät.
b) Repräsentation und Modellierung. Ein Zustand ist das Paar — formal ein Pfad, da kein Feld doppelt vorkommen darf. Operatoren sind die bis zu acht Springerzüge auf ein freies, noch unbesuchtes Feld im Brett. Der Zieltest ist „alle Felder besucht”. Der Suchraum ist gewaltig (der Verzweigungsgrad liegt bei bis zu , die Tiefe bei ), weshalb naive Tiefensuche mit Backtracking zwar korrekt, aber langsam ist.
c) A* sinnvoll? Nur bedingt. A* glänzt, wenn Pfadkosten minimiert werden; beim Springerweg sind aber alle vollständigen Wege gleich lang ( Züge) — es gibt keine Kosten zu minimieren, gesucht ist irgendeine vollständige Tour (ein Constraint-Satisfaction-artiges Erfüllbarkeitsproblem, vgl. 2.4). Eine sinnvolle A*-Variante wäre höchstens, als „Anzahl noch unbesuchter Felder” zu lesen und A* als Tiefensuche mit kluger Zugreihenfolge zu betreiben — was direkt zu (d) führt.
d) Beschleunigung: Warnsdorffs Regel. Die berühmte Heuristik (Warnsdorff, 1823) ist bestechend einfach: Ziehe stets auf das Feld mit den wenigsten noch freien Folgezügen. Sie steuert den Springer zuerst in die „klammen” Ecken, solange diese noch erreichbar sind, und vermeidet so die Sackgassen aus (a). Das beschleunigt die Suche dramatisch, weil sie den Verzweigungsfaktor des Suchbaums faktisch auf nahezu drückt — statt exponentiell zu verzweigen, folgt sie meist direkt einer Lösung, ganz ohne Backtracking. Mein Test bestätigt das eindrücklich:
=== Blatt 4, Aufgabe 5 — Springerweg auf 8x8 (Warnsdorff) ===
Start (0,0): vollständiger Weg = True, 64/64 Felder besucht.
Reine Warnsdorff-Regel ohne Backtracking: 61/64 Startfelder
liefern direkt einen vollständigen Springerweg.
Von der Startfelder findet die reine greedy Warnsdorff-Regel ohne einen einzigen Rücksetzschritt sofort eine vollständige Tour; nur an drei Startfeldern müsste man sie um etwas Backtracking ergänzen. Das ist der Kern, warum Heuristiken Suche beschleunigen: Sie ersetzen blindes Probieren durch eine informierte Zugreihenfolge, die die teuren Teilbäume gar nicht erst betritt.
Ein vollständiger Springerweg ab Feld (grün), gefunden mit Warnsdorffs Regel. Die Zahlen geben die Besuchsreihenfolge an; die Linie verbindet aufeinanderfolgende Springerzüge.
Querbezüge
- 2.1 (Pfadplanung/Navigation): Das Labyrinth aus Aufgabe 2 ist genau das Anwendungsfeld von dort — A* ist der Standardplaner für Gitter- und Wegenetze, und die Wahl der Heuristik (Manhattan, Chebyshev, euklidisch) hängt am erlaubten Bewegungsmodell.
- 2.3 (Spielbäume): Auch Minimax/Alpha-Beta sind Suche, nur in einem Baum mit gegnerischen Zügen. Die Heuristik aus diesem Kapitel kehrt dort als Bewertungsfunktion für nicht-terminale Stellungen wieder.
- 2.4 (Backtracking/CSP): Backtracking ist Tiefensuche über partiellen Belegungen; die informierten Heuristiken (MRV, Forward Checking) spielen dieselbe Rolle wie hier — sie lenken die Reihenfolge der Expansion.
- Algorithmen & Datenstrukturen: A* ist Dijkstra mit einer Potentialfunktion
; UCS ist Dijkstra. Beide leben von der Prioritätswarteschlange (Heap),
deren -Operationen die Laufzeit bestimmen — hier konkret
Pythons
heapq. - Theoretische Informatik: Die Schranken und der Wurzelgewinn der bidirektionalen Suche sind Komplexitätsaussagen; die Konsistenzbedingung ist im Kern eine Dreiecksungleichung und macht den -Wert zu einer monoton wachsenden Größe — verwandt mit Potential- und Reduktionsargumenten.
Quellen
- Foliensatz
_220_AI_ProbSearch.pdf— Grundlage für die Systematik blinde/informierte Suche und die Notation . Der Foliensatz ist stark bildbasiert; die Begriffe habe ich daher mit Russell & Norvig abgeglichen, um Zulässigkeit und Konsistenz präzise zu fassen. - Übungsblatt 4
ki_ueb220_Search.pdf— Aufgaben 1–3 und die Zusatzaufgabe 5 (Springerwege), hier ausgearbeitet. Das Labyrinth aus Aufgabe 2 habe ich pixelgenau aus dem PDF rekonstruiert und alle vier Strategien (bidirektionale BFS, UCS, gierig, A*) darauf laufen lassen; die allgemeine Form des Blattes habe ich auf die Standardfälle zurückgeführt und die Erweiterungen (bewegliches Ziel, dynamische Hindernisse) auf die inkrementellen Planer D* Lite / D* bezogen. - Warnsdorff (1823) — die klassische „wenigste-Folgezüge”-Regel für Springerwege; an ihr habe ich die Beschleunigung gegenüber blindem Backtracking (Aufgabe 5d) gemessen.
- Stentz (1994), Optimal and Efficient Path Planning for Partially-Known Environments (D*) — nachgeschlagen für die inkrementelle Neuplanung bei beweglichem Ziel und dynamischen Hindernissen (Aufgabe 2f/g).
- Russell & Norvig, Artificial Intelligence: A Modern Approach, Kap. 3 — als Referenz für die saubere Definition von Zulässigkeit, Konsistenz und Dominanz sowie für das 8-Puzzle als kanonisches Beispiel.
- Hart, Nilsson & Raphael (1968), A Formal Basis for the Heuristic Determination of Minimum Cost Paths — die Originalarbeit, die A* samt und der Zulässigkeitsbedingung einführt; nachgeschlagen, um die Folien-Notation an der Primärquelle zu prüfen.
- aima-python (
search4e.ipynb) und die n-Puzzle-Web-Demo — ausprobiert, um die Stellung und die optimale Zuglänge gegenzuprüfen; meine eigene Implementierung reproduziert die dort beobachtete Expansionshierarchie BFS .