GIN2 – Vorlesung, SS04 Prof. Dr. Wolfram Conen

Werbung
GIN2 – Vorlesung, SS04
Prof. Dr. Wolfram Conen
3.6.2004 (mit Korrekturen „hinten“ vom 15./16.6.,
Algos Best-First und Breitensuche, für Hinweis zu den
Fehlern Dank Jörg Schulze Topphoff, Kai Posdziech und
Dirk Rother (auf Uniform-Cost-Folie fehlte GE/40)
Inhalte heute:
- Hashing (s. Mitschrieb)
- Uninformierte Suche
- Informierte Suche
19.06.2004
(c) W. Conen, FH GE, GIN2
1
Suche
„
„
„
Angenommen, sie wollen ein Problem lösen ...
... dann suchen sie 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:
„
„
„
„
19.06.2004
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
(c) W. Conen, FH GE, GIN2
2
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:
‰
‰
19.06.2004
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)
(c) W. Conen, FH GE, GIN2
3
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)
19.06.2004
(c) W. Conen, FH GE, GIN2
4
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“!
19.06.2004
(c) W. Conen, FH GE, GIN2
5
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?
19.06.2004
(c) W. Conen, FH GE, GIN2
6
Suche (Forts. Problemlösen als Suche)
o1
z1
o2
o3
z2
z5
z8
z8
z3
z4
z6
z9
z9
z7
z11
z9
z5
z8
z6
z9
z2
z5
z8
z3
z6
z10
Tiefensuche
z1
z4
z7
z9
z11
z11
z11
z8
z9
z11
z7
19.06.2004
(c) W. Conen, FH GE, GIN2
7
Suche (Forts. Problemlösen als Suche)
1
2
o1
z1
o2
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
z1
z8
z4
z7
z9
z11
z11
z11
z8
z9
z11
z7
19.06.2004
(c) W. Conen, FH GE, GIN2
8
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 ∈ 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!
Achtung: Die Reihenfolge der Kinderbesuche ist nicht
vorgeschrieben, sie können frei wählen!
19.06.2004
(c) W. Conen, FH GE, GIN2
9
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 ∈ Kinder(k) do // Knoten k expandieren
ƒ queue.append(c);
„
19.06.2004
print „Kein Ziel gefunden!“; return false;
(c) W. Conen, FH GE, GIN2
10
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
‰
‰
19.06.2004
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(b^m), falls eine
Lösung vorhanden ist, sonst best-case = average case = worst-case
O(bd)
(c) W. Conen, FH GE, GIN2
11
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!
Was passiert, wenn wir unsere Algorithmen auf einen
Graphen mit Kreis loslassen?
‰
Die Tiefensuche läuft immer weiter „geradeaus“ und kann sich in
einer endlosen Schleife „aufhängen“
„
„
‰
Die Breitensuche expandiert gleiche Knoten mehrfach
„
„
19.06.2004
Wenn es eine Lösung gibt, findet die Tiefensuche sie dann nicht!
Wenn es keine Lösung gibt, merkt sie es nicht!
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!
(c) W. Conen, FH GE, GIN2
12
Beispiel: Suche in Kreisen mit Tiefensuche
GE
Startzustand
OB
OB
E
GE
GE
MH
D
OB
E
E
DUI
GE
DUI
MH
D
Zielzustand
19.06.2004
E
Unendliche Zweige können in dem Baum
entstehen, der die Wege durch den Zustandsgraphen darstellt (also die Suche beschreibt)!
(c) W. Conen, FH GE, GIN2
13
Suche
„
„
Kann man beide Verfahren noch „retten“?
Erste Idee: wir können kontrollieren, ob es zu
Zustandswiederholungen kommt
‰
‰
Knoten markieren bzw. in einer globalen
„CLOSED“-Liste registrieren und nur einmal
besuchen
Erweiterung der Algorithmen ist einfach:
„
19.06.2004
naiv: besuchte Knoten werden in eine CLOSED-LISTE
aufgenommen (Suchkosten: linear zur Anzahl der
Knoten in der Liste)
(c) W. Conen, FH GE, GIN2
14
Suche
„
„
„
CLOSED-Liste wird verwendet:
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
Übrigens ist das zweite Verfahren meist besser...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 werde die Kinder von Knoten der Tiefe m zwar
eingestellt, aber nicht mehr getestet, das spart einen Aufwand
von O(bm)*O(n)! (O(n) bei naiver Suche in CLOSED)
19.06.2004
(c) W. Conen, FH GE, GIN2
15
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
„
„
„
„
19.06.2004
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?)
(c) W. Conen, FH GE, GIN2
16
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)
‰ 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 ∈ Kinder(k) do // Knoten k expandieren
ƒ
queue.append(c);
„
print „Ziel nicht gefunden“; return false;
19.06.2004
(c) W. Conen, FH GE, GIN2
17
Beispiel: Suche mit Pfadkosten
OB
10
20 Startzustand
„
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“)
GE
DUI
13
15
12
MH
14
35
D
E
Zielzustand
19.06.2004
(c) W. Conen, FH GE, GIN2
18
Suche mit Pfadkosten
„
Was können wir tun?
‰
Weiterhin Tiefen- oder Breitensuche verwenden und dort einfach
nach allen Lösungen suchen und die beste auswählen! (ggfs.
sehr teuer)
„
„
‰
19.06.2004
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 nur
dort die Erkundung des Zweigs stoppen, wenn die neuen Kosten
dorthin nicht kleiner sind – sonst finden wir ev. nicht das
Optimum, weil wir manche Lösungen gar nicht erst finden.
(c) W. Conen, FH GE, GIN2
19
Suche mit Pfadkosten
„
Und sonst?
‰
‰
‰
19.06.2004
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ß, das diese Kosten mit der Entfernung vom
Startknoten nicht abnehmen, dann kann man mit der ersten
gefundenen Lösung aufhören – sie muß optimal sein!
(c) W. Conen, FH GE, GIN2
20
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 ∈ Kinder(k) do // Knoten k expandieren
c.cost ← k.cost + kante(k,c).cost;
pqueue.append(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)
19.06.2004
(c) W. Conen, FH GE, GIN2
21
Uniform-Cost-Ablauf
OB
10
Startzustand
20
GE
pqueue (und closed in Klammern dahinter):
DUI
13
15
12
MH
14
35
D
19.06.2004
E
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, D/44, D/50, OB/50, MH/53
(GE,E,OB,MH,DUI) E,GE,DUI in Closed!
D/44, D/50, OB/50, MH/53 (GE,E,OB,MH,DUI)
D/44 gefunden!
(c) W. Conen, FH GE, GIN2
22
Was geht noch „uninformiert“?
„
Simples „Greedy“:
‰
„
Wenn wir nicht auf Wiederholungen achten, kann das zu endlosem
Pendeln zwischen zwei Zuständen führen
‰
„
Verwende von deinem Knoten aus jeweils den günstigsten nächsten Schritt.
Im Beispiel würde er sich zwischen E und MH einpendeln
Also achten wir auf Wiederholungen
‰
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 und führen eine CLOSED-List bereits
verwendeter Kanten!
‰
‰
19.06.2004
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)
(c) W. Conen, FH GE, GIN2
23
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
19.06.2004
(c) W. Conen, FH GE, GIN2
24
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) weniger
merken 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.
19.06.2004
(c) W. Conen, FH GE, GIN2
25
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“
19.06.2004
(c) W. Conen, FH GE, GIN2
26
A*-Ablauf (auf Wiederholungen wird nicht
geachtet)
OB
10
Startzustand
20
GE
DUI
13
15 pqueue:
12
MH
14
35
D
19.06.2004
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, GIN2
27
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 (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“ 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*!)
19.06.2004
(c) W. Conen, FH GE, GIN2
28
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 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...das ist eines der Themen in INT A
... oder würde in GIN 3b behandelt, das es leider nicht gibt ;-)
Thema wäre dort: kombinatorische Optimierung: „harte“
Optimierungsprobleme, Standardalgorithmen (lineare,
ganzzahlige Programmierung, Branch-and-Bound, dynamisches
Programmieren), Approximationsalgorithmen, randomisierte
Algorithmen
19.06.2004
(c) W. Conen, FH GE, GIN2
29
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
‰ 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... ;-)
19.06.2004
(c) W. Conen, FH GE, GIN2
30
Herunterladen