PPT

Werbung
INT A – Vorlesung, Thema: Suche
Prof. Dr. Wolfram Conen
Inhalte:
- Repräsentation von Problemen
- Problemlösung durch Suche
V0.95
(c) W. Conen, FH GE
1
Künstliche Intelligenz (KI)

„KI: Teilgebiet der Informatik, welches versucht,
menschliche Vorgehensweisen der Problemlösung auf
Computern nachzubilden, um auf diesem Wege neue oder
effizientere Aufgabenlösungen zu erreichen“,
aus: Lämmel, Cleve: Künstliche Intelligenz, 2. Aufl. 2004,
Hanser Verlag
V0.95
(c) W. Conen, FH GE
2
Problem 1 – Missionare und Kannibalen


Drei Missionare und drei Kannibalen sind auf der selben Seite eines
Flusses. Es gibt auf dieser Seite auch ein Boot, das ein oder zwei Leute
aufnehmen kann.
Problem: Finden Sie nun einen Weg, alle so auf die andere Seite zu
bekommen, dass die Zahl der Kannibalen die Zahl der Missionare auf
irgendeiner Seite des Flusses niemals überschreitet (dann würden die
Missionare nämlich gefressen...)
V0.95
(c) W. Conen, FH GE
3
Wie löst man solch ein Problem?




Man „sucht“ nach einer Lösung
Aber zunächst mal muß man sich klar machen, WAS genau die Aufgabe ist

Man sucht nach einer günstigen Repäsentation des Problems

„Günstig“ ist sie, wenn man mit dieser Repräsentation „leicht“ eine
Lösung finden kann (für das „umformulierte“, repräsentierte Problem)

... und diese Lösung sich zurück übertragen lässt auf die
ursprüngliche Problemstellung – also das „tatsächliche“ Problem löst!

Und natürlich sollte die Repräsentation „beherrschbar“ sein, also
möglichst klein, verständlich („wartbar“), präzise, usw.
Dann beginnt die Suche nach einer Lösungsmethode.

Oft hat man bereits eine Methode im Hinterkopf und schaut, ob man
das Problem passend repräsentieren kann (z.B. Graph-basierte Suche,
Constraint Optimization, Genetic Algorithms, Neuronale Netze, sehen
sie, wenn sie mögen, in INT im Master)
Wenn man die Methode (ev. auch mehrere) ausgewählt hat, dann beginnt
die tatsächliche Suche nach einer Lösung, und zwar „auf“ der
gewählten Problemrepräsentation
V0.95
(c) W. Conen, FH GE
4
Kannibalen haben Hunger...








Repräsentation des „Zustandes“ als
Vektor (m,k,b)

m = Anzahl Missionare

k = Anzahl Kannibalen

b = Position des Bootes
Wir brauchen nur eine Seite des Flußes
darstellen, wir nehmen die linke Seite (b =
1)
Es gilt immer: Missionare rechts = 3-m,
Kannibalen rechts = 3-k
Ev. mögliche Folgezustände (naiv) zu
(m,k,1):

(m-1,k-1,0), (m-2,k,0), (m,k-2,0),(m1,k,0),(m,k-1,0)
Ev. mögliche Folgezustände (naiv) zu
(m,k,0):

(m+1,k+1,1), (m+2,k,1), (m,k+2,1),
(m+1,k,1),(m,k+1,1)
Startzustand: (3,3,1), Zielzustand: (0,0,0)
Suche nach eine Zustandsfolge vom Start
zum Ziel!
Problem: wir merken noch nicht, dass wir
ungültige Zustände verwenden...
V0.95
1m,1k im Boot
3,3,1
2,2,0
3,2,1
1m
1m,1k
2,1,0
1k
2,2,1
(c) W. Conen, FH GE
1m, 2k rechts...AUA!
5
Kannibalen haben Hunger...







Ungültige Zustände feststellen...z.B. durch
Aufzählen:

(2,3,1),(1,3,1),(1,2,1)

(2,1,0),(2,0,0),(1,0,0)

(1,0,1),(2,0,1),(2,1,1)

(2,3,0),(1,3,0),(1,2,0)
Möglicherweise sind nicht alle hiervon
erreichbar (überhaupt oder nur über gültige
Zustände)
Man könnte das auch abstrakt angeben:

(m,k,b) mit m < k Æ m > 0 oder k < m
Æ k < 3 ist ungültig
Zugfolgen sind nur legal, wenn sie nicht
über ungültige Zustände führen
Wenn wir eine Funktion haben, die zu
einem Zustnd die gültige Folgezustände
ausspuckt, dann können wir direkt die
Lösung finden!
Wenn wir eine haben, die nur alle
„möglichen“ Zustände ausspuckt, dann
müssen wir noch die Gültigkeit prüfen
Beides läßt sich als Graph visualisieren!
(nächste Folie)
V0.95
(c) W. Conen, FH GE
1m,1k im Boot
3,3,1
2,2,0
3,2,1
1m
1m,1k
2,1,0
1k
1m, 2k rechts...AUA!
2,2,1
6
Die Rettung der Missionare (1)
3,3,1
2,2,0
2,3,0
2,3,1
3,2,0
1,3,0
3,1,0
3,2,1
1,2,0
2,1,0
3,0,0
3,1,1
1,1,0
V0.95
(c) W. Conen, FH GE
7
Rettung der Missionare (2)
(3,1,1) ist der Vorgänger
1,1,0
2m, 2k rechts mit Boot
2,1,1
2,2,1
1,2,1
1,3,1
2,1,0
2,0,0
1,2,0
0,2,0
(gab‘s bereits)
0,3,1
0,1,0
0,2,1
1,1,1
2,1,1
1,2,1
(gab‘s bereits)
V0.95
(c) W. Conen, FH GE
8
Rettung der Missionare (3)
(0,1,0) ist Vorgänger
V0.95
0,2,1
1,1,1
0,0,0
1,0,0
(c) W. Conen, FH GE
9
Rettung...Kontrolle (1)


3,3,1
2,2,0
2,3,0
2,3,1
3,2,0
1,3,0
3,1,0

3,2,1

1,2,0
2,1,0
3,0,0

3,1,1

Gefundener Weg:
2 Kannibalen nach
rechts: (3,1,-,0,2,B)
oder 1M+1K nach
rechts: (2,2,-,1,1,B)
1 Kannibale zurück
oder 1M zurück, je
nach Wahl oben
(3,2,B,0,1,-)
2 K nach rechts:
(3,0,-,0,3,B)
1 K zurück:
(3,1,B,0,2,-)
2M nach rechts:
(1,1,-,2,2,B)
1,1,0
V0.95
(c) W. Conen, FH GE
10
Rettung...Kontrolle (2)
1,1,0


2,1,1
2,2,1
1,2,1
1,3,1


2,1,0
2,0,0
1,2,0
0,2,0

0,3,1

0,1,0
0,2,1
V0.95
1,1,1
2,1,1
(c) W. Conen, FH GE
Gefundener Weg:
1M+1K nach links:
(2,2,B,1,1,-)
2 M nach rechts:
(0,2,-,3,1,B)
1 K nach links:
(0,3,B,3,0,-)
2 K nach rechts:
(0,1,-,3,2,B)
1K nach links:
(0,2,B,3,1,-) oder
1M nach links:
(1,1,B,2,2,-)
1,2,1
11
Rettung...Kontrolle (3)

0,2,1
1,1,1
0,0,0
1,0,0

Gefundener Weg:
2K nach rechts
oder
1M+1K nach rechts:
(0,0,-,3,3,B)
Lösungen:
(1) 2K, 1K, 2K, 1K, 2M, 1M+1K, 2M, 1K, 2K, 1K, 2K
(2) 2K, 1K, 2K, 1K, 2M, 1M+1K, 2M, 1K, 2K, 1M, 1M+1K
(3) 1M+1K, 1M, 2K, 1K, 2M, 1M+1K, 2M, 1K, 2K, 1K, 2K
(4) 1M+1K, 1M, 2K, 1K, 2M, 1M+1K, 2M, 1K, 2K, 1M, 1M+1K
V0.95
(c) W. Conen, FH GE
12
Welche Probleme können auftreten?



Man findet keine „griffige“ Repräsentation, weil z.B.

Informationen fehlen oder „unscharf“ sind

Informationen unsicher/unglaubhaft sind
Man hat ein Problem vor sich, dass

im allgemeinen unlösbar ist (Halteproblem)

im allgemeinen „hart“ zu lösen ist (NP-komplett, EXP)
Man kennt keine sinnvolle Problemlösungsmethode für die gefundene
Repräsentation

Im Master werden Sie einige Methoden für verschiedene
Repräsentationen kennenlernen ...

... und wenn die richtige nicht dabei ist, dann können Sie mit ihrem
Wissen und ihrer Cleverness vielleicht einen (Er-)Finden!
V0.95
(c) W. Conen, FH GE
13
Suche...nochmal generell



Angenommen, sie wollen ein Problem lösen ...
... dann suchen sie also nach einer Lösung
Viele Probleme lassen sich als Graph-Probleme modellieren

manchmal ist das unmittelbar klar (MST, kürzeste Wege, TSP)

manchmal braucht man einen „abstrakten“ Umweg:

Das Problem spielt sich in einem bestimmten „Realwelt“Ausschnitt ab, den man durch eine Menge von „Dingen“ und
(regelhaften) Beziehungen zwischen diesen Dingen beschreiben
kann

Diese Dinge (und damit der Ausschnitt) befinden sich zu jedem
Betrachtungszeitpunkt in einem bestimmten Zustand

Modellieren kann man das z.B. durch Parameter/Variablen,
denen Wertebereiche zugeordnet sind und zwischen denen
Relationen bestehen.

Ein Zustand entspricht dann einer konkreten Belegung der
Parameter mit Werten
V0.95
(c) W. Conen, FH GE
14
Suche (Forts. Problemlösen als Suche)

Aus den Wertebereichen und Beziehungen/Regeln ergeben sich die
möglichen Zustände des Realweltausschnitts

Es steht eine Menge an Operatoren zur Verfügung, um einen
Zustand in einen Folgezustand zu überführen


Ein Problem sieht dann wie folgt aus:

Gesucht ist eine clevere Sequenz von Operatoranwendungen,
die uns von einem gegebenen Ausgangszustand in einen
gewünschten Zielzustand führt.

Regelmäßig wollen wir zudem eine besonders „gute“
Operatorsequenz finden (z.B. eine kostengünstige, wenn wir
Kosteninformationen zu den Operatoren haben)
HINWEIS: Wir nehmen zur Vereinfachung an, dass wir nur endliche
viele (mögliche) Zustände betrachten (der Zustandsübergangsgraph
als Repräsentation der jeweiligen Probleme ist also ENDLICH).
V0.95
(c) W. Conen, FH GE
15
Suche (Forts. Problemlösen als Suche)
o1
z1
o2
o3


z2
z5
z8
z3
z6
z9
z4
z7
z10
z11
Ausgangszustand z1, Zielzustand z11
Es gibt viele mögliche Pfade inkl. Sackgassen (z7,z8) und
unerreichbare Zustände (z10)
V0.95
(c) W. Conen, FH GE
16
Suche (Forts. Problemlösen als Suche)
o1
z1
o2
o3



z2
z5
z8
z3
z6
z9
z4
z7
z10
z11
Schauen wir uns noch eine der Sackgassen an
Um einen Weg zum Ziel zu finden, müssen wir einfach eine
Entscheidung für einen Operator zurücknehmen und ändern
Das nennt man „Backtracking“!
V0.95
(c) W. Conen, FH GE
17
Suche (Forts. Problemlösen als Suche)
o1
z2
z5
z8
z3
z6
z11
z9
z4
z7
z10
o2
z1
o3



z11
Es gibt viele verschiedene Wege in diesem Zustandsgraphen
(wieviele?), manche dieser Wege führen zum Ziel, andere nicht
Um garantieren zu können, dass wir das Ziel erreichen (oder sicher
sein können, dass es nicht erreichbar ist), müssen wir ggfs. alle von
z1 aus begehbaren Wege anschauen
Wie können wir das systematisch tun?
V0.95
(c) W. Conen, FH GE
18
Suche (Forts. Problemlösen als Suche)
o1
o2
z1
o3
z2
z5
z8
z8
z3
z4
z6
z9
z9
z7
z11
z9
z5
z8
z6
z9
z2
z5
z8
z3
z6
z10
Tiefensuche /
Depth First Search
z1
z4
z7
z9
z11
z11
z11
z8
z9
z11
z7
V0.95
(c) W. Conen, FH GE
19
Suche (Forts. Problemlösen als Suche)
1
2
o1
o2
z1
o3
z2
z5
1
4
3
2
z8
1
2
z3
z6
1
4
3
2
z9
1
4
3
2
z11
z7
z9
z5
z8
z6
z9
z2
z5
z8
z3
z6
1
2
z4
z10
Breitensuche /
Breadth First Search
z1
z8
z4
z7
z9
z11
z11
z11
z8
z9
z11
z7
V0.95
(c) W. Conen, FH GE
20
Tiefensuche für Zustandsbäume


Hilfsdatenstruktur: Knoten k im Zustandsgraph sind mit einem
Zustand beschriftet, erhältlich über k.zustand
Genereller Ablauf für Tiefensuche in einem Zustandsgraphen mit
Baumform:



Algorithm tiefensuche(Knoten start)

for each k 2 Kinder(start) do
 if k.zustand = zielzustand then

print „Ziel gefunden!“; return true;
 else if tiefensuche(k) then return true;

return false;
Liefert sicher eine Lösung, wenn es eine gibt (weil wir Zyklen verboten
haben)! Falls der Graph endlich ist, sonst nicht!
Achtung: Die Reihenfolge der Kinderbesuche ist nicht vorgeschrieben,
sie können frei wählen!
V0.95
(c) W. Conen, FH GE
21
Breitensuche für Zustandsbäume


Wir verwenden eine FIFO-Queue queue (also eine Liste, an die hinten angefügt und
vorne entnommen wird, FIFO steht für first-in-first-out)
Genereller Ablauf für Breitensuche in einem Zustandsgraphen mit Baumform:


Algorithm breitensuche(Knoten start)

queue.append(start);
// queue leer vor Beginn

while (not queue.empty()) do
 k à queue.deleteFirst();
// Knoten k besuchen
 if k.zustand = zielzustand then

print „Ziel gefunden!“; return true;
 for each c 2 Kinder(k) do // Knoten k expandieren

queue.append(c);

print „Kein Ziel gefunden!“; return false;
Anmerkung: Man kann auch vor dem Einstellen der Kinder prüfen, ob ein Zielzustand
erreicht ist. Wir können zeigen, dass das generell Speicher und Tests spart. Trotzdem
verwenden wir aus Gründen der Einheitlich (s. BestFirst) für die Aufgaben diese
Variante. Größenordnungsmäßig macht es keinen Unterschied...exponentiellen Zeitund Speicheraufwand erfordern beide Algorithmen in Best- und Worstcase (DFS nur
im Worst Case!)
V0.95
(c) W. Conen, FH GE
22
Breitensuche für Zustandsbäume





Liefert sicher eine Lösung, wenn es eine gibt!
Achtung: Die Reihenfolge der Kinderbesuche ist nicht vorgeschrieben,
sie können frei wählen!
Bisher haben wir Zustandsräume in Baumform betrachtet
Da funktionieren beide Verfahren gut: beide sind „komplett“, d.h. sie
finden einen Zielzustand, wenn er existiert und erreichbar ist
Wenn die maximale Tiefe des Baumes d ist und der „flachste“
Zielzustand sich auf der Ebene m befindet und wir einen
„gleichmäßigen“ Verzweigungsfaktor b unterstellen, dann

Tiefensuche: best-case O(m), worst-case O(bd), average case:
hängt von der Verteilung der Zielzustände über die Tiefen zwischen
m und d ab

Breitensuche: best-case = average case = worst-case O(bm), falls
eine Lösung vorhanden ist, sonst best-case = average case =
worst-case = O(bd)
V0.95
(c) W. Conen, FH GE
23
Suche für allgemeine Zustandsgraphen


Problem: ein Graph, der kein Baum ist, enthält einen Kreis, d.h. gleiche
Zustände können bei der Reise durch den Graphen mehrfach auftreten!
(s. Missionarsproblem)
Was passiert, wenn wir unsere Algorithmen auf einen Graphen mit Kreis
loslassen?

Die Tiefensuche läuft möglicherweise immer weiter „geradeaus“ und
kann sich in einer endlosen Schleife „aufhängen“

Wenn es eine Lösung gibt, findet die Tiefensuche sie dann nicht!

Wenn es keine Lösung gibt, merkt sie es nicht!

Die Breitensuche expandiert gleiche Knoten mehrfach

Kein „prinzipielles“ Problem, wenn es eine Lösung gibt – dann wird
diese auch gefunden (und zwar weiterhin die „flachste“) –
die Breitensuche ist also auch im „Wiederholungsfall“ komplett!

Wenn es allerdings keine Lösung gibt, dann merkt unser einfaches
Verfahren zur Breitensuche das nicht!
V0.95
(c) W. Conen, FH GE
24
Beispiel: Suche in Kreisen mit Tiefensuche
GE
Startzustand
OB
OB
E
GE
GE
MH
D
OB
E
E
DUI
GE
DUI
MH
D
E
Unendliche Zweige können in dem Baum
entstehen, der die Wege durch den Zustandsgraphen darstellt (also die Suche beschreibt)!
Zielzustand
V0.95
(c) W. Conen, FH GE
25
Suche


Kann man beide Verfahren noch „retten“?
Idee: wir können kontrollieren, ob es zu Zustandswiederholungen
kommt

Knoten markieren bzw. die durch sie repräsentierten Zustände in
einer globalen „CLOSED“-Liste registrieren und nur einmal
besuchen

Erweiterung der Algorithmen ist einfach:

besuchte Zustände werden in eine CLOSED-LISTE aufgenommen
 Suchkosten: linear zur Anzahl der Zustände in der Liste

mit einem Bitfeld und nummerierten (oder „gut“
gehashten) Zuständen kann man die (Zeit-)Kosten
konstant und den Speicher „erträglich“ halten (es sei
denn, es gäbe sehr viele Zustände)

Dann zwei Alternativen (zunächst nur für unsere Breitensuche
relevant)
1.
Nur Knoten in queue einstellen, die nicht in CLOSED sind
2.
Nur Knoten besuchen/expandieren, die nicht in CLOSED sind
V0.95
(c) W. Conen, FH GE
26
Suche

Übrigens kann das zweite Verfahren besser sein, wenn der Test
deutlich teurer ist, als ein Einstellen sein sollte...denken sie an
folgendes:

Nehmen Sie an, die Lösung auf Tiefe m wird dort als letzter
Knoten „angepackt“

Dann wurden vorher bereits bm-1 Knoten expandiert, also bm+1-b
Knoten in die queue gestellt und, bei Variante 1, auch getestet

Wenn Tests im Vergleich zum Einstellen teuer sind (wie in
unserem Fall), dann sollte man unnötige Tests vermeiden

In Variante 2 werden die Kinder von Knoten der Tiefe m zwar
eingestellt, aber nicht mehr getestet, das spart einen Zeitaufwand
von O(bm)*O(n)! (O(n) bei naiver Suche in CLOSED)

Allerdings kostet es mehr Speicher – und wenn man beim
Grundablauf die Kinder vor dem Einstellen auf die
Zieleigenschaft testen würde, sähe die Situation wieder anders
aus...uns interessiert aber wieder vorrangig die Größenordnung
des Aufwands, und die kennen wir bereits: exponentiell für
Speicher und Zeit!

Sie sollten beide Varianten beherrschen!
V0.95
(c) W. Conen, FH GE
27
Suche


Problem mit dem Markieren von Zuständen im Zustandsgraphen: der ist
häufig gar nicht explizit gegeben (und muß dann auch nicht explizit
repräsentiert werden), sondern wird nur durch einen Startzustand und
eine Zustandsübergangsfunktion beschrieben (vor allem empfehlenswert
bei unendlichen Zustandsräumen)
Schwerwiegender: Speichereffizienzüberlegungen!

es kann sehr viele (besuchte) Zustände geben, die muß man sich dann
ev. alle merken

in der Tiefensuche braucht man sonst nur alle Knoten entlang eines
Weges, also O(d)

bei der Breitensuche ohnehin jeweils komplette Ebenen, also max.
O(bm)

bei Tiefensuche kann man sich manchmal auch durch „einfache“
Abbruchkriterien behelfen, um unendliche Zweige zu vermeiden,
z.B. wenn man weiß, dass es nur max. C Zustände gibt (dann
macht man immer noch Arbeit ggfs. doppelt, aber man braucht
keine Liste)

Ähnliches geht auch mit Breitensuche. Wenn man sogar weiß, dass
eine Lösung existiert, dann kann man auch auf die Kontrolle von
Wiederholungen verzichten und ist dennoch komplett (macht aber
ggfs. mehr Aufwand, als erforderlich – abwägen: wie oft kommen
Wiederholungen vor?)
V0.95
(c) W. Conen, FH GE
28
Breitensuche für Zustandsgraphen


Vermeiden von Wiederholungen für die Variante 2:
Genereller Ablauf für Breitensuche in einem Zustandsgraphen (queue und closed zu
Beginn leer), es wird nur ein Ziel gefunden (um alle zu finden, schmeißen sie einfach
das „return true“ raus und geben nur false zurück, wenn sie gar keins finden, also
zählen sie die gefundenen Ziele am besten mit – so können sie natürlich auch die
normale Breitensuche modifizieren)

V0.95
Algorithm breitensuche(Knoten start)

queue.append(start);

while (not queue.empty()) do
 k à queue.deleteFirst();
// Knoten k besuchen
 if (not closed.in(k.zustand)) then
// Ist k in
closed?

if k.zustand = zielzustand then
print „Ziel gefunden!“; return true;
closed.append(k.zustand);
for each c 2 Kinder(k) do // Knoten k expandieren

queue.append(c);

print „Ziel nicht gefunden“; return false;
(c) W. Conen, FH GE
29
Beispiel: Suche mit Pfadkosten
OB
10
20 Startzustand
GE
DUI
13

15
12
MH
14

E

Wir wollen weiterhin von
Gelsenkirchen nach D‘dorf
Aber jetzt wollen wir nicht nur einen
Weg finden, sondern einen guten
Weg!
Genauer: einen Weg durch den
Zustandsgraphen mit minimalen
Kosten (also einen „kürzesten Weg“)
35
D
Zielzustand
V0.95
(c) W. Conen, FH GE
30
Suche mit Pfadkosten

Was können wir tun?

Weiterhin Tiefen- oder Breitensuche verwenden und dort einfach
nach allen Lösungen suchen (Lösungen „enumerieren“) und die
beste auswählen! (ggfs. sehr teuer)

wir können auch mit Tiefensuche nur nach einer Lösung suchen
und dann hoffen, dass es die richtige ist...

manchmal wissen wir auch, dass die flachste Lösung die beste ist,

z.B. wenn alle Schrittkosten konstant und positiv sind

oder gleichmässig und einheitlich mit der Entfernung vom
Startzustand zunehmen (dann geht die normale Breitensuche,
die nur die flachste Lösung findet)

Wenn wir Wiederholungen vermeiden wollen, dann geht das
nicht ohne „Nachdenken“

wir müssen uns die bisher besten Kosten zu den Zuständen
merken

und im Wiederholungsfall die Erkundung eines Zweigs stoppen,
wenn die neuen Kosten zum wiederholten Zustand nicht kleiner
sind
V0.95
(c) W. Conen, FH GE
31
Suche mit Pfadkosten

Und sonst?

Wir verwenden die Kosteninformationen, um nach und nach die
vielversprechendsten Wege zu erkunden (Russell/Norvig nennen
das „Uniform cost“-Suche, kein sehr passender Name)

Im Grunde ist das ein klassischer „Best-First“-Ansatz: der Knoten
mit den niedrigsten aufgelaufenen Kosten wird zuerst expandiert

Wenn man weiß, dass die Kosten mit der Entfernung vom
Startknoten nicht abnehmen, dann kann man mit der ersten
gefundenen Lösung aufhören – sie muß optimal sein!
V0.95
(c) W. Conen, FH GE
32
Suche mit Pfadkosten – Best-First

Uniform Cost Ablauf für Zustandsgraphen mit Vermeidung von Wiederholungen nach
Variante 2 (bei Uniform Cost kann auch Variante 1 lohnenswert sein, je nach
Probleminstanz)
Die Min-PQueue pqueue und die Closed List sind leer zu Beginn:




Algorithm bestFirst(Knoten start)

start.cost à 0; pqueue.insert(start); closed.append(start);

while (not pqueue.empty()) do
 k à pqueue.deleteMin();
// Knoten k besuchen
 if (not closed.in(k.zustand)) then
// Ist k in closed?

if k.zustand = zielzustand then
print „Ziel gefunden!“; return true;
closed.append(k.zustand);

for each c 2 Kinder(k) do // Knoten k expandieren
c.cost à k.cost + kante(k,c).cost;
pqueue.insert(c);
// Knoten c in PQueue ablegen
Der Wert der Knoten wird im Feld cost abgelegt.
Der Wert einer Kante wird ebenso abgelegt.
Ist fast genau Dijkstra, nur ein bisschen „blöder“, weil mehrfaches Einstellen statt
Update (kann zu spektakulär höherem Speicheraufwand führen!)
V0.95
(c) W. Conen, FH GE
33
Uniform-Cost-Ablauf
OB
10
Startzustand
20
GE
DUI
13
15
12
MH
14
35
D
V0.95
E
pqueue (und closed in Klammern dahinter):
GE/0
E/15, OB/20 (GE)
OB/20, MH/27, GE/30, D/50 (GE,E)
MH/27, GE/30, DUI/30, GE/40, D/50 (GE,E,OB)
GE/30, DUI/30, E/39, GE/40, DUI/40, D/50
(GE,E,OB,MH) GE in Closed!
DUI/30, E/39, GE/40, DUI/40, D/50 (GE,E,OB,MH)
E/39, GE/40, DUI/40, OB/40, MH/43, D/44, D/50
(GE,E,OB,MH,DUI) E,GE,DUI,OB, MH in Closed!
D/44, D/50, OB/50, MH/53 (GE,E,OB,MH,DUI)
D/44 gefunden!
(c) W. Conen, FH GE
34
Was geht noch „uninformiert“?




Simples „Greedy“:

Verwende von deinem Knoten aus jeweils den günstigsten nächsten
Schritt.
Wenn wir nicht auf Wiederholungen achten, kann das zu endlosem Pendeln
zwischen zwei Zuständen führen

Im Beispiel würde er sich zwischen E und MH einpendeln
Also achten wir auf Wiederholungen (von Zuständen)

Das gibt aber noch keine Garantie, dass wir auch einen Zielzustand
finden (wir enden ggfs. in einer Sackgasse, die auch erst entstanden
sein kann, weil wir die Nachbarn bereits besucht haben)

Im Beispiel würde er in OB hängen bleiben
Also verwenden wir Backtracking („Zurückspringen“) und führen eine
CLOSED-List bereits verwendeter Kanten!

Im Beispiel besuchen wir dann folgende Kanten (und damit die
Knoten): {GE,E}, {E,MH},{MH,DUI},{DUI,OB},Backtrack,{DUI,D}

Also finden wir in diesem Beispiel nicht die optimale Lösung (aber
immerhin, wir finden jetzt sicher eine Lösung – das kann auch mal die
Beste sein!)
V0.95
(c) W. Conen, FH GE
35
Was geht noch „uninformiert“?



Wir können auch noch mittels Tiefensuche (depth-first search oder
kurz: DFS) die Breitensuche simulieren (mit oder ohne Schrittkosten)

dann brauchen wir nicht auf Wiederholungen zu achten

und haben trotzdem ein vollständiges Verfahren für endliche
Zustandsräume
Das geht, indem wir ein Tiefenlimit einführen

Setze das Limit zu Beginn auf 0 (dann wird nur der Startzustand
angeschaut)

Erhöhe das Limit in jeder Runde um eins und beginne immer
wieder oben mit Tiefensuche, wiederhole das solange bis die erste
Lösung gefunden wurde
Dieses Verfahren nennt sich Iterative Deepening und ist für den Fall
ohne Schrittkosten die sinnvollste Wahl
V0.95
(c) W. Conen, FH GE
36
Iterative Deepening





Die Implementierung ist simpel: Wie der Algorithmus Tiefensuche,
aber mit Abbruch des Abstiegs, wenn das Tiefenlimit erreicht ist
(also einfach ein Limit vorgeben und beim Aufruf von Tiefensuche
einen Parameter Tiefe, der schrittweise erhöht wird, hinzufügen – bei
Erreichen des Limits nicht mehr expandieren!)
Das Verfahren ist besser, als DFS, weil es sich nicht in endlose
Zweige verlaufen kann
Im Vergleich zur Breitensuche wiederholt es zwar eine Menge, aber
es muss sich wesentlich weniger merken (linear zur Lösungstiefe) und
es expandiert vor allem die Knoten auf Tiefe m nicht mehr! (es wird ab
einer gewissen Tiefe dramatisch günstiger als Breitensuche)
Es findet allerdings die beste Lösung nur, wenn es die flachste ist (wie
Breitensuche).
Man kann das leicht zu einem optimalen Verfahren machen, wenn man
sich die Kosten der besten bisher gefundenen Lösung merkt:

Solange es auf der Limitebene noch Knoten mit niedrigeren Kosten
gibt, wird weiter iteriert ...

...und dabei Knoten nicht expandiert, wenn sie nicht günstiger als
die beste bisherige Lösung sind.
V0.95
(c) W. Conen, FH GE
37
Und was ist „informierte“ Suche?


Wenn wir zu den Zuständen z noch heuristische Informationen h
haben, die es uns erlauben, die Entfernung zum nächsten/besten
Zielknoten zu schätzen, also h(z)
Für einen gegebenen Knoten k mit Zustand k.zustand = z können wir die
bisherigen tatsächlichen Kosten des Wegs zu k, angegeben durch g(k) und
die noch zu erwartenden Kosten, h(k) = h(k.zustand) = h(z) addieren

Diese Summe f(k) = g(k)+h(k) verwenden wir dann als „Distanzwert“ in
unserer PQueue für den Best-First-Algorithmus von vorn

Dieses berühmte Verfahren nennt sich A* (Beispiel nächste Folie),
gesprochen „ä-star“
V0.95
(c) W. Conen, FH GE
38
A*-Ablauf (auf Wiederholungen wird nicht geachtet)
OB
10
Startzustand
20
GE
DUI
13
15 pqueue:
12
MH
14
35
D
V0.95
Heuristische Informationen:
h(GE) = 30, h(OB) = 24, h(DUI) = 14,
h(MH) = 16, h(E) = 20, h(D) = 0
E
GE/0+30
E/15+20, OB/20+24
MH/27+16,OB/20+24, D/50+0,GE/30+30
OB/20+24, D/50+0, DUI/40+14,E/39+20, GE/30+30
DUI/30+14,D/50+0, DUI/40+14,E/39+20, GE/30+30,
GE/40+30
D/44+0, D/50+0, DUI/40+14,E/39+20, MH/43+16,
GE/30+30, GE/40+30, MH/43+16 (fertig)
(c) W. Conen, FH GE
39
Informierte Suche mit A*





Wenn die verwendete Heuristik „admissible“ ist – das ist sie, wenn sie die
tatsächlichen Kosten unterschätzt, dann ist A* optimal für endliche
Zustandsräume (bei nicht-negativen Pfadkosten, wie wir generell
annehmen)
A* ist außerdem auch noch optimal effizient relativ zur Klasse der
Algortihmen, die einen solchen Suchbaum explorieren. Das Argument ist
einfach:

A* untersucht alle Knoten mit niedrigeren tatsächlichen Kosten, als der
optimale Zielknoten

wenn ein anderer Algo einen dieser Knoten ausläßt, dann kann er nicht
sicher sein, das Optimum gefunden zu haben

Manchmal kann ein anderer Algo „zufällig mal“ besser sein, aber nicht
immer! (A* expandiert auch Knoten mit dem gleichen Gewicht wie der
optimale Zielknoten, die muss man aber nicht unbedingt anschauen!)
Das Vermeiden von Wiederholungen spielt auch wieder eine Rolle für die
Effizienz (und die Vollständigkeit des Algo) – hier helfen konsistente
Heuristiken (sie erfüllen die Dreiecksungleichung und sind admissible)
Natürlich können wir auch h verwenden, um „greedy“ loszulaufen (diesmal
stürzen wir uns nicht „greedy“ auf Kanten, sondern auf Nachfolger) – mit
ähnlichen Problemen und Resultaten, wie oben
...und einiges mehr (Praktisch relevant: Speicherbeschränkte Varianten
von A*!)
V0.95
(c) W. Conen, FH GE
40
Und sonst noch?

Man kann auch noch anders modellieren – man verwendet nur komplette
Lösungen und versucht dann durch Operatoren von einer Lösung zur
nächsten zu gelangen



Kann z.B. beim TSP (Travelling Sales Person, Rundreiseproblem)
sinnvoll sein: Zustände sind dann komplette Rundtouren, man sucht
die beste.
Man kann auch „partielle“ oder ungültige „Lösungsvorschläge“ zulassen
und dann nach der besten gültigen Lösung in diesem erweiterten
Zustandsraum suchen
Und vieles mehr...wie wir z.T. noch sehen werden (aber vorwiegend leider
erst im Master)
V0.95
(c) W. Conen, FH GE
41
Literatur zur Suche in Zustandsräumen

Russell, Norvig: Artificial Intelligence – the Intelligent Agent
Approach, Prentice-Hall, 2nd Edition (unbedingt die zweite Auflage
verwenden mit einem aktuellen Printing), International Edition
(billiger als das amerikanisch/kanadische Original), 2003



V0.95
Russell ist Professor in Berkeley, eine der öffentlichen Top-Unis
(eine/die andere öffentliche Top-Uni in Informatik ist die UMICH in
Ann Arbor)
Norvig ist Director of Search Quality bei Google
Das Buch ist das „Standardwerk“ zu KI (=künstlicher Intelligenz),
es hat ein paar kleine Schwächen, z.B. wenn es um Optimierung
geht oder wenn man sehr präzise Details braucht, es gibt aber
einen exzellenten Überblick über viele Teilgebiete der KI (und fast
alles spannende gehört da „irgendwie“ zu...zumindest sehen das
die KI‘ler so...stimmt natürlich nicht so ganz, oder doch? ;-)
(c) W. Conen, FH GE
42
Herunterladen