Heuristische Suche 1 Problemrepr asentation - BFH

Werbung
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
Herunterladen