Grundlagen der Künstlichen Intelligenz 16. März 2015 — 12. Klassische Suche: Tiefensuche und iterative Tiefensuche Grundlagen der Künstlichen Intelligenz 12.1 Tiefensuche 12. Klassische Suche: Tiefensuche und iterative Tiefensuche Malte Helmert 12.2 Iterative Tiefensuche Universität Basel 12.3 Blinde Suche: Zusammenfassung 16. März 2015 M. Helmert (Universität Basel) Grundlagen der Künstlichen Intelligenz 16. März 2015 1 / 23 M. Helmert (Universität Basel) Grundlagen der Künstlichen Intelligenz 16. März 2015 12. Klassische Suche: Tiefensuche und iterative Tiefensuche 2 / 23 Tiefensuche Klassische Suche: Überblick Kapitelüberblick klassische Suche: I I 5.–7. Grundlagen 8.–12. Basisalgorithmen I I I I I I 12.1 Tiefensuche 8. Datenstrukturen für Suchalgorithmen 9. Baumsuche und Graphensuche 10. Breitensuche 11. uniforme Kostensuche 12. Tiefensuche und iterative Tiefensuche 13.–20. heuristische Algorithmen M. Helmert (Universität Basel) Grundlagen der Künstlichen Intelligenz 16. März 2015 3 / 23 M. Helmert (Universität Basel) Grundlagen der Künstlichen Intelligenz 16. März 2015 4 / 23 12. Klassische Suche: Tiefensuche und iterative Tiefensuche Tiefensuche Tiefensuche 12. Klassische Suche: Tiefensuche und iterative Tiefensuche Tiefensuche Tiefensuche: Beispiel 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 tiefster Knoten zuerst expandiert z. B. Open-Liste als Stack implementiert E I J L G N M H J J L G N M O H I J M. Helmert (Universität Basel) Grundlagen der Künstlichen Intelligenz 16. März 2015 12. Klassische Suche: Tiefensuche und iterative Tiefensuche 5 / 23 Tiefensuche Tiefensuche: einige Eigenschaften M. Helmert (Universität Basel) J K O H L G N M L G C E I J F K M N O H E I J G N M O H E I J F L K O G N M B F K L C D C D O O A B F G N M B F K L A E C E I K A B H J D G N M C D A D I B F L K B F K H F A E I C E I O E A B H C D C D O A D N M B F K L G A B D H B F A Tiefensuche (depth-first search, DFS) expandiert Knoten in umgekehrter Erzeugungsreihenfolge (LIFO). A B L G M N C D O H E I J F K L G M N O Grundlagen der Künstlichen Intelligenz 16. März 2015 12. Klassische Suche: Tiefensuche und iterative Tiefensuche 6 / 23 Tiefensuche Erinnerung: generischer Baumsuchalgorithmus Erinnerung aus Kapitel 9: I Generische Baumsuche 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 M. Helmert (Universität Basel) Grundlagen der Künstlichen Intelligenz 16. März 2015 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 7 / 23 M. Helmert (Universität Basel) Grundlagen der Künstlichen Intelligenz 16. März 2015 8 / 23 12. Klassische Suche: Tiefensuche und iterative Tiefensuche Tiefensuche Tiefensuche (nicht-rekursive Version) 12. Klassische Suche: Tiefensuche und iterative Tiefensuche Tiefensuche Nicht-rekursive Tiefensuche: Diskussion Tiefensuche (nicht-rekursive Version): Diskussion: Tiefensuche (nicht-rekursive Version) I 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 es ist nicht viel falsch mit dem Code (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 16. März 2015 12. Klassische Suche: Tiefensuche und iterative Tiefensuche 9 / 23 Tiefensuche Tiefensuche (rekursive Version) M. Helmert (Universität Basel) Grundlagen der Künstlichen Intelligenz 16. März 2015 12. Klassische Suche: Tiefensuche und iterative Tiefensuche 10 / 23 Tiefensuche Tiefensuche: Aufwand Zeitaufwand: function depth first search(s) 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 if is goal(s): return hi 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 Speicheraufwand: Hauptfunktion: I Tiefensuche (rekursive Version) Speicheraufwand O(bm) wenn m maximale erreichte Suchtiefe return depth first search(init()) I M. Helmert (Universität Basel) Grundlagen der Künstlichen Intelligenz muss nur Knoten entlang aktuell exploriertem Pfad speichern (“entlang” = Knoten auf dem Pfad und deren Kinder) 16. März 2015 11 / 23 dieser niedrige Speicherbedarf ist der Hauptgrund, warum Tiefensuche trotz ihrer Nachteile interessant ist M. Helmert (Universität Basel) Grundlagen der Künstlichen Intelligenz 16. März 2015 12 / 23 12. Klassische Suche: Tiefensuche und iterative Tiefensuche Iterative Tiefensuche 12. Klassische Suche: Tiefensuche und iterative Tiefensuche Iterative Tiefensuche Tiefenbeschränkte Suche Tiefenbeschränkte Suche: 12.2 Iterative Tiefensuche I Tiefensuche, die alle Suchknoten in einer gegebenen Tiefe n abschneidet (nicht weiter expandiert) 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 12. Klassische Suche: Tiefensuche und iterative Tiefensuche 16. März 2015 13 / 23 Iterative Tiefensuche Tiefenbeschränkte Suche: Pseudo-Code M. Helmert (Universität Basel) Grundlagen der Künstlichen Intelligenz 16. März 2015 12. Klassische Suche: Tiefensuche und iterative Tiefensuche 14 / 23 Iterative Tiefensuche Iterative Tiefensuche Iterative Tiefensuche: function depth limited search(s, depth limit): I if is goal(s): return hi Idee: führe eine Folge tiefenbeschränkter Suchen mit ansteigenden Tiefenschranken aus I klingt verschwenderisch (jede Iteration wiederholt die gesamte vorher geleistete Arbeit), aber tatsächlich ist der Aufwand vertretbar ( Analyse folgt) 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 M. Helmert (Universität Basel) Grundlagen der Künstlichen Intelligenz Iterative Tiefensuche for depth limit ∈ {0, 1, 2, . . . }: solution := depth limited search(init()), depth limit) if solution 6= none: return solution 16. März 2015 15 / 23 M. Helmert (Universität Basel) Grundlagen der Künstlichen Intelligenz 16. März 2015 16 / 23 12. Klassische Suche: Tiefensuche und iterative Tiefensuche Iterative Tiefensuche Iterative Tiefensuche: Eigenschaften 12. Klassische Suche: Tiefensuche und iterative Tiefensuche Iterative Tiefensuche: Beispiel A Limit = 0 A A Limit = 1 A B Kombiniert Vorteile von Breiten- und Tiefensuche: C (fast) wie BFS: semi-vollständig (allerdings nicht vollständig) C E G C D E 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 Zeitaufwand kaum höher als BFS ( G E J siehe Analyse später) G M L D O N H J C E I J O N H J C M. Helmert (Universität Basel) Grundlagen der Künstlichen Intelligenz 16. März 2015 12. Klassische Suche: Tiefensuche und iterative Tiefensuche 17 / 23 Iterative Tiefensuche Iterative Tiefensuche: Beispiel für den Aufwand M. Helmert (Universität Basel) E I J G M L L G M N J H E I J F H O N C D G M L H E I J F K J B F K L G M N G M L H H E I J F K J B F K G M L O N A E I O N C D O N C D O G M L A E I G B F K B F K E C D O N C D O C D A B F K E I A B D H G A B F K G A E I A H O N C D G M L F B F C D G M L B F K E A B D E A B F K C D A E I G C D C A H G B F K B F A C E I E B F A D C D C D C A B F B H I C E Limit = 3 G A B D B A B F A I C A B F A B A C D A B A Limit = 2 B I Iterative Tiefensuche L G M N C D O H Grundlagen der Künstlichen Intelligenz E I J F K L G M N O 16. März 2015 12. Klassische Suche: Tiefensuche und iterative Tiefensuche 18 / 23 Iterative Tiefensuche Iterative Tiefensuche: Zeitaufwand Zeitaufwand (erzeugte Knoten): Satz (Zeitaufwand der iterativen Tiefensuche) Breitensuche 1 + b + b 2 + · · · + b d−1 + b d Iterative Tiefensuche (d + 1) + db + (d − 1)b 2 + · · · + 2b d−1 + 1b d Sei b der maximale Verzweigungsgrad und d die minimale Lösungslänge des betrachteten Zustandsraums. Gelte b ≥ 2. Dann beträgt der Zeitaufwand der iterativen Tiefensuche Beispiel: b = 10, d = 5 Breitensuche (d + 1) + db + (d − 1)b 2 + (d − 2)b 3 + · · · + 1b d = O(b d ) 1 + 10 + 100 + 1000 + 10000 + 100000 = 111111 Iterative Tiefensuche und der Speicheraufwand beträgt 6 + 50 + 400 + 3000 + 20000 + 100000 = 123456 O(bd) für b = 11, nur 11% mehr Knoten als mit Breitensuche M. Helmert (Universität Basel) Grundlagen der Künstlichen Intelligenz 16. März 2015 19 / 23 M. Helmert (Universität Basel) Grundlagen der Künstlichen Intelligenz 16. März 2015 20 / 23 12. Klassische Suche: Tiefensuche und iterative Tiefensuche Iterative Tiefensuche 12. Klassische Suche: Tiefensuche und iterative Tiefensuche Blinde Suche: Zusammenfassung Iterative Tiefensuche: Bewertung 12.3 Blinde Suche: Zusammenfassung Iterative Tiefensuche: Bewertung Iterative Tiefensuche ist oft die Methode der Wahl, wenn I Baumsuche angemessen (keine Duplikateliminierung nötig) ist I und die Lösungstiefe unbekannt ist. M. Helmert (Universität Basel) Grundlagen der Künstlichen Intelligenz 16. März 2015 12. Klassische Suche: Tiefensuche und iterative Tiefensuche 21 / 23 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** ∗ 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 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 16. März 2015 23 / 23 M. Helmert (Universität Basel) Grundlagen der Künstlichen Intelligenz 16. März 2015 22 / 23