(A) Anfang (A,B) (A,C) (A,D) (A,E) (A,C,D) (A,C,D,E) (A,C,D,E,B,A)

Heuristische Suche J. Eckerle, Th. Ottmann Institut fur Informatik Universitat Freiburg 27. September 1995 1 Problemreprasentation, Zustandsraume...
3 downloads 0 Views 279KB Size
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, schlie lich 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 aufgefa t 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 aufgefa t 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

Schlie lich 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 Gro e 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 Gro enordnung 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 aufgefa t 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 hei t, 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 la t 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 aufgefa t, 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 CLOSED OPEN 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 la t 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)))