Grundlagen der Künstlichen Intelligenz 21. März 2014 — 9. Klassische Suche: Tiefensuche und iterative Tiefensuche Grundlagen der Künstlichen Intelligenz 9.1 Tiefensuche 9. Klassische Suche: Tiefensuche und iterative Tiefensuche Malte Helmert 9.2 Iterative Tiefensuche Universität Basel 9.3 Blinde Suche: Zusammenfassung 21. März 2014 M. Helmert (Universität Basel) Grundlagen der Künstlichen Intelligenz 21. März 2014 1 / 24 M. Helmert (Universität Basel) Grundlagen der Künstlichen Intelligenz 21. März 2014 9. Klassische Suche: Tiefensuche und iterative Tiefensuche 2 / 24 Tiefensuche Klassische Suche: Überblick Kapitelüberblick klassische Suche: I I 3.–5. Einführung 6.–9. Basisalgorithmen I I I I I 6. 7. 8. 9. 9.1 Tiefensuche Datenstrukturen für Suchalgorithmen Baumsuche und Graphensuche Breitensuche und uniforme Kostensuche Tiefensuche und iterative Tiefensuche folgende Kapitel: heuristische Algorithmen M. Helmert (Universität Basel) Grundlagen der Künstlichen Intelligenz 21. März 2014 3 / 24 M. Helmert (Universität Basel) Grundlagen der Künstlichen Intelligenz 21. März 2014 4 / 24 9. Klassische Suche: Tiefensuche und iterative Tiefensuche Tiefensuche Blinde Suchalgorithmen: Beispiele 9. Klassische Suche: Tiefensuche und iterative Tiefensuche Tiefensuche Tiefensuche Beispiele für blinde Suchalgorithmen: I Breitensuche I uniforme Kostensuche I Tiefensuche ( I tiefenbeschränkte Suche ( I iterative Tiefensuche ( Tiefensuche expandiert Knoten in umgekehrter Erzeugungsreihenfolge (LIFO). tiefster Knoten zuerst expandiert z. B. Open-Liste als Stack implementiert dieses Kapitel) M. Helmert (Universität Basel) dieses Kapitel) dieses Kapitel) Grundlagen der Künstlichen Intelligenz 21. März 2014 9. Klassische Suche: Tiefensuche und iterative Tiefensuche 5 / 24 Tiefensuche Tiefensuche: Beispiel M. Helmert (Universität Basel) Grundlagen der Künstlichen Intelligenz 21. März 2014 9. Klassische Suche: Tiefensuche und iterative Tiefensuche 6 / 24 Tiefensuche Tiefensuche: einige Eigenschaften Beispiel: (Annahme: Knoten in Tiefe 3 haben keine Nachfolger) A A B C D H E I J F K L N C D G M O H E I J K C E I J L G N M D O H J J G N M D O H J M. Helmert (Universität Basel) J O H G N M L G M N H E I J J F K L fast immer als Baumsuche implementiert (wir werden sehen, warum) I nicht vollständig, nicht semi-vollständig, nicht optimal (Warum?) I vollständig für azyklische Zustandsräume, z. B. wenn Zustandsraum gerichteter Baum G N M O C D O H E I J F L K G N M B F K I C E I C D O O O A B F K G N M B F L K L A E I C E I K A B D J D G N M C A H I B F L K B F L K H F A E I C E I O E A B D C D C A H N M B F K L G A B D B F A H A B L G M N C D O H E I J F K Grundlagen der Künstlichen Intelligenz L G M N O 21. März 2014 7 / 24 M. Helmert (Universität Basel) Grundlagen der Künstlichen Intelligenz 21. März 2014 8 / 24 9. Klassische Suche: Tiefensuche und iterative Tiefensuche Tiefensuche Erinnerung: generischer Baumsuchalgorithmus 9. Klassische Suche: Tiefensuche und iterative Tiefensuche Tiefensuche (nicht-rekursive Version) Erinnerung aus Kapitel 7: Tiefensuche (nicht-rekursive Version): Generische Baumsuche Tiefensuche (nicht-rekursive Version) open := new OpenList open.insert(make root node()) while not open.is empty(): n = open.pop() if is goal(n.state): return extract path(n) for each ha, s 0 i ∈ succ(n.state): n0 := make node(n, a, s 0 ) open.insert(n0 ) return unsolvable open := new Stack open.push back(make root node()) while not open.is empty(): n = open.pop back() if is goal(n.state): return extract path(n) for each ha, s 0 i ∈ succ(n.state): n0 := make node(n, a, s 0 ) open.push back(n0 ) return unsolvable M. Helmert (Universität Basel) Grundlagen der Künstlichen Intelligenz Tiefensuche 21. März 2014 9. Klassische Suche: Tiefensuche und iterative Tiefensuche 9 / 24 Tiefensuche Nicht-rekursive Tiefensuche: Diskussion M. Helmert (Universität Basel) Grundlagen der Künstlichen Intelligenz 21. März 2014 9. Klassische Suche: Tiefensuche und iterative Tiefensuche 10 / 24 Tiefensuche Tiefensuche (rekursive Version) function depth first search(s) if is goal(s): return hi Diskussion: I es ist nicht viel falsch mit dem Code for each ha, s 0 i ∈ succ(s): solution := depth first search(s 0 ) if solution 6= none: solution.push front(a) return solution return none (sofern man aufpasst, nicht mehr benötigte Knoten freizugeben, wenn die Programmiersprache keine Garbage-Collection beinhaltet) I Tiefensuche als rekursiver Algorithmus ist aber einfacher und effizienter Maschinen-Stack als implizite Open-Liste keine Suchknoten-Datenstruktur nötig Hauptfunktion: Tiefensuche (rekursive Version) return depth first search(init()) M. Helmert (Universität Basel) Grundlagen der Künstlichen Intelligenz 21. März 2014 11 / 24 M. Helmert (Universität Basel) Grundlagen der Künstlichen Intelligenz 21. März 2014 12 / 24 9. Klassische Suche: Tiefensuche und iterative Tiefensuche Tiefensuche 9. Klassische Suche: Tiefensuche und iterative Tiefensuche Iterative Tiefensuche Tiefensuche: Aufwand Zeitaufwand: I Wenn der Zustandsraum Pfade der Länge m enthält, kann die Tiefensuche O(b m ) Knoten erzeugen, selbst wenn sehr kurze Lösungen (z. B. Länge 1) existieren I Andererseits: im besten Fall können Lösungen der Länge ` mit O(b`) erzeugten Knoten gefunden werden. (Warum?) I verbesserbar auf O(`), wenn inkrementelle Nachfolgerberechnung möglich 9.2 Iterative Tiefensuche Speicheraufwand: I muss nur Knoten entlang aktuell exploriertem Pfad speichern (“entlang” = Knoten auf dem Pfad und deren Kinder) Speicheraufwand O(bm) wenn m maximale erreichte Suchtiefe I dieser niedrige Speicherbedarf ist der Hauptgrund, warum Tiefensuche trotz ihrer Nachteile interessant ist M. Helmert (Universität Basel) Grundlagen der Künstlichen Intelligenz 9. Klassische Suche: Tiefensuche und iterative Tiefensuche 21. März 2014 13 / 24 Iterative Tiefensuche Tiefenbeschränkte Suche M. Helmert (Universität Basel) Grundlagen der Künstlichen Intelligenz 9. Klassische Suche: Tiefensuche und iterative Tiefensuche 21. März 2014 14 / 24 Iterative Tiefensuche Tiefenbeschränkte Suche: Pseudo-Code function depth limited search(s, depth limit): if is goal(s): return hi Tiefenbeschränkte Suche: I Tiefensuche, die alle Suchknoten in einer gegebenen Tiefe n abschneidet (nicht weiter expandiert) if depth limit > 0: for each ha, s 0 i ∈ succ(s): solution := depth limited search(s 0 , depth limit − 1) if solution 6= none: solution.push front(a) return solution return none für sich allein nicht sehr nützlich, aber wichtige Zutat in nützlicheren Suchalgorithmen M. Helmert (Universität Basel) Grundlagen der Künstlichen Intelligenz 21. März 2014 15 / 24 M. Helmert (Universität Basel) Grundlagen der Künstlichen Intelligenz 21. März 2014 16 / 24 9. Klassische Suche: Tiefensuche und iterative Tiefensuche Iterative Tiefensuche Iterative Tiefensuche 9. Klassische Suche: Tiefensuche und iterative Tiefensuche Iterative Tiefensuche Iterative Tiefensuche: Eigenschaften Iterative Tiefensuche: I I Idee: führe eine Folge tiefenbeschränkter Suchen mit ansteigenden Tiefenschranken aus Kombiniert Vorteile von Breiten- und Tiefensuche: klingt verschwenderisch (jede Iteration wiederholt die gesamte vorher geleistete Arbeit), aber tatsächlich ist der Aufwand vertretbar ( Analyse folgt) Iterative Tiefensuche for depth limit ∈ {0, 1, 2, . . . }: solution := depth limited search(init()), depth limit) if solution 6= none: return solution M. Helmert (Universität Basel) Grundlagen der Künstlichen Intelligenz 21. März 2014 9. Klassische Suche: Tiefensuche und iterative Tiefensuche 17 / 24 Iterative Tiefensuche Iterative Tiefensuche: Beispiel A Limit = 0 I (fast) wie BFS: semi-vollständig (allerdings nicht vollständig) I wie BFS: optimal wenn alle Aktionen dieselben Kosten haben I wie DFS: muss nur Knoten entlang eines Pfades speichern Speicheraufwand O(bd), wobei d minimale Lösungslänge I Zeitaufwand kaum höher als BFS ( M. Helmert (Universität Basel) siehe Analyse später) Grundlagen der Künstlichen Intelligenz 21. März 2014 9. Klassische Suche: Tiefensuche und iterative Tiefensuche 18 / 24 Iterative Tiefensuche Iterative Tiefensuche: Beispiel für den Aufwand A Zeitaufwand (erzeugte Knoten): A Limit = 1 A B C B C B A Limit = 2 E F G D E F H G D G D K M O N H I J E I J O N H J M. Helmert (Universität Basel) E I J L G M N H D O H J J D G D F H J M L O N H I J F K G M L N H E I H E I J J F K G M L B F K Iterative Tiefensuche C D O N C D O = 111111 O N O N L G M N C D O H Grundlagen der Künstlichen Intelligenz E I 6 + 50 + 400 + 3000 + 20000 + 100000 = 123456 A B G M 1 + 10 + 100 + 1000 + 10000 + 100000 G M L A A L Breitensuche C E B F K (d + 1) + db + (d − 1)b 2 + · · · + 2b d−1 + 1b d A E I Iterative Tiefensuche Beispiel: b = 10, d = 5 G B F K 1 + b + b 2 + · · · + b d−1 + b d C E C D O N F K G C E I G B F B G M L E I F Breitensuche A E C D O E A B F K G N F K D C A C D M L E I A B H D C D G M L C A B F K G B F K B F A C D G C E A B H E A L C C A B F B F B A E C J D C A E I G B F B D B A C Limit = 3 C A C A E A B D B A B D A C J F K L G M N für b = 11, nur 11% mehr Knoten als mit Breitensuche O 21. März 2014 19 / 24 M. Helmert (Universität Basel) Grundlagen der Künstlichen Intelligenz 21. März 2014 20 / 24 9. Klassische Suche: Tiefensuche und iterative Tiefensuche Iterative Tiefensuche Iterative Tiefensuche: Zeitaufwand 9. Klassische Suche: Tiefensuche und iterative Tiefensuche Iterative Tiefensuche Iterative Tiefensuche: Bewertung Satz (Zeitaufwand der iterativen Tiefensuche) Sei b der maximale Verzweigungsgrad und d die minimale Lösungslänge des betrachteten Zustandsraums. Gelte b ≥ 2. Iterative Tiefensuche: Bewertung Iterative Tiefensuche ist oft die Methode der Wahl, wenn Dann beträgt der Zeitaufwand der iterativen Tiefensuche (d + 1) + db + (d − 1)b 2 + (d − 2)b 3 + · · · + 1b d = O(b d ) I Baumsuche angemessen (keine Duplikateliminierung nötig) ist I und die Lösungstiefe unbekannt ist. und der Speicheraufwand beträgt O(bd) M. Helmert (Universität Basel) Grundlagen der Künstlichen Intelligenz 9. Klassische Suche: Tiefensuche und iterative Tiefensuche 21. März 2014 21 / 24 Blinde Suche: Zusammenfassung M. Helmert (Universität Basel) Grundlagen der Künstlichen Intelligenz 21. März 2014 9. Klassische Suche: Tiefensuche und iterative Tiefensuche 22 / 24 Blinde Suche: Zusammenfassung Vergleich blinder Suchalgorithmen Vollständigkeit, Optimalität, Zeit- und Speicheraufwand Kriterium Breiten- uniforme Tiefen- tiefen- iterative suche Kostensuche suche beschr. S. Tiefensuche vollständig? ja* ja nein nein semi optimal? ja** ja nein nein ja** 9.3 Blinde Suche: Zusammenfassung Zeit O(b d ) O(b 1+bc /c ) O(b m ) O(b ` ) O(b d ) Speicher O(b d ) ∗ O(b 1+bc /c ) O(bm) O(b`) O(bd) b≥2 d m ` c∗ >0 M. Helmert (Universität Basel) Grundlagen der Künstlichen Intelligenz 21. März 2014 23 / 24 ∗ Verzweigungsgrad min. Lösungstiefe max. Suchtiefe Tiefenschranke optimale Lösungskosten min. Aktionskosten M. Helmert (Universität Basel) Anmerkungen: * für BFS-Tree: semi-vollständig ** nur mit uniformen Aktionskosten Grundlagen der Künstlichen Intelligenz 21. März 2014 24 / 24