Heuristische Suche J. Eckerle, Th. Ottmann Institut fur Informatik Universitat Freiburg 27. September 1995 1 Problemreprasentation, Zustandsraume und Produktionssysteme Viele Probleme aus der Kunstlichen Intelligenz lassen sich als Suchprobleme auassen. Dazu gehoren zum Beispiel das automatische Beweisen, die Steuerung von Robotern und als typische Vertreter insbesondere Spiele. Wir wollen uns hier vor allem mit sogenannten Einpersonenspielen beschaftigen. Das sind Geduldsspiele wie Puzzles, Solitaire, Buchstabenratsel und andere. Beginnen wir mit einem konkreten Beispiel: dem 8-Puzzle. Das ist ein quadratisches Brett, das in 3 3 Felder eingeteilt ist. Davon tragen acht Felder eine der Zahlen von eins bis acht, und ein Feld bleibt leer. Ein Feld, das an das leere Feld angrenzt, kann in einem Schritt in dieses leere Feld hinein verschoben werden, so da das leere Feld an eine andere Stelle im Brett wandert. Die Aufgabe besteht nun darin, ausgehend von einer Startsituation, also einer gegebenen Verteilung der numerierten acht Felder auf dem Brett, eine Zielposition durch sukzessive Verschiebungen der genannten Art zu erreichen. In der Regel ist die Zielposition die Position, in der die Randfelder zyklisch beginnend mit 1 links oben im Uhrzeigersinn aufsteigend numeriert sind. Ein Beispiel zeigt die Abbildung 1. Dies Bild zeigt auch, da man ausgehend vom Startzustand oenbar drei mogliche Nachfolgerzustande erzeugen kann, die dadurch entstehen, da man jeweils eines der numerierten Felder in die leere Position des Startzustandes 1 2 Start 3 1 1 8 4 8 7 6 5 7 8 3 2 3 4 1 8 4 5 7 6 5 2 3 2 1 8 4 1 7 6 5 7 6 A B 2 3 4 6 Ziel 5 C Abbildung 1: Das 8-Puzzle verschiebt. Die drei Nachfolgezustande A, B, C des Startzustandes kann man nun entsprechend weiter verandern. A hat zwei, B vier und C drei mogliche Nachfolgezustande, von denen aber jeweils einer mit dem bereits betrachteten Startzustand identisch ist, so da es naturlich genugt, nur die neuen Zustande zu erzeugen. So fortfahrend kann man versuchen, schlielich den Zielzustand zu erzeugen. Eine Losung des 8-Puzzles besteht dann in einer Folge von zulassigen Zugen, also in einem Pfad des so erzeugten Baumes, der vom Startzustand zum Zielzustand fuhrt. B 10 10 7 E 13 7 9 6 C 6 A 5 10 D Abbildung 2: Das Traveling-Salesman-Problem Diskutieren wir noch ein zweites Beispiel: das sogenannte TravellingSalesman-Problem (Problem des Handlungsreisenden). Gegeben sei ein ungerichteter Graph, dessen Knoten Orte (Stadte) und dessen Kanten Entfernungen zwischen diesen Orten reprasentieren. Ein Beispiel zeigt der Graph von Bild 2. Gesucht ist ein geschlossener Kantenzug (eine Tour), der jeden Ort 2 genau einmal besucht und fur den gilt, da die Summe der Entfernungen zwischen den gesuchten Orten, also die Summe der Kantengewichte minimalen Wert unter allen derartigen Touren hat. Auch dieses Problem kann man als ein Problem zum Durchsuchen eines baumartig strukturierten Graphen auassen. Der Startzustand ist ein Knoten, der den Startknoten im Graphen reprasentiert. Er hat als Nachfolger alle vom Startknoten im Graphen, also im obigen Beispiel vom Knoten A aus, direkt erreichbaren Knoten, das sind hier die Knoten B, C, D und E. Die Nachfolgeknoten des Startknotens reprasentieren also Teiltouren, die unterschiedliche Lange haben, die durch die Entfernungen des Startknotens zu den Knoten B, C, D und E gegeben sind. Von jedem dieser Nachfolgerknoten des Startknotens kann man nun entsprechend fortfahren, also etwa vom Knoten, der die Teiltour A-C reprasentiert, eine neue, um einen Knoten langere Teiltour dadurch zu erzeugen, da man alle von C aus direkt erreichbaren Knoten betrachtet, die bisher noch nicht besucht worden sind. Dies sind in diesem Fall B, D und E (vgl. Bild 3). (A) Anfang 7 (A,B) 6 10 (A,C) (A,D) 13 (A,E) 5 (A,C,D) 6 (A,C,D,E) 10 (A,C,D,E,B) 7 Ziel (A,C,D,E,B,A) Abbildung 3: Hier fehlt die Bildunterschrift Ganz ahnlich wie im Falle des 8-Puzzles haben wir auch im Falle des Travelling-Salesman-Problems eine Menge von Zustanden, die als Teillosungen des zu losenden Gesamtproblems aufgefat werden konnen, mit einem Startzustand (das ist der Knoten, der nur den Startknoten des gegebenen 3 Graphen enthalt) und einem Zielzustand, der eine mogliche geschlossene Tour durch den gegebenen Graphen enthalt. Eine Losung des Travelling-SalesmanProblems kann nun aufgefat werden als ein Pfad vom Startzustand zum Zielzustand, fur den die Kosten des Weges sich durch die Summe der Kosten der durchlaufenen Kanten berechnet. Gesucht ist freilich eine zulassige Tour, also eine Tour, die alle Knoten im gegebenen Graphen genau einmal besucht und dann zum Ausgangspunkt zuruckkehrt, mit der Eigenschaft, da diese Tour minimale Kosten unter allen moglichen Touren hat. Es gibt viele weitere Probleme, die sich auf ahnliche Weise reprasentieren lassen. Man denke etwa an Buchstabenratsel (siehe Bild 4). Jedem Buchstaben entspricht eine Dezimalzier. Kommt derselbe Buchstabe mehrfach vor, mu ihm jedes Mal dieselbe Zier zugeordnet werden. Verschiedene Buchstaben entsprechen verschiedenen Ziern. Gesucht ist eine Zuordnung von Buchstaben zu Ziern, die diese Eigenschaften erfullt. Der Startzustand ist also der Zustand, bei dem man noch keine Zuordnung eines Buchstaben zu einer Zier vorgenommen hat. Und Zielzustand ist eine korrekte Zuordnung aller Buchstaben zu Dezimalziern. SEND MORE MONEY DONALD GERALD CROSS ROADS ROBERT DANGER Abbildung 4: Kryptoarithmetik Weitere Beispiele sind Varianten von Schiebepuzzles, Solitaire, das bekannte Acht-Damen-Problem, das Umfullproblem und viele andere (hier eventuell einige weitere konkrete Beispiele angeben). Was ist all diesen Problemen gemeinsam? Oenbar kann man Problemlosen in jedem dieser Falle als eine Suche in Zustandsraumen auassen, d. h. man formuliert das Problem als ein sogenanntes Produktionssystem bestehend aus einem Zustandsraum, einem Start- und einem Zielzustand und einer endlichen Menge von U bergangsregeln, die sagen, wie man aus einem Zustand einen zulassigen Nachfolgezustand erzeugen kann. Problemlosen bedeutet dann, eine Folge von U bergangen nach den Regeln des Produktionssystems zu nden, die den Startzustand in den Zielzustand uberfuhrt. Dabei verlangt man, wie etwa in dem Falle des TravellingSalesman-Problems, haug noch zusatzliche Eigenschaften namlich, da die 4 Folge von U bergangen optimal in dem Sinne ist, da sie die geringstmoglichen Kosten unter allen moglichen Folgen hat, die von einem Startzustand in einen moglichen Zielzustand fuhren. Ohne den Begri des Produktionssystems formal ganz prazise zu denieren, wollen wir uns zuachst klarmachen, da es kein allgemeines Verfahren zur Losung von Problemen gibt, die in der soeben beschriebenen Weise reprasentiert werden. Denn es gilt der folgende Satz von Post: Satz 1 (Post 1943) Es gibt kein allgemeines Verfahren, um fur ein beliebiges Produktionssystem mit beliebig gegebenem Start- und Zielzustand festzustellen, ob der Startzustand in endlich vielen Schritten in den Zielzustand uberfuhrbar ist oder nicht. Beweis: Der Beweis des Satzes von Post erfolgt durch eine Reduktion auf die Unentscheidbarkeit des Halteproblems fur Turing-Maschinen. Gegeben P sei eine Turing-Maschine M mit Bandalphabet = fa0 : : : ang, Zustandsalphabet S = fq0 : : : qm g,PAnfangszustand q0 und einer U bergangstafel, P deren Zeilen Elemente von S S f0 ;1 +1g sind dabei identiziert man den Buchstaben a0 mit dem Leerzeichen und schreibt dafur meistens . Eine Programmzeile a q q b d wird wie folgt interprtiert: Wenn auf dem Arbeitsfeld von M der Buchstabe a steht und M im Zustand q ist, so geht M uber in den Zustand q , druckt b auf das Arbeitsfeld und verschiebt das Arbeitsfeld um d Positionen (nicht, 1 Feld nach links, bzw. 1 Feld nach rechts, je nach dem, ob d = 0, d = ;1, oder d = +1 ist). Wir denieren jetzt zu M ein Produktionssystem P P wie folgt: ZustandsP + raum von P ist die Menge aller Worte aus fa0g S fa0 g+ sie entsprechen Kongurationen der Turing-Maschine M . Ein Beispiel ist das Wort a a b c a qi b a a c : Es reprasentiert eine Konguration der Turing-Maschine M , in der das Band die Inschrift aabcabaac tragt, M im Zustand qi ist und b Buchstabe auf dem Arbeitsfeld ist. Das Arbeitsfeld wird also durch Voranstellen des Zustands der Turing-Maschine markiert. 0 0 5 Startzustand von P ist q0 und Endzustand qe, mit qe Endzustand von M . (o. E. konnen wir annehmen, da M den Zustand qe nicht mehr verlassen kann, sobald M ihn erreicht hat.) Jetzt ordnet man jeder Programmzeile von M U bergangsregeln fur Zustande des Produktionssystems P zu, und zwar wie folgt: Einer Programmzeile aqq b0 wird eine U bergangsregel zugeordnet, die es P P + erlaubt, einen Zustand wqaw mit w 2 fa0g und w aus fa0 g+ zu uberfuhren in einen Zustand wq bw und entsprechend fur die anderen Regeln der gegebenen Turing-Maschine M . Also erhalten wir insgesamt folgende Zuordnung: 0 0 0 aqq b0 aqq b1 a q q b ;1 0 0 0 0 0 w q a w ;! w q a w ;! w c q a w ;! 0 0 0 wq bw wbq w w q c b w , fur c 2 P 0 0 0 0 0 0 Schlielich erganzt man die Regeln noch um w qe w ;! w qe w w qe w ;! w qe w 0 0 0 0 zum "Verkurzen\ des leeren Bandes. Jetzt gilt oenbar folgender Zusammenhang zwischen M und P : M halt, angesetzt auf das leere Band im Startzustand q0 nach endlich vielen Schritten mit leerem Band im Endzustand qe, genau dann, wenn der Startzustand q0 mit Hilfe der Produktionen von P in endlich vielen Schritten in qe uberfuhrbar ist. Damit folgt die Unentscheidbarkeit des U berfuhrungsproblems fur Produktionssysteme aus der Unentscheidbarkeit des Haltproblems fur TuringMaschinen. 2 Bemerkungen: Selbstverstandlich kann es fur konkrete Produktionssysteme und fur einen konkreten Start- und Zielstand sehr wohl moglich sein, da man die Frage der U berfuhrbarkeit des Starts- in den Zielzustand mit Hilfe der Produktionen des Produktionssystems entscheiden kann. Das ist z. B. dann der Fall, wenn man wei, da es uberhaupt nur endlich viele mogliche Zustande insgesamt gibt. Dieser Fall liegt beim 8-Puzzle und auch beim Travelling-Salesmen-Problem oensichtlich vor. Dennoch impliziert das nicht, 6 da das Problem dann auch praktisch losbar ist. Die Losung kann namlich an der ungeheuren Groe des Zustandsraumes und des zu durchsuchenden Graphen scheitern. Dies ist auch genau die Schwierigkeit, die man bei der praktischen Losung von Problemen in diesem Rahmen hat. 2 Suche in explizit und implizit gegebenen Graphen Wir haben gesehen, da man Problemlosen als eine Suche in einem Zustandsraum modellieren kann. Zustanden entsprechen Probleme oder Teillosungen von Problemen. Ausgehend von einem Startzustand ist ein Zielzustand gesucht. U bergangsregeln (Produktionen) legen fest, wie man von einem Zustand zu moglichen Nachfolgerzustanden kommen kann. Bereits fur das 8Puzzle, aber ebenso in vielen anderen Fallen, ist es durchaus typisch, da man denselben Zustand auf ganz verschiedenen Wegen vom Startzustand aus erreichen kann. Modellieren wir also Zustandsraume ganz abstrakt als Graphen bestehend aus Knoten und Kanten, wobei die Knoten den Problemzustanden entsprechen und zwischen je zwei Knoten eine Kante besteht, wenn die ihnen entsprechenden Zustande ineinander uberfuhrbar sind. Nun wird man im allgemeinen nicht erwarten konnen, da ein so reprasentiertes Problem ein Baum ist. Vielmehr erhalt man in der Regel einen Graphen, und zwar einen gerichteten Graphen. U blicherweise geht man davon aus, da ein Graph G bestehend aus der Knotenmenge V und der Kantenmenge E explizit gegeben ist, z. B. durch eine Adjazenzmatrix, die fur jedes Paar (u v) von Knoten einen Eintrag 0 enthalt, falls keine Kante zwischen den Knoten u und v existiert und einen Eintrag 1, falls es eine Kante von u nach v gibt. Weil der Platzbedarf bei der Reprasentation eines Graphen durch eine Adjazenzmatrix proportional zum Quadrat der Anzahl der Knoten ist, zieht man fur praktische Zwecke bei explizit gegebenen Graphen meistens die Reprasentation von Graphen durch Adjazenzlisten vor. Hier reprasentiert man einen Graphen G = (V E ) durch ein Array Adj : array 1 : : : jV j] von Zeigern auf Knotenlisten. Dabei ist fur jeden Knoten u aus V Adj u] ein Zeiger auf die Liste aller Knoten v mit (u v) aus E . Ein Beispiel zeigt Bild5. Bei dieser Reprasentation ist der Platzbedarf zur Speicherung eines Gra7 1 4 2 5 3 6 1 2 2 5 3 5 4 2 5 4 6 6 4 6 Abbildung 5: Hier fehlt die Bildunterschrift phen nur noch von der Groenordnung O(jV j + jE j). Fur einen in dieser Weise explizit gegebenen Graphen kann man das Problem der Graphsuche wie folgt formulieren: Problem 1 (Graphsuche) Gegeben sei ein Graph G = (V E ) durch eine Adjazenzliste und ein Startknoten s. Bestimme alle von s aus erreichbaren Knoten, d. h. fur jeden Knoten v die Distanz d(v) zu s und ferner den Vorganger (v) von v auf dem kurzesten Pfad von s zu v . Dabei konnen wir als Distanz eines Knotens v zum Startknoten s z. B. die Anzahl der Knoten auf dem Weg von s zu v nehmen. Das ist ein vernunftiges Ma, wenn die Kanten nicht mit Distanzwerten (Gewichten) versehen sind. Haben die Kanten Gewichte, deniert man Distanz ublicherweise als die Summe der Gewichte auf dem Pfad von s zu v. Fur solche explizit gegebenen Graphen gibt es zwei wichtige Klassen von Verfahren zur Losung des Problems Graphsuche. 1. Die Breitensuche, die grob dadurch charakterisiert werden kann, da man ausgehend von einem Knoten zunachst alle Bruder eines besuchten Knotens, die man noch nicht besucht hat, besucht, und 2. die Tiefensuche, die wiederum dadurch grob charakterisiert werden kann, da man ausgehend von einem Knoten zunachst die noch nicht besuchten Sohne besucht und dieses fur jeden Knoten rekusiv so fortsetzt. Wir wollen hier nicht die Breiten- und Tiefensuche fur explizit gegebene Graphen genauer diskutieren, sondern verweisen dazu auf die Literatur 8 T. H. Cormen, C. E. Leiserson, and R. L. Rivest, Introduction to Algorithms, MIT Press, Cambridge, MA, 1990 Besonders einfach lassen sich diese Suchverfahren in explizit gegebenen Graphen beschreiben, wenn der jeweils gegebene Graph ein Baum ist. Ein Baum ist dadurch charakterisiert, da es zu jedem Knoten v genau einen Pfad vom Startknoten zu v gibt. Fur Baume kann man die Breitensuche und Tiefensuche sehr einfach rekursiv formulieren oder auch iterative Verfahren angeben, die die Verwaltung der noch nicht besuchten Knoten durch eine Schlange (rst in - rst out) im Falle der Breitensuche bzw. einen Stapel (last in - rst out) im Falle der Tiefensuche ubernehmen. Diese allgemeinen Graphsuchverfahren fur explizit gegebene Graphen lassen sich aber nicht benutzen, um die aus dem jeweils gegebenen Startzustand durch ein Produktionssystem gegebenen Zustandsgraphen nach einem Knoten zu durchsuchen, der eine mogliche Losung reprasentiert. Denn in aller Regel sind diese Graphen so gro, da ihre explizite Reprasentierung etwa durch eine Adjazenzliste unmoglich ist. Das gilt selbst fur den Fall, da man von vornherein wei, da die Anzahl der Knoten insgesamt endlich ist. Man hat es also mit implizit gegebenen Problemgraphen zu tun. Die Knoten des Graphen entsprechen den Teilproblemen, als Grundoperation hat man die sog. Knotenexpansion, die zu einem Knoten alle Nachfolger dieses Knotens zu erzeugen erlaubt. Als Losung sucht man einen Pfad vom Startknoten, also dem Knoten, der das Ausgangsproblem reprasentiert, zu einem Zielknoten. Das kann z. B. in der Weise geschehen, da man fur jeden Knoten Ruckverweise auf den jeweiligen Vorganger dieses Knotens festhalt, wenn man durch die Grundoperation der Knotenexpansion die Nachfolger eines Knotens erzeugt. Wir mussen also, um Problemlosung als Suche in Graphen modellieren zu konnen, die ublichen Verfahren der Tiefen- und Breitensuche auf implizit gegebene Graphen ubertragen. U blicherweise verwendet man dazu zwei Listen: eine sogenannte OPEN-Liste noch zu untersuchender oder zu expandierender Knoten, und eine CLOSED-Liste bereits untersuchter, also expandierter Knoten. Die CLOSED-Liste enthalt am Ende die Losung des Problems. 9 3 Bestensuche in impliziten Graphen Wir denken uns nun einen impliziten Graphen gegeben durch einen Startknoten s sowie eine Expansionsfunktion expand(x), die zu einem Knoten x die Menge S (x) aller Nachfolger von x liefert. Ferner sei eine Zielbedingung gegeben, also eine boolesche Funktion goal(), die die Eigenschaft hat, da goal(x) gleich TRUE ist, genau dann wenn x ein Zielknoten ist. Wir wollen explizit zulassen, da derselbe Knoten unter Umstanden durch ganz verschiedene Expansionsfolgen aus dem Startknoten erzeugt werden kann. Um jedoch die Verfahren zum Durchsuchen implizit gegebener Graphen leichter beschreiben und programmtechnisch realisieren zu konnen, machen wir die Knoten eines implizit gegebenen Graphen dadurch kunstlich verschieden, da wir zu jedem aus dem Startknoten durch iterierte Anwendung der Expansionsfunktion erzeugten Knoten die Erzeugungshistorie, also die Folge aller auf dem Pfad zwischen dem Startknoten und dem gerade betrachteten Knoten liegenden und von der expand-Funktion erzeugten Knoten mitfuhren. Wenn wir also von einem Knoten x sprechen, meinen wir eigentlich einen vom Startknoten s zu x fuhrenden Pfad mit Endpunkt x und schreiben daher fur x auch (xpfad(x)). Diese Sichtweise fuhrt naturlich dazu, da der durch die expand-Funktion und den Startknoten implizit gegebene Graph als Baum mit unendlich vielen Knoten aufgefat werden kann. Wir illustrieren dies an einem kleinen Beispiel, das Bild 6 zeigt: zugehöriger Suchbaum expliziter Graph 1 2 4 3 5 (1,1) (4,14) (2,12) (2,142) (5,125) 6 impliziter Graph (5,1425) Startknoten: 1 expand: 1 2 {2,4} {5} 3 {5} 4 5 {2} {4,6} 6 (4,14254) (4,1254) (6,1256) (6,14256) {3} goal(x) = TRUE gdw. x = 6 Abbildung 6: Links der Graph, implizit und explizit gegeben rechts der aus dem Graph mittels expand resultierende Suchbaum 10 Jetzt konnen wir das Verfahren IGS zur impliziten Graphsuche formulieren. Es verwendet die Menge OPEN von noch zu bearbeitenden Knoten und die Menge CLOSED der bereits vollstandig verarbeiteten Knoten, wobei in beiden Fallen naturlich nicht nur Knoten sondern Paare bestehend aus Knoten und Erzeugungspfad vom Startknoten aus verwaltet werden. procedure IGS (s ) fImplizite Graphsuche g begin fs ist Startknoten g initialize (OPEN ) fOPEN = f(s,s)gg initialize (CLOSED ) fCLOSED = 0 g goalFound := FALSE while (notempty (OPEN ) and not goalFound ) do x := selectElement (OPEN ) if goal (x ) then goalFound := TRUE fpath (x ) ist Losungspfad g else S (x ) := expand (x ) changeList (x, S (x ), OPEN, CLOSED ) f(x, path (x )) wird aus OPEN entfernt und in CLOSED eingefugt alle Elemente aus S (x ) werden in OPEN aufgenommen g endif endwhile end procedure changeList (x, S (x ), OPEN, CLOSED ) begin insert ((x, path (x )), CLOSED ) delete ((x, path (x )), OPEN ) for each x 2 S (x) do path (x ) := (path (x ), x ) insert ((x ,path (x )), OPEN ) 0 0 0 0 0 endfor end In dieser Formulierung der impliziten Graphsuche bleibt oen, wie OPEN und CLOSED implementiert werden und nach welchem Kriterium man ein 11 Element aus OPEN mit selectElement auswahlt. Weil wir zu jedem Knoten x des impliziten Graphen den Erzeugungspfad mitfuhren, operiert die implizite Graphsuche auf einem Baum. Daher sind Breitensuche und Tiefensuche in diesem Rahmen sehr leicht realisierbar. Tiefensuche kann einfach dadurch realisiert werden, da man OPEN als Stapel implementiert, also insert als push-Operation, selectElement als topOperation und delete als pop-Operation fur Stapel. Man beachte aber, da auch fur den Fall, da der zu einem implizit gegebenen Graphen gehorende explizite Graph endlich ist, die so implementierte Tiefensuche fur einen implizit gegebenen Graphen in einen unendlichen Pfad laufen kann ohne einen Zielknoten zu nden. Wenn man wei, da der explizite Graph endlich ist, kann man das dadurch verhindern, da man eine Tiefenschranke db vorgibt und die Bedingung goal(x) in der Prozedur IGS ersetzt durch die Bedingung (goal(x) OR Lange von pfad(x) db). Das heit, man bricht die Suche ab, sobald man einen Knoten erreicht hat, dessen Erzeugungspfad eine Lange hat, die db uberschreitet. Im Falle endlicher Graphen genugt es naturlich, db als Anzahl der Knoten des endlichen Graphen zu wahlen. Die Breitensuche lat sich in dem durch IGS vorgegebenen Rahmen leicht dadurch realisieren, da man OPEN als Schlange implementiert. Oenbar wird der implizit gegebene Graph im Verlaufe des Verfahrens IGS durch wiederholte Aufrufe der expand-Funktion immer weiter als Suchbaum mit kunstlich verschieden gemachten Knoten erzeugt. Dabei werden allerdings Duplikate nicht vermieden. Wir nennen (upfad(u)) und (vpfad(v)) Duplikate, wenn u gleich v ist. Also werden zwei durch Mitfuhren ihres Erzeugungspfads kunstlich verschieden gemachte Knoten als Duplikate aufgefat, wenn ihre Endknoten ubereinstimmen. Will man das naturlich oensichtlich unnotige erneute Expandieren solcher Knoten vermeiden, mu man die Prozedur changeList abandern, so da Duplikate vermieden werden. procedure changeList (x, S (x ), OPEN, CLOSED ) begin delete ((x, path (x )), OPEN ) insert ((x, path (x )), CLOSED ) fS (x ) = expand (x ) g 12 x 2 S (x) do path (x ) := (path (x ), x ) fprufe, ob Duplikat von x in OPEN g dup (x ) := search (x , OPEN ) if dup (x ) 6= NIL for each 0 0 0 0 0 0 0 fFall1 g then fbehalte \billigeren" Knoten g endif fprufe, ob Duplikat von x in CLOSED g 0 dup (x ) := search (x , CLOSED ) if dup (x ) 6= NIL then freopen x , falls notig g endif if fDuplikat von x weder in OPEN noch in CLOSED g then insert ((x , path (x )), OPEN ) endif 0 0 0 fFall2 g fFall3 g 0 0 0 0 endfor end Um uberhaupt von einem billigeren bzw. teueren Knoten sprechen zu konnen, setzen wir ab jetzt voraus, da durch eine Funktion kosten jedem Knoten (x pfad(x)) (o. E. positive reellwertige) Kosten kosten((xpfad(x)) zugeordnet werden. Fall 1: Duplikat von x in OPEN 0 fbehalte \billigeren" Knoten g if kosten((x , path (x ))) < kosten((dup (x ),path (dup (x )))) 0 0 0 then delete ((dup (x ), path (dup (x ))), OPEN ) insert ((x , path (x )), OPEN ) 0 0 0 0 endif Fall 2: Duplikat von x in CLOSED 0 freopen x , falls notig g 0 13 0 if kosten((x , path (x ))) < kosten((dup (x ),path (dup (x )))) then fx billiger erzeugt als dup (x )g delete ((dup (x ), path (dup (x ))), CLOSED ) insert ((x , path (x )), OPEN ) 0 0 0 0 0 0 0 0 0 0 endif Weil bei der Prozedur changeList zur Vermeidung von Duplikaten von zwei Knoten x und dessen Duplikat x (Bez. dup(x )), fur die pfad(x ) 6= pfad(dup(x )) ist, nur einer der beiden Knoten (namlich der billigere) in OPEN aufgenommen wird, sind samtliche Knoten in OPEN duplikatsverschieden (im Sinne von: paarweise nicht Duplikate). Weil auch kein Knoten in OPEN aufgenommen wird, der ein Duplikat in CLOSED besitzt, und nur Knoten, die vorher in OPEN waren, nach CLOSED kommen, mussen sogar auch alle Knoten in CLOSEDOPEN duplikatsverschieden sein. IGS ist trivialerweise in folgendem Sinne korrekt: Gibt es uberhaupt einen Knoten x, der durch endlich viele Expansionen aus dem Startknoten erzeugt werden kann und halt IGS nach endlich vielen Schritten mit Knoten x, weil goal(x) TRUE geworden ist, so ist pfad(x) Losungspfad. Mehr lat sich aber uber IGS i. a. nicht sagen, d. h. man wei i. a. weder, ob IGS uberhaupt halt noch irgend etwas uber die \Qualitat" der gefundenen Losung, falls IGS halt. Schon bei der Elimination von Duplikaten haben wir jedoch unterstellt, da man von zwei doppelt auftretenden Knoten nicht einen beliebigen, sondern nur den \billigeren" weiter betrachtet. Wir haben also eine Kostenfunktion zur Auswahl zwischen einem Knoten und seinem Duplikat herangezogen. Das diente zunachst nur dazu, uberhaupt ein Entscheidungskriterium zu haben, nach dem die Auswahl zu treen ist. Irgendwelche Ruckschlusse auf die Qualitat der gefundenen Losung lassen sich aber ohne weitere Annahmen uber die Kostenfunktion nicht machen. Vor allem die Auswahlstrategie des jeweils nachsten zu expandierenden Knotens, d. h. die Funktion selectElement hat erheblichen Einu, nicht nur auf die Reihenfolge, in der die Knoten des impliziten Graphen erzeugt und gepruft werden. Je nach Wahl der Kostenfunktion und ihrer Berucksichtigung bei der Auswahl kann man u. U. auch Ruckschlusse auf die Qualitat einer gefundenen Losung, d. h. eines Zielknotens und des Pfades von der Wurzel zum Zielknoten, machen. 0 0 0 14 0 0 Wir beschranken uns zunachst auf den Fall der impliziten Graphsuche IGS ohne Elimination von Duplikaten und stellen an die selectElement-Funktion die folgenden Forderung: Forderung 1: selectElement(OPEN ) liefert stets Knoten mit minimalen Kosten, d. h. ist x = selectElement(OPEN), so gilt fur alle Elemente (upfad(u)) 2 OPEN: kosten((xpfad(x))) kosten((upfad(u))). Damit folgt ohne weitere Annahmen uber die Konstenfunktion sofort: Fakt 1: Wenn IGS mit Zielknoten g halt, gibt es in OPEN keinen Knoten ((xpfad(x)) mit kosten((xpfad(x))) <kosten((gpfad(g ))). Das schliet selbstverstandlich nicht aus, da man durch weitere Expansionen von Knoten aus OPEN nicht schlielich doch noch auf Knoten stoen kann, die echt geringere Kosten haben als der durch IGS zuerst gefundene Knoten. Wir nennen einen Zielknoten g, also einen Knoten g mit goal(g) = TRUE , optimal, wenn kosten((g goal(g ))) minimalen Wert unter allen Zielknoten hat, also fur alle g mit goal(g ) = TRUE gilt: 0 0 kosten((gpfad(g ))) kosten((g pfad(g ))). 0 0 Ist g optimaler Zielknoten, so heit pfad(g) optimaler Zielpfad. Um auf die Optimalitat einer von IGS gefundenen Losung zu schlieen, konnen wir naturlich sehr starke Forderungen an die Kostenfunktion stellen, wie z. B. die folgende Forderung (), die besagt, da die Kosten mit jeder Knotenexpansion echt zunnehmen. Forderung (): Fur alle Knoten x x 2 S (x) gilt: 0 kosten((xpfad(x))) <kosten((x pfad(x ))). 0 15 0 Forderung () impliziert oensichtlich: Halt IGS mit dem gefundenen Zielknoten (gpfad(g)), dann kann die weitere Expansion von Knoten die noch in OPEN sind, zu keinen Zielknoten mehr mit geringeren Kosten fuhren. Um auf die Optimalitat von g zu schlieen, bleibt noch zu zeigen, da man den optimalen Pfad nicht \verloren" hat. Es genugt zu zeigen, da vor dem Halt von IGS immer ein Knoten auf einem optimalen Pfad in OPEN war. Das zeigen wir mit dem folgenden Lemma, das fur den Fall von IGS ohne Duplikatselimination ohne weitere Annahmen uber die Kostenfunktion bewiesen werden kann. Lemma 1 Wenn es uberhaupt einen Zielknoten gibt, so gilt: Beim Eintritt in den Rumpf der while-Schleife von IGS, also vor Ausfuhrung von x = selectElement(OPEN) enthalt OPEN stets einen Knoten v, der auf einem optimalen Zielpfad liegt. Beweis: Oenbar gilt Lemma 1 beim ersten Eintritt in den Rumpf der while-Schleife, weil OPEN anfangs den Startknoten s enthalt, der auf jedem Pfad zu einem Zielknoten liegt. Wir uberlegen uns jetzt, da die Behauptung des Lemmas bei einmaliger Ausfuhrung des Rumpfes der while-Schleife richtig bleibt. Sei also v ein Knoten in OPEN auf einem optimalen Zielpfad. Bei Ausfuhrung des Rumpfes der while-Schleife von IGS wird zunachst ein Element aus OPEN mit selectElement gewahlt. Fall 1 v wird nicht gewahlt] Dann ist nichts zu zeigen. Denn v ist nach Ausfuhrung des Rumpfes der while-Schleife immer noch in OPEN. Fall 2 v wird gewahlt] Wenn v nicht schon Zielknoten ist, wird expand(v) aufgerufen und damit insbesondere auch ein Nachfolger von v auf einem optimalen Zielpfad generiert und in OPEN aufgenommen. (v selbst wird von OPEN nach CLOSED gebracht). Damit gilt die Behauptung des Lemmas wieder. 2 Ein Beispiel einer Kostenfunktion, die die Forderung () erfullt, ist die Pfadlange, d. h. die Anzahl der Expansionen, die zur Erzeugung eines Knotens gefuhrt hat. Im diesem Falle wird IGS zur Breitensuche! Um auf die Qualitat einer durch IGS gefundenen Losung schlieen zu konnen, genugen aber schon viel schwachere Forderungen an die Kostenfunktion. Bevor wir solche Forderungen an die Kostenfunktion angeben, zeigen 16 wir zunachst ein Pendant zu Lemma 1 fur den Fall von IGS mit Duplikatselimination. Hier konnen wir nicht so wie im Beweis von Lemma 1 schlieen, weil u. U. nicht alle Nachfolger eines Knotens v auf einem optimalen Zielpfad in OPEN aufgenommen wurden. Ist namlich x Nachfolger von v, also x 2 S (v) und enthalt OPEN ein Duplikat von x , so wird x nur dann in OPEN aufgenommen, wenn (x pfad(x )) der \billigere" der beiden Knoten (x pfad(x )) und (dup(x )pfad(dup(x )) ist. Sonst wird nichts getan, also kein weiterer Nachfolger von (x pfad(x )) mehr generiert. Anstelle der Behauptung von Lemma 1 beweisen wir jetzt eine etwas starkere Behauptung, zu deren Nachweis wir aber eine zusatzliche Forderung an die Kostenfunktion stellen mussen. 0 0 0 0 0 0 0 0 0 0 0 0 Forderung 2: Seien P Q zwei Pfade mit gleichen Endknoten, und kosten(P ) kosten(Q). Dann folgt fur alle Fortsetzungen R mit (P R) bzw. (Q R) sind Zielpfade: kosten((P R)) kosten((Q R)): Wir wollen an dieser Stelle noch eine direkte Folgerung aus Forderung 2 ziehen, die wir im Beweis des folgenden Lemmas benotigen. Bemerkung 1: Sei Forderung 2 erfullt und seien P Q zwei Pfade wie in Forderung 2 angegeben. Dann gilt: Ist R bzw. R eine Fortsetzung minimaler Lange von Q bzw. P zu einem (optimalen) Zielpfad, so ist 0 lange(R ) lange(R). 0 Das folgt naturlich unmittelbar daraus, da wegen Forderung 2 R auch eine Fortsetzung von P zu einem (optimalen) Zielpfad ist. Sei R eine Fortsetzung minimaler Lange von P zu einem (optimalen) Zielpfad, so denieren wir den Abstand d des Endknotens x von P , durch d((x P )) =lange(R). Die Bemerkung besagt dann anschaulich, da der \billigere" von zwei Duplikaten einen geringeren Abstand zum Ziel hat. Diese Abstandsfunktion ist etwas allgemeiner als ublich deniert und hat als Argument ein Paar bestehend 17 aus einem Knoten und dessen Generierungspfad. Das erlaubt den Abstand auch fur Zielpfade, die Zyklen enthalten, zu denieren. Das folgende Lemma gilt auch dann, wenn Pfade, insbesondere der optimale Zielpfad, Zyklen enthalten. Lemma 2 Wenn es uberhaupt einen Zielknoten gibt, so gilt: Beim Eintritt in den Rumpf der while-Schleife von IGS, also vor Ausfuhrung von x = selectElement(OPEN) gilt: (a) OPEN enthalt einen Knoten v, der auf einem optimalen Zielpfad liegt, und (b) Fur jeden Knoten y 2 CLOSED gilt: Liegt y auf optimalem Zielpfad P und P = (P1 P2 ), P1 generiert y, so existiert ein Knoten y 2 OPEN, der ebenfalls auf einem optimalen Zielpfad P liegt, mit P = (P1 P2 ), mit P1 generiert z und lange(P2) >lange(P2). Die Behauptung des Lemmas veranschaulicht Bild 7. 0 0 0 0 0 0 s p1 p’1 y CLOSED z p2 p’2 g Abbildung 7: Hier fehlt die Bildunterschrift Beweis: Oenbar gilt Lemma 1 beim ersten Eintritt in den Rumpf der while-Schleife, da OPEN anfangs den Startknoten s enthalt, der auf jedem Zielpfad liegt, und da anfangs CLOSED leer ist. Nehmen wir jetzt an, da die Bedingungen (a) und (b) gelten. Bei Ausfuhrung des Rumpfes der while-Schleife von IGS wird zunachst ein Element x aus OPEN gewahlt. Nehmen wir an, da x kein Zielknoten ist, also 18 der else-Teil im Rumpf der while-Schleife ausgefuhrt wird (sonst ist nichts zu zeigen). Dann wird auf jeden Fall (xpfad(x)) aus OPEN entfernt und in CLOSED eingefugt. Fall 1 x liegt nicht auf optimalem Zielpfad, d. h. pfad(x) ist nicht Anfangsstuck eine optimalen Zielpfades, der uber x geht] Dann beruhrt die Entfernung von x aus OPEN Bedingung (a) und (b) nicht. Wir mussen uns nur noch uberlegen, da auch durch die Aufnahme eine Nachfolgers (x pfad(x )) mit x 2 S (x) in OPEN oder dadurch, da ggf. ein Duplikat eines solchen Knotens aus OPEN oder CLOSED verdrangt wird, die Bedingungen (a) und (b) richtig bleiben. Dazu betrachten wir die 3 Falle der Duplikatseliminierung getrennt. 0 0 0 Fall 1.1 x 2 S (x) und (x pfad(x )) hat Duplikat in OPEN]. 0 0 0 In diesem Fall wird (x pfad(x )) nur dann in OPEN aufgenommen, wenn (x pfad(x )) echt billiger ist als (dup(x )pfad(dup(x ))) dann wird das Duplikat aus OPEN entfernt. Nur fur den Fall, da (x pfad(x )) einen (teueren) Knoten aus OPEN verdrangt, mu man zeigen, da die Bedingungen (a) und (b) richtig bleiben. Dazu genugt es aber, zu bemerken, da wegen Forderung 2 1. der billigere Knoten (x pfad(x )) erst recht auf einem optimalen Zielpfad liegt, wenn das fur (dup(x )pfad(dup(x ))) galt und da 2. der Abstand von x kleiner gleich dem Abstand von dup(x ) zum Ziel ist (wegen Bemerkung 1). 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Fall 1.2 x 2 S (x) und (x pfad(x )) hat Duplikat in CLOSED] 0 0 0 Weil in diesem Fall kein Knoten aus OPEN entfernt wird, bleiben Bed. (a) und (b) trivialerweise richtig. Fall 1.3 x hat kein Duplikat in OPEN oder CLOSED] 0 Auch in diesem Fall werden Bed. (a) und (b) durch die Aufnahme von x in OPEN nicht beruhrt. 0 19 Fall 2 x liegt auf optimalem Zielpfad] Dann kann die Entfernung von x aus OPEN sehr wohl die Bed. (a) und (b) beruhren. Jedenfalls wird auch ein Knoten x 2 S (x) erzeugt, der auf einem optimalen Zielpfad (uber x) liegt und minimale Distanz zum Ziel hat (fur die anderen Knoten aus S (x) zeigt man wie im Fall 1, da ihre Aufnahme in OPEN und ggf. Verdrangung von Knoten aus OPEN oder CLOSED die Bed. (a), (b) nicht beeinussen). 0 Fall 2.1 Wenn (x pfad(x )) in OPEN aufgenommen wird, gilt trivialerweise Bed. (a). Bed. (b) gilt ebenfalls, weil wir vorausgesetzt haben, da der Abstand des Nachfolgers x minimal ist unter den Nachfolgern von x auf einem optimalen Zielpfad zum Ziel, und damit der Abstand von x um eins kurzer ist als der Abstand von x zum Ziel. 0 0 0 0 Fall 2.2 Also mussen wir uns nur noch uberlegen, da Bedingung (a) und (b) auch dann richtig bleiben, wenn (x pfad(x )) nicht in OPEN aufgenommen wird. Das kann zwei Grunde haben: OPEN oder CLOSED enthalt schon ein Duplikat von x , dessen Kosten die von (x pfad(x )) nicht uberschreiten. 0 0 0 0 0 Fall 2.2.1 (dup(x )pfad(dup(x ))) 2 OPEN und kosten((dup(x ))pfad(dup(x ))) kosten(x pfad(x )))] 0 0 0 0 0 0 Dann mu auch ((dup(x )pfad(dup(x))) wegen Forderung 2 auf optimalem Zielpfad liegen und wegen Bemerkung 1 ist der Abstand von x zum Ziel grosser oder gleich als der von dup(x ) zum Ziel. War x der zu einem Knoten y 2 CLOSED gehorende Knoten aus OPEN gem. Bed. (b), so gilt (b) jetzt mit dup(x ) statt x. 0 0 0 0 Fall 2.2.2 (dup(x )pfad(dup(x ))) 2 CLOSED und kosten((dup(x )pfad(dup(x ))) kosten((x pfad(x ))] 0 0 0 0 0 0 Auch in diesem Fall wird (x pfad(x )) nicht in OPEN aufgenommen, aber 0 0 20 (dup(x )pfad(dup(x )) mu wegen Forderung 2 auf optimalem Zielpfad liegen. Sei also ((dup(x )pfad(dup(x ))) 2 CLOSED Weil Bed. (b) fur dup(x ) gilt, gibt es zu dup(x ) einen Knoten z in OPEN auf optimalem Zielpfad, dessen Abstand zum Ziel kleiner ist als der von dup(x ) (siehe Bild 8). 0 0 0 0 0 0 0 s OPEN y dup(x’) CLOSED x OPEN x’ g Abbildung 8: Hier fehlt die Bildunterschrift Es folgt nun, da z 6= x ist, weil der Abstand von x zum Ziel grosser ist als der von x bzw. dup(x ) und damit auch der Abstand von x groer als der von z. Daraus folgt sofort die Bed. (a). Bleibt Bed. (b) zu zeigen. Sei also y 2 CLOSED ein beliebiger Knoten auf einem optimalen Zielpfad. Zu allen y = 6 x gibt es einen gem. Bed. (b) gehorenden Knoten aus, namlich den oben konstruierten Knoten z. Also genugt es, die Bed. (b) fur den in diesem Schritt in CLOSED aufgenommenen Knoten x zu zeigen: Weil der Abstand von x zum Ziel grosser ist als der von z, konnen wir auch in diesem Fall z als einen gem. Bedingung (b) zu x gehorenden Knoten auassen. 2 0 0 Um zu sichern, da IGS mit und ohne Duplikatselimination stets mit einer optimalen Losung halt, wenn IGS uberhaupt halt, genugt es nun zu fordern: Forderung 3: Fur jeden Zielknoten g und jeden Knoten x aus pfad(g) gilt kosten(xpfad(x)) kosten(gpfad(g )). Dann konnen wir zeigen: 21 Satz 2 Wenn IGS uberhaupt nach endlich vielen Schritten halt, halt IGS mit optimalem Zielknoten. Beweis: Zum Beweis nehmen wir an, IGS (mit oder ohne Duplikatselimi- nation) halt mit Zielknoten g und g ist nicht optimal. Bevor IGS mit g halt, mu g mit selectElement gewahlt worden sein. Bevor das geschah, mu wegen Lemma 1 bzw. Lemma 2 (a) in OPEN wenigstens ein Knoten v auf einem optimalen Zielpfad zu einem optimalen Zielknoten g vorhanden gewesen sein. Wegen Forderung 3 mu gelten 0 kosten((vpfad(v ))) kosten(g pfad(g ))): 0 0 Weil g nach Annahme nicht optimal ist, folgt: kosten((vpfad(v)) <kosten((gpfad(g))): Dann hatte aber v und nicht g gewahlt werden mussen. Das ist ein Widerspruch und damit der Satz bewiesen. 2 Weil wir durch Mitfuhren der Erzeugungspfade impliziter Graphen alle Knoten kunstlich verschieden machen, ist klar, da OPEN unendlich viele verschiedene Knoten enthalten kann, obwohl die expand-Funktion nur endlich viele Knoten generiert, so kann IGS nicht halten, selbst dann, wenn es nur endlich viele "wesentlich verschiedene\ Knoten gibt. Wir nenenn einen impliziten Graphen endlich, wenn ausgehend vom Startknoten s nur endlich viele verschiedene Knoten durch iterierte Anwendung der expand-Funktion erzeugt werden. Bei den meisten impliziten Graphen, die Problemgraphen von Puzzles, wie dem 8-Puzzle, entsprechen, gibt es uberhaupt nur endlich viele verschiedene Problemzustande (oder zulassige Stellungen), so da klar ist, da diese Graphen alle endlich sind. Fur endliche implizite Graphen wollen wir nun zeigen: Lemma 3 IGS mit Duplikatselimination halt auf endlichen impliziten Gra- phen. 22 Beweis: Zum Beweis bemerken wir, da die expand-Funktion fur endlich implizite Graphen schlielich nur noch Knoten erzeugen kann, fur die Duplikate bereits in OPEN oder CLOSED vorkommen. Weil bei jedem Durchgang durch den Rumpf der while-Schleife von IGS wenigstens ein Knoten aus OPEN entfernt wird (und nach CLOSED wandert), genugt es, sich zu uberlegen, da ein Knoten, der bereits in CLOSED war, nicht beliebig oft wieder von CLOSED nach OPEN wandern kann. Ein Knoten wird ja durch IGS mit Duplikatselimination nur dann "wiedereronet\, wenn fur ein Duplikat ein "billigerer\ Erzeugungspfad entdeckt wurde. Also benotigt man zum Nachweis von Lemma 3 oenbar eine Forderung an die Kostenfunktion, die sichert, da man nicht "denselben\ Knoten immer kostenunstiger auf verschiedenen Pfaden erzeugen kann. Lemma 3 gilt damit, wenn wir fordern: Forderung 4: Fur jeden Knoten x gibt es hochstens endlich viel Duplikate y mit kosten((ypfad(y))) <kosten((xpfad(x))): 2 Wie man sieht, hangt die implizite Graph-Suche ganz entscheidend von der Wahl der Kostenfunktion und ihrer Eigenschaften ab. Eine wichtige Klasse von Suchverfahren, die Klasse der A -Algorithmen stellen wir in dem nachsten Abschnitt vor. 4 Steuerung der Suche durch Heuristiken: A-Verfahren Im letzten Kapitel haben wir einige erwunschte Eigenschaften an die Kostenfunktion und daraus resultierende Folgerungen kennengelernt. Es wurde gezeigt: Wenn mit selectElement immer ein bzgl. der Kostenfunktion minimales Element ausgewahlt wird (Forderung (1)), (was wir fur den gesamten Abschnitt voraussetzen wollen), und erfullt die Kostenfunktion die Forderungen (2) - (4), so ndet die implizite Graphensuche auf endlichen Problemgraphen immer einen im Sinne der Kostenfunktion minimalen Zielpfad. Die 23 bisher verlangten Forderungen sichern jedoch die tatsachliche Anwendbarkeit der impliziten Graphsuche nicht. Selbst fur endliche Graphen kann der Suchaufwand so gro werden, da sie zwar prinzipiell, aber nicht mehr in einer akzeptablen Zeit durchsucht werden konnen. Die Anwendbarkeit und E zienz der impliziten Graphsuche hangt entscheidend davon ab, ob sich mit Hilfe der Kostenfunktion die Suche in Richtung eines Zielknotens steuern lat und damit das Durchlaufen groer Teile des Suchbaumes vermieden werden kann. Das bedeutet anschaulich, da die Kostenfunktion den Knoten, die auf einem (optimalen) Pfad liegen, geringe Kosten zuordnet, und den (meisten) anderen Knoten, die nicht auf einem optimalen Zielpfad liegen, hohe Kosten. Gleich vorweg, diese Forderung an die Kostenfunktion lat sich nur durch die Einbeziehung domanenspezischen Wissens in Form einer Heuristik erfullen. Bisher blieb im unklaren, welcher Zusammenhang zwischen der Kostenfunktion der impliziten Graphsuche und der Lange bzw. der Gewichtsfunktion von Pfaden besteht. Im allgemeinen sucht man in einem Zustandsgraphen einen Zielpfad minimaler Lange bzw. mit minimalem Gewicht, oder zumindest einen Zielpfad, der einem \optimalen" Zielpfad moglichst nahe kommt. Eine mogliche Kostenfunktion sollte also so gewahlt sein, da ein Zielpfad mit minimalen Kosten ein Zielpfad minimaler Lange bzw. einer mit minimalem Gewicht ist. Eine Kostenfunktion, die die obige Eigenschaft besitzt und zudem die Forderungen (2) - (4) erfullt, haben wir bereits kennengelernt, namlich die Kostenfunktion, (a) (a ) 0 . kosten((xpfad(x))) =lange(pfad(x)) bzw. kosten((xpfad(x))) =Gewicht(pfad(x)) Zudem ist diese Kostenfunktion oensichtlich problemunabhangig deniert, d. h. sie lat sich auf jedes beliebige Suchproblem anwenden. Es stellt sich hier die Frage, ob diese Kostenfunktion fur ein konkretes Suchproblem, z. B. fur das 8-Puzzle, wirklich eine geschickte Wahl ist. Gerade die Tatsache, da diese Denition der Kostenfunktion kein problemspezisches Wissen beinhaltet, lat hier berechtigte Zweifel zu. Ist diese Kostenfunktion aber nicht geeignet, wie lassen sich dann bessere Funktionen nden, die zu einem geringeren Suchaufwand fuhren? Wir werden im folgenden einige Kostenfunktionen fur das 8-Puzzle konkret angeben, die in dem Sinn beweisbar besser 24 sind, da die Anwendung dieser Funktionen zu einer geringeren Anzahl von Knotenexpansionen fuhrt. Die Bestimmung eines optimalen Zielpfades setzt aber nicht voraus, da die Gleichung (a) bzw. (a ) fur alle Knoten (xpfad(x)) gultig ist. Oensichtlich genugt es, wenn () nur fur die Zielknoten gilt, d. h. wenn die Kostenfunktion die folgende Forderung erfullt. 0 Forderung 5: Fur jeden Zielknoten (gpfad(g)) gilt: (b) (b ) 0 kosten((gpfad(g ))) =lange(pfad(g)) bzw. kosten((gpfad(g ))) =Gewicht(pfad(g ) Die Forderung (5) lat fur die Bestimmung einer moglichen Kostenfunktion noch genugend Freiraum. Im folgenden zeigen wir, wie sich eine bessere Kostenfunktion nden lat. Mit der Generierung eines Knotens x und dessen Pfad pfad(x) kennen wir naturlich die tatsachlichen Kosten eines moglichen Zielpfades mit Anfangsstuck pfad(x) nicht. Die Idee besteht nun darin, das Gewicht eines solchen Zielpfades zu schatzen, und zwar durch die Summe des Gewichtes des bereits bekannten Teilpfades pfad(x) und den Kosten eines noch unbekannten Pfades, der pfad(x) zu einem Zielpfad fortsetzt. Eine solche Summe stellt naturlich eine scharfere Abschatzung dar, als allein das Gewicht des Pfades pfad(x) liefert. Das setzt voraus, da wir eine Funktion h kennen, die die Distanz eines Knotens x zu einem Zielknoten schatzt, d. h. die jedem Knoten x einen Wert h(x) zuordnet, der das Gewicht eines minimalen Zielpfades mit Startknoten x schatzt. Die Funktion h heit heuristische Funktion oder kurz Heuristik. Der Begri Heuristik ist dadurch motiviert, da keine exakten, sondern nur geschatzte Werte geliefert werden. Im \weiteren" Sinn versteht man jedes Verfahren oder jede Regel als Heuristik, mit deren Hilfe man sich einer exakten Losung eines Suchproblems annahern kann bzw. die E zienz der Suche nach einer exakten Losung verbessern kann. Wir wollen eine Heuristik immer in dem oben genannten \engeren" Sinn verstehen. Von einer guten Heuristik h wird man erwarten, da h(x) umso kleiner ist, je kleiner die Distanz von x zu einem Zielknoten ist, und da sich die Werte h(x) rasch berechnen lassen (d. h. viel rascher als die Bestimmung der exakten Werte mittels Suche erlauben wurde). 25 Es ist klar, da die Bestimmung einer solchen Funktion h die Einbeziehung domainenspezischen Wissens notig macht. Wie ndet man zu einem konkreten Suchproblem eine geeignete Heuristik? Auch wenn Versuche unternommen wurden Heuristiken algorithmisch, also automatisch, zu erzeugen, so setzt das Finden guter Heuristiken nach wie vor menschliche Intuition und Erndungsreichtum voraus. Generell geht man dabei so vor, da man das konkrete Suchproblem durch Weglassen von Restriktionen zu einem einfacheren Problemmodell kommt und in diesem nach einer Distanzfunktion sucht. Dieses Modell sollte einerseits so einfach sein, da sich eine Distanzfunktion bzw. eine Heuristik nden lat, andererseits immer noch wesentliche Aspekte des Ausgangsproblems wiederspiegelt. Eine im Modell gefundene Heuristik sollte auch fur das ursprungliche Problem brauchbar sein. Wir wollen das am Beispiel des 8-Puzzles veranschaulichen. 1 6 2 3 1 5 4 8 7 8 7 2 3 4 6 5 Abbildung 9: Gegebener Problemzustand und Zielzustand 1 6 2 3 1 5 4 8 7 8 7 2 3 4 6 5 Abbildung 10: Die Schra erte Felder sind nicht an der Zielposition. Also ist der Wert von h1 gleich 4. Betrachten wir den Problemzustand in Abbildung 9. Es ist klar, da wir fur jedes Feld, das nicht richtig positioniert ist, d. h. da nicht an der Zielposition steht, mindestens einen Zug benotigen, um es an die Zielposition zu bringen. Eine erste einfache Heuristik erhalten wir also durch die folgende Denition: 26 h1(x) = fAnzahl der Felder, die im Problemzustand x im Vergleich mit dem Zielzustand falsch angeordnet sindg h1 (x) ist eine untere Schranke fur die minimal Anzahl von Zugen, mit denen sich x in den Zielzustand uberfuhren lat. Denn fur jedes Feld, das noch nicht an der richtigen Position steht, benotigt man mindestens einen Zug, um es an die richtige Position zu bringen. Da das fur jeden Problemzustand x gilt, sagen wir, h1 ist optimistisch. Naturlich liefert h1 keine besonders gute Abschatzung. Wir haben in der Denition fur h1 namlich vollig ignoriert wie weit ein Feld von seiner Zielposition entfernt ist. Nehmen wir einmal an, wir konnten die Felder unabhangig voneinander verschieben, d. h. das Verschieben der Felder ware auch auf bereits belegte Positionen moglich. Dann ist klar, da wir fur das Verschieben des Feldes 8 an die Zielposition in Abbildung 11 mindestens 3 Schritte benotigen, da wir es zunachst zwei Schritte nach links und einen Schritt nach oben schieben mussen. Allgemeiner: Jedes Feld mu mindestens so viele Schritte zurucklegen, wie die Summe aus horizontalem und vertikalen Abstand des Feldes zu seiner Zielposition ist. Man spricht hier von der \Manhattan Distanz" eines Feldes. Die Summe aller dieser Feld-Distanzen liefert eine Heuristik h2, die ebenfalls optimistisch ist und die in der Literatur kurz als Manhattan Distanz bezeichnet wird. h2(x) = fSumme aller vertikalen und horizontalen Abstanden von allen Feldern im Problemzustand x zu ihren Position im Zielzustandg Erst in diesem vereinfachten Modell, das die Bewegung der Felder unabhangig voneinander erlaubt, konnten wir problemlos eine Distanzfunktion angeben, die auch fur das konkrete Problem noch eine brauchbare Heuristik liefert. In Wirklichkeit konnen die Felder nur in die Lucke gezogen werden. Es ist gar nicht so leicht zu sehen, wie sich diese Tatsache fur eine weitere Verbesserung der Heuristik auszunutzen lat. Betrachten wir dazu die Felder 6 und 7 in Abbildung 12. Beide sind in der richtigen Zeile, d. h. der vertikale Abstand zur Zielposition ist 0. Feld 7 steht in der Zielposition jedoch links von dem Feld 6. Um Feld 6 an 7 vorbeizuschieben oder umgekehrt, mu das Feld 6 oder das Feld 7 aus der \richtigen" Zeile hinaus und wieder herein geschoben werden. Das fuhrt zu zwei zusatzlichen Zugen, die nicht in der Manhattan-Distanz berucksichtigt werden. Diese U berlegung kann man 27 konsequenterweise fur jede Zeile und jede Spalte anstellen, was zu einer gegenuber der Manhattan-Distanz verbesserten Heuristik fuhrt. Kommen wir auf die Bestimmung einer Kostenfunktion zuruck, unter der Voraussetzung, da wir eine Heuristik h haben. Dann wird die Kostenfunktion durch die folgende Gleichung deniert: 1 6 2 3 1 5 4 8 7 8 7 2 3 4 6 5 Abbildung 11: Die Manhattan Distanz ergibt sich als Summe aus dem horizontalen und vertikalen Abstand zur Zielposition. Die Manhattan Distanz fur das Feld 8 ist 3. 1 6 2 3 1 5 4 8 7 8 7 2 3 4 6 5 Abbildung 12: Abhangigkeiten, die nicht durch die Manhattan-Distanz erfat werden () kosten((xpfad(x))) =Gewicht(pfad(x)) + h(x). Um Forderung (3) an die Kostenfunktion zu sichern, mu das Anfangsstuck eines Zielpfades geringere Kosten als der Zielpfad selbst besitzen. Das impliziert, das die heuristische Funktion h optimistisch ist, also die Distanz eines Knotens x zu einem Zielknoten unterschatzt. Daher fordern wir ab jetzt, da fur eine Heuristik h die folgende Forderung (6) erfullt ist. Forderung (6): Fur alle Zielpfade P mit Startknoten x gilt: h(x) Gewicht(P ). 28 Wir wollen nun nachweisen, da eine durch () denierte Kostenfunktion tatsachlich die Forderungen (2) - (4) erfullt. Lemma 4 Sei die Kostenfunktion kosten( ) wie in () deniert, und erfulle die Heuristik h die Forderung (6), dann erfullt die Kostenfunktion auch die Forderungen (2) - (4). Beweis: Forderung (2): Die Gewichtsfunktion ist additiv, d. h. das Gewicht eines Pfades (P Q) ist die Summe des Gewichtes der Pfade P und Q. Seien also P und Q zwei Pfade mit Endknoten x und kosten(P ) <kosten(Q). Weiterhin sei R eine Fortsetzung, so da (P R) bzw. (Q R) Zielpfade sind. Dann gilt: kosten(PR) = Gewicht(PR) =Gewicht(P )+Gewicht(R) < Gewicht(Q)+Gewicht(R) =Gewicht(QR) =kosten(QR): Forderung (3): Sei x ein Knoten und R eine Fortsetzung von pfad(x) zu einem Zielpfad pfad(g ). Dann folgt die Ungleichung kosten((xpfad(x))) = Gewicht(pfad(x)) + h(x) < Gewicht(pfad(x))+Gewicht(R) =Gewicht((gpfad(g))) aus der Additivitat der Gewichtsfunktion und der Tatsache, da h optimistisch ist. Forderung (4): Forderung (4) folgt noch nicht aus dem bereits gesagten. Man erhalt aber die Forderung (4) aus einer weiteren Forderung an die Gewichtsfunktion. Man fordert hier i. a. da das Gewicht jedes Pfades der Lange 1, also das Gewicht jeder Kante, groer als ein reeller Wert > 0 ist. Daraus folgt sofort, da ein Pfad der Lange n mindestens das Gewicht n besitzt. Gilt insbesondere da der Graph lokal endlich ist, d. h. jeder Knoten hochstens endlich viele direkte Nachfolger besitzt, so folgt weiter, da es nur endlich viele Pfade gibt mit einem Gewicht kleiner kosten((xpfad(x))). Damit kann es aber auch nur 29 endlich viele Duplikate y geben mit kosten((ypfad(y))) <kosten((xpfad(x))). 2 A hnlich wie wir schon den Begri der Heuristik in einem \engeren" Sinn eingefuhrt haben, wollen wir das auch fur die Klasse der heuristischen Suchverfahren tun. Unter den heuristischen Suchverfahren wollen wir die Klasse von Graphensuchverfahren verstehen, die fur die Bewertung und Auswahl der ggf. zu expandierenden Knoten eine Kosten- (bzw. Bewertungs-)funktion heranziehen, die von einer heuristischen Funktion h abhangen darf. Das vermutlich bekannteste heuristische Suchverfahren uberhaupt, ist der von Nielson erstmals 1978 vorgestellte A -Algorithmus. Genau genommen handelt es sich um eine Klasse von Algorithmen. Die Suchalgorithmen, die durch das obige Schema der impliziten Graphsuche (mit Duplikatselimination) beschrieben werden, unter Anwendung einer wie in () denierten Kostenfunktion und zudem die Forderungen (1) - (4) erfullen, bilden die Klasse der A -Algorithmen. Ein einzelner Algorithmus aus der Klasse der A -Algorithmen bestimmt man erst durch die Angabe einer Heuristik und damit durch eine Kostenfunktion und durch die Angabe einer Regel, die festlegt welcher von ggf. mehreren minimalen Elementen der OPEN-Liste ausgewahlt wird. Oft spricht man von \dem" A -Algorithmus, womit sowohl ein beliebiger Algorithmus der Klasse als auch die Klasse selbst gemeint sein kann. Es gibt mittlerweile sehr viele Varianten von dem ursprunglichen A Verfahren. Die meisten unterscheiden sich nur geringfugig voneinander. Einige charakteristische Merkmale des A -Verfahrens wollen wir noch erwahnen. So wahlt das A -Verfahren immer einen Knoten mit minimaler Bewertung fur die nachste Expansion aus. Die Klasse der A -Algorithmen gehort also zu den Bestensuchverfahren. Die Menge der generierbaren Knoten lat sich entsprechend der verwendeten Kostenfunktion kosten ordnen. Die Klasse der Besten-Suchverfahren wird von allen Graphensuchverfahren gebildet, die die Knoten in der Reihenfolge ihrer Ordnung expandieren. Charakteristisch fur das A -Verfahren, zumindest in seiner ursprunglichen Beschreibung, ist, da alle einmal generierten Knoten gespeichert werden. Das hat einen entscheidenden Nachteil. Namlich spatestens dann, wenn der Speicherplatz vollstandig belegt ist, mu das Verfahren abbrechen. Trotz Verwendung einer heuristischen Bewertungsfunktion wachsen die mit dem Durchlaufen eines impliziten Problemgraphen erzeugten Suchbaume i. d. R. 30 exponentiell mit der Suchtiefe. Damit wachst auch der Speicherplatzbedarf exponentiell, weshalb das A -Verfahren fur die meisten konkreten Suchprobleme ungeeignet ist. Naturlich hat dieses Handicap des A -Algorithmus zur Entwicklung vieler anderer geeigneteren Verfahren gefuhrt, von denen wir einige wenige im nachsten Abschnitt informell vorstellen wollen. 5 Varianten der heuristischen Suche 5.1 IDA -Algorithmus Sicher eines der wichtigsten heuristischen Suchverfahren ist der IDA Algorithmus. Sein Vorteil gegenuber dem A -Verfahren besteht in dem geringeren Speicherplatzbedarf und darin, da er sich sehr einfach implementieren lat. Wahrend die A -Suche mit einer Breitsuche vergleichbar ist, entspricht der IDA -Algorithmus einer iterierten Tiefensuche. Die Tiefensuche wurde oben bereits erwahnt und lat sich kurz durch die Formel \Suche zuerst in die Tiefe" charakterisieren. Die Tiefensuche wird an einem Knoten x abgebrochen, wenn x ein Terminalknoten ist, d. h. keine Nachfolger besitzt, oder wenn x eine Abbruchbedingung erfullt, i. a. wenn die Tiefe von x eine Tiefenschranke d ubersteigt. Ist die Tiefenschranke kleiner als die Losungstiefe, so wird die Losung nicht gefunden. Ist die Tiefenschranke jedoch groer als die Losungstiefe so wird zwar ein Zielpfad gefunden, aber unter Umstanden ein wesentlich groerer Suchbaum durchlaufen als fur das Finden eines Zielpfades notwendig gewesen ware. Hier bietet es sich an, die Tiefenschranke sukzzesiv zu erhohen, und fur jede neue Tiefenschranke erneut die Tiefensuche zu starten. Dieses Verfahren heit iterierte Tiefensuche. Der IDA -Algorithmus kombiniert das Prinzip der iterierten Tiefensuche mit dem der Anwendung einer heuristischen Bewertungsfunktion. Die Tiefensuche wird an einem Knoten x abgebrochen, wenn die Kosten kosten((xpfad(x))) einen Schwellwert ubersteigen. Dieser Schwellwert wird vor Beginn mit der ersten Iteration auf den Wert kosten((spfad(s))) (die Kosten des Startknotens) gesetzt und sukzessiv mit der Tiefensuche im aktuellen Iterationsschritt fur den folgenden Iterationsschrittes ermittelt. Der Schwellwert fur den nachsten Iterationsschritt erhalt man als das Minimum aller Kostenwerte von Knoten, die im aktuellen Iterationsschritt die Abbruchbedingung erfullt haben, d. h. deren Kosten den aktuellen Schwellwert ubersteigen. 31 Diese Abbruchbedingung garantiert zum einen, da in jedem Iterationsschritt mindestens ein weiterer Knoten expandiert wird, und zum anderen da mit dem ersten gefundenen Zielpfad ein optimaler Zielpfad gefunden wird. Der Vorteil dieses Verfahrens besteht in dem geringen Speicherplatzbedarf. Denn im Speicher mu nur der gerade aktuelle Suchpfad gespeichert werden (ggf. um Bruderknoten erganzt), was zu einem Speicherbedarf linear in der Suchtiefe fuhrt. Dieses Verfahren liee sich ahnlich formalisieren, wie wir das fur das A -Verfahren mittels der impliziten Graphsuche bereits getan haben. Die implizite Graphsuche mute dann um die Moglichkeit erweitert werden, Knoten wieder aus den OPEN und CLOSED Listen zu entfernen. Wir wollen das hier nicht weiter ausfuhren und uns mit dieser mehr informellen Beschreibung begnugen. Die Anzahl der Knotenexpansionen ist beim IDA -Verfahren (wesentlich) hoher als beim A -Verfahren. Denn mit jedem Iterationsschritt werden immer wieder von neuem die schon einmal expandierten Knoten erneut expandiert. Wesentlich fur die Komplexitat des Verfahrens ist die Anzahl der notwendigen Iterationsschritte. Im ungunstigsten Fall wird in einem Iterationsschritt nur ein weiterer Knoten expandiert, namlich der Knoten dessen Kosten im vorhergehenden Iterationsschritt den Schwellwert bestimmt hat. Da nur der aktuelle Suchpfad gespeichert wird, kann auch kein Duplikatstest auf bereits erzeugte Knoten vorgenommen werden. Dennoch ist das IDA -Verfahren fur viele konkrete Suchprobleme nach wie vor eines der e zientesten Verfahren. Der Grund liegt darin, da das IDA -Verfahren, wie die Tiefensuche, nur einen Stapel als Datenstrukturen benotigt und sich daher sehr e zient implementieren lat. 5.2 Bidirektionale Suchverfahren Allen bisher vorgestellten Verfahren ist gemeinsam, da sie vom Startknoten in Richtung Zielknoten suchen. Ausgehend vom Startzustand wird zu einem ausgewahlten Zustand dessen direkte Nachfolger bestimmt und auf diese Weise der Suchbaum ausgedehnt. Viele konkrete Probleme lassen auch die Suche in umgekehrter Richtung zu, insbesondere dann, wenn es nur einen Zielzustand gibt wie beim 8-Puzzle. Ausgehend vom Zielzustand werden zu einem Zustand alle direkten Vorganger bestimmt und in einem Suchbaum verwaltet. Wird nun die Suche gleichzeitig in beide Richtungen, also sowohl vorwarts in Richtung des Zielknotens als auch ruckwarts in Richtung des Startknotens 32 durchgefuhrt, spricht man von bidirektionaler Suche, im Gegensatz zur unidirektionalen Suche. Der Suchaufwand gemessen in der Anzahl notwendiger Knotenexpansionen kann durch die bidirektionale Suche erheblich reduziert werden. Eine Zielpfad hat man ja bereits dann gefunden, wenn beide Suchfronten aufeinander treen, d. h. wenn ein beiden Suchbaumen gemeinsamer Zustand erzeugt wird. Wachsen die Suchbaume exponentiell mit der Suchtiefe, so ist die Anzahl der erzeugten Knoten, bei zwei Suchbaumen mit der Hohe h wesentlich geringer als bei einem Suchbaum mit der Hohe 2h. In den experimetellen Studien war tatsachlich bei bidirektionalen Algorithmen erheblich geringer als bei den unidirektionalen Verfahren. Allerdings nur dann, wenn man sich mit dem ersten erzeugten Zielpfad oder mit einem annahernd optimalen Zielpfad zufrieden gibt. Fur den Nachweis der Optimalitat eines Zielpfades mu ein erheblicher zusatzlicher Suchaufwand betrieben werden, der den Vorteil gegenuber den unidirektionalen Verfahren fast wieder ganz aufhebt. 5.3 Suche unter beschranktem Speicherplatz Ein Algorithmus hat immer unter beschrankten Resourcen zu arbeiten, wie Speicher, Zeit, usw. Vorrangiges Ziel ist es daher, die vorhandenen Resourcen moglichst e zient zu nutzen. In der Praxis stehen Suchalgorithmen naturlich nur beschrankten Speicherkapazitaten zur Verfugung. Diese konnen zwar riesig sein, sind aber immer nur von fester Groe. Suchalgorithmen mussen also auch unter beschranktem Speicherplatz noch korrekt arbeiten. Das IDA -Verfahren hat einen sehr geringen Speicherbedarf und garantiert das Finden einer optimalen Losung. Allerdings kann IDA zusatzlich zur Verfugung stehenden Speicher nicht zu einer weiteren Reduktion der Anzahl der Knotenexpansionen und damit zu einer Reduktion der Laufzeit ausnutzen. Die Frage danach, wie vorhandene Speicherplatzresourcen am e zientesten ausgenutzt werden konnen, ist ein sehr aktuelles Forschungsgebiet. Gerade in jungster Zeit wurden hier viele Vorschlage dazu gemacht. Sobald der generierte Suchbaum die aktuelle Speicherplatzkapazitat ubersteigt, mu mindestens einer der Knoten aus dem Speicher wieder entfernt werden. Das Entfernen von Knoten fuhrt zu einigen Problemen, die von einem speicherplatzbeschranktem Algorithmus gelost werden mussen. Welcher bzw. welche Knoten sind wieder aus dem Speicher zu entfernen, wenn der zur Verfugung stehende Speicher vollstandig belegt ist? Was ist 33 hier eine geschickte Strategie? Man kann nicht ausschlieen, da nicht doch der (opimale) Zielpfad uber einen der entfernten Knoten geht, selbst dann, wenn dieser zum Zeitpunkt des Entfernens nicht so vielversprechend erschien. Um das Finden eines (optimalen) Zielpfades auch weiterhin garantieren zu konnen, mussen sich folglich die einmal entfernten Knoten auch wieder generieren lassen. Wie sind ggf. die Bewertungen bereits erzeugter und nun zu entfernender Knoten auf deren Vorganger hochzuziehen? Das Hochrechnen der Kostenwerte entfernter Knoten dient zweierlei: Zum einen liefern die Bewertungen zu entfernender Knoten i. a. eine bessere Abschatzung fur die Kosten eines Zielpfades als die noch im Speicher verbliebenen Vorganger. Diese verbesserte Abschatzung soll in irgendeiner Form gerettet werden. Zum anderen: Das Bestensuch-Paradigma ist ein auerst nutzliches Suchprinzip. Will man dieses Suchprinzip beibehalten, so mussen die auf die Vorganger hochgerechneten Kostenwerten auch weiterhin optimistisch bleiben. Beide Ziele lassen sich auch erreichen, sofern man nicht eine statische Kostenfunktion fur die Implizite Graphsuche fordert. Vielmehr wird man jetzt die Werte kosten((xpfad(x))) mit der erneuten Erzeugung von x und dem Entfernen von Nachfolgern von x dynamisch anpassen mussen. Wir wollen das nicht im Detail ausfuhren, sondern davon ausgehen, da die Kostenfunktion das leistet. Ebenso nehmen wir einmal an, da OPEN alle expandierbaren Knoten enthalt, d. h. alle Knoten von denen mindestens ein Nachfolger nicht explizit gespeichert ist. In OPEN konnen Knoten sein, die schon einmal expandiert worden sind, und von denen bereits wieder mindestens ein Nachfolgerknoten entfernt worden ist. Einer der bekanntesten speicherplatzbeschrankten Algorithmen, namlich SMA , lat sich wie folgt beschreiben. SMA expandiert solange einen weiteren Knoten aus OPEN bis der Zielpfad gefunden ist. Fur die nachste Expansion wird, wie bisher, immer ein Knoten aus OPEN ausgewahlt, der minimale Kosten hat, wobei bei gleichen Kosten zugunsten eines Knotens hoherer Tiefe entschieden wird. Ist der Speicher vollstandig belegt, so wird mit der Erzegung eines Knotens ein anderer Blattknoten des Suchbaumes wieder entfernt, und zwar der Blattknoten mit maximalen Kosten, wobei bei gleichen Kosten zugunsten eines Knotens geringerer Tiefe entschieden wird. Der Vorganger des entfernten Knotens wird, falls nicht schon in der OPEN-Liste vorhanden, wieder in die OPEN-Liste aufgenommen. 34 SMA nutzt den vorhandenen Speicher vollstandig und kann auch auch mehr Speicher zu einer weiteren Reduzierung der Anzahl der Knotenexpansionen nutzen. Dennoch erwies sich dieses Verfahren auf das 8-Puzzle bzw. 16-Puzzle angewendet inezienter als IDA . Der Grund liegt hier in dem riesigen Overhead, der aus der Verwaltung der benotigten Datenstrukturen resultiert, wie z. B. einer Vorrangwarteschlange fur die Menge der OPENKnoten und einer Vorrangwarteschlange fur die Menge der Blattknoten. 35