Grundlagen der Künstlichen Intelligenz 7. März 2014 — 6. Klassische Suche: Datenstrukturen für Suchalgorithmen 6.1 Einführung Grundlagen der Künstlichen Intelligenz 6. Klassische Suche: Datenstrukturen für Suchalgorithmen 6.2 Suchknoten Malte Helmert 6.3 Open-Liste Universität Basel 6.4 Closed-Liste 7. März 2014 6.5 Zusammenfassung M. Helmert (Universität Basel) Grundlagen der Künstlichen Intelligenz 7. März 2014 1 / 32 M. Helmert (Universität Basel) Grundlagen der Künstlichen Intelligenz 7. März 2014 6. Klassische Suche: Datenstrukturen für Suchalgorithmen 2 / 32 Einführung 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. 6.1 Einführung 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 7. März 2014 3 / 32 M. Helmert (Universität Basel) Grundlagen der Künstlichen Intelligenz 7. März 2014 4 / 32 6. Klassische Suche: Datenstrukturen für Suchalgorithmen Einführung Suchalgorithmen 6. Klassische Suche: Datenstrukturen für Suchalgorithmen Vorschau: Suchalgorithmen I Wir befassen und jetzt mit Suchalgorithmen. I Wie überall in der Informatik sind geeignete Datenstrukturen ein Schlüssel zu guter Performance. I Ab dem nächsten Kapitel betrachten wir Suchalgorithmen genauer. I hier eine kurze Vorschau, um unsere Diskussion von Datenstrukturen zu motivieren häufige Operationen müssen schnell sein I Einführung gut implementierte Suchalgorithmen verarbeiten bis zu ∼30,000,000 Zustände/Sekunde auf einem CPU-Kern Zusatzmaterial (Paper von Burns et al.) dieses Kapitel: einige grundlegende Datenstrukturen für Suche M. Helmert (Universität Basel) Grundlagen der Künstlichen Intelligenz 7. März 2014 6. Klassische Suche: Datenstrukturen für Suchalgorithmen 5 / 32 Einführung Beispiel: Suchalgorithmus I I I I M. Helmert (Universität Basel) Grundlagen der Künstlichen Intelligenz 7. März 2014 6. Klassische Suche: Datenstrukturen für Suchalgorithmen 6 / 32 Einführung Beispiel: Suchalgorithmus Ausgehend vom Anfangszustand, expandiere wiederholt einen Zustand durch Erzeugen seiner Nachfolger. Höre auf, wenn ein Zielzustand expandiert wird oder alle erreichbaren Zustände betrachtet wurden. I I I I Ausgehend vom Anfangszustand, expandiere wiederholt einen Zustand durch Erzeugen seiner Nachfolger. Höre auf, wenn ein Zielzustand expandiert wird oder alle erreichbaren Zustände betrachtet wurden. h3, 3, 1i M. Helmert (Universität Basel) Grundlagen der Künstlichen Intelligenz 7. März 2014 7 / 32 M. Helmert (Universität Basel) Grundlagen der Künstlichen Intelligenz 7. März 2014 8 / 32 6. Klassische Suche: Datenstrukturen für Suchalgorithmen Einführung Beispiel: Suchalgorithmus I I I I 6. Klassische Suche: Datenstrukturen für Suchalgorithmen Beispiel: Suchalgorithmus Ausgehend vom Anfangszustand, expandiere wiederholt einen Zustand durch Erzeugen seiner Nachfolger. Höre auf, wenn ein Zielzustand expandiert wird oder alle erreichbaren Zustände betrachtet wurden. I I I I Ausgehend vom Anfangszustand, expandiere wiederholt einen Zustand durch Erzeugen seiner Nachfolger. Höre auf, wenn ein Zielzustand expandiert wird oder alle erreichbaren Zustände betrachtet wurden. h3, 3, 1i h2, 2, 0i Einführung h3, 2, 0i h3, 3, 1i h3, 1, 0i h2, 2, 0i h3, 2, 0i h3, 1, 0i h3, 3, 1i M. Helmert (Universität Basel) Grundlagen der Künstlichen Intelligenz 7. März 2014 6. Klassische Suche: Datenstrukturen für Suchalgorithmen 9 / 32 Einführung Beispiel: Suchalgorithmus I I I I M. Helmert (Universität Basel) Grundlagen der Künstlichen Intelligenz 6. Klassische Suche: Datenstrukturen für Suchalgorithmen I I h3, 2, 0i h3, 3, 1i I I h3, 3, 1i h3, 1, 0i h2, 2, 0i h3, 3, 1i h3, 2, 1i h3, 2, 0i h3, 3, 1i h2, 2, 0i M. Helmert (Universität Basel) Einführung Ausgehend vom Anfangszustand, expandiere wiederholt einen Zustand durch Erzeugen seiner Nachfolger. Höre auf, wenn ein Zielzustand expandiert wird oder alle erreichbaren Zustände betrachtet wurden. h3, 3, 1i h3, 2, 1i 10 / 32 Beispiel: Suchalgorithmus Ausgehend vom Anfangszustand, expandiere wiederholt einen Zustand durch Erzeugen seiner Nachfolger. Höre auf, wenn ein Zielzustand expandiert wird oder alle erreichbaren Zustände betrachtet wurden. h2, 2, 0i 7. März 2014 Grundlagen der Künstlichen Intelligenz 7. März 2014 11 / 32 M. Helmert (Universität Basel) h3, 1, 0i h3, 3, 1i h3, 2, 0i h3, 1, 0i Grundlagen der Künstlichen Intelligenz 7. März 2014 12 / 32 6. Klassische Suche: Datenstrukturen für Suchalgorithmen Einführung Beispiel: Suchalgorithmus I I I I 6. Klassische Suche: Datenstrukturen für Suchalgorithmen Einführung Grundlegende Datenstrukturen für Suche Ausgehend vom Anfangszustand, expandiere wiederholt einen Zustand durch Erzeugen seiner Nachfolger. Höre auf, wenn ein Zielzustand expandiert wird oder alle erreichbaren Zustände betrachtet wurden. Wir betrachten drei abstrakte Datenstrukturen für Suche: I Suchknoten: speichern welche Zustände erreicht werden können, wie, und unter welchen Kosten Knoten des Beispielsuchbaums I h3, 3, 1i Open-Liste: organisiert die Blätter des Suchbaums effizient Menge der Blätter des Beispielsuchbaums h2, 2, 0i h3, 2, 1i h3, 2, 0i h3, 3, 1i h2, 2, 0i I h3, 1, 0i innere Knoten eines Suchbaums h3, 3, 1i h3, 2, 0i Closed-Liste: merkt expandierte Zustände, um mehrfache Expansion desselben Zustands zu vermeiden Nicht alle Algorithmen verwenden alle drei Datenstrukturen, und manchmal sind sie implizit (z. B. im CPU-Stack). h3, 1, 0i . . . und so weiter. (Expansionsreihenfolge hängt vom gewählten Suchalgorithmus ab.) M. Helmert (Universität Basel) Grundlagen der Künstlichen Intelligenz 7. März 2014 6. Klassische Suche: Datenstrukturen für Suchalgorithmen 13 / 32 Suchknoten M. Helmert (Universität Basel) Grundlagen der Künstlichen Intelligenz 7. März 2014 6. Klassische Suche: Datenstrukturen für Suchalgorithmen 14 / 32 Suchknoten Suchknoten 6.2 Suchknoten Suchknoten Suchknoten (kurz: Knoten) speichern welche Zustände erreicht werden können, wie, und unter welchen Kosten Gemeinsam bilden sie den so genannten Suchbaum. M. Helmert (Universität Basel) Grundlagen der Künstlichen Intelligenz 7. März 2014 15 / 32 M. Helmert (Universität Basel) Grundlagen der Künstlichen Intelligenz 7. März 2014 16 / 32 6. Klassische Suche: Datenstrukturen für Suchalgorithmen Suchknoten Attribute von Suchknoten Suchknoten in Java-Syntax public interface State { } n.parent Suchknoten, der diesen Knoten erzeugte (none für den Wurzelknoten) public interface Action { } n.action Aktion, die von n.parent zu n führt (none für den Wurzelknoten) public class SearchNode { State state; SearchNode parent; Action action; int pathCost; } n.path cost Kosten des Pfades vom Anfangszustand zu n.state, der aus Verfolgen der parent-Referenzen resultiert (traditionell mit g (n) bezeichnet) . . . und manchmal zusätzliche Felder (z. B., Tiefe im Baum) Grundlagen der Künstlichen Intelligenz 7. März 2014 6. Klassische Suche: Datenstrukturen für Suchalgorithmen 17 / 32 Suchknoten Knoten in einem Suchbaum M. Helmert (Universität Basel) Node 6 1 88 7 3 22 M. Helmert (Universität Basel) I ACTION = right DEPTH = 6 PATH-COST = 6 18 / 32 Suchknoten vernünftige Implementierung von Suchknoten ist einfach fortgeschrittene Aspekte: I I I STATE Grundlagen der Künstlichen Intelligenz 7. März 2014 6. Klassische Suche: Datenstrukturen für Suchalgorithmen I 4 Grundlagen der Künstlichen Intelligenz Implementierung von Suchknoten PARENT-NODE 5 Suchknoten Suchknoten: Java Attribute eines Suchknoten n n.state Zustand, der zu diesem Knoten gehört M. Helmert (Universität Basel) 6. Klassische Suche: Datenstrukturen für Suchalgorithmen I 7. März 2014 19 / 32 Benötigen wir überhaupt explizite Knoten? Können wir Lazy Evaluation verwenden? Lohnt sich manuelle Speicherverwaltung? Können wir Information komprimieren? M. Helmert (Universität Basel) Grundlagen der Künstlichen Intelligenz 7. März 2014 20 / 32 6. Klassische Suche: Datenstrukturen für Suchalgorithmen Suchknoten Operationen für Suchknoten: make root node 6. Klassische Suche: Datenstrukturen für Suchalgorithmen Operationen für Suchknoten: make node Erzeuge Wurzelknoten eines Suchbaums: Erzeuge Kindknoten in einem Suchbaum: function make root node() function make node(parent, action, state) node := new SearchNode node.state := init() node.parent := none node.action := none node.path cost := 0 return node node := new SearchNode node.state := state node.parent := parent node.action := action node.path cost := parent.path cost + cost(action) return node M. Helmert (Universität Basel) Grundlagen der Künstlichen Intelligenz Suchknoten 7. März 2014 6. Klassische Suche: Datenstrukturen für Suchalgorithmen 21 / 32 Suchknoten M. Helmert (Universität Basel) Grundlagen der Künstlichen Intelligenz 7. März 2014 6. Klassische Suche: Datenstrukturen für Suchalgorithmen 22 / 32 Open-Liste Operationen für Suchknoten: extract path Extrahiere den Pfad zu einem Suchknoten: 6.3 Open-Liste function extract path(node) path := hi while node.parent 6= none: path.append(node.action) node := node.parent path.reverse() return path M. Helmert (Universität Basel) Grundlagen der Künstlichen Intelligenz 7. März 2014 23 / 32 M. Helmert (Universität Basel) Grundlagen der Künstlichen Intelligenz 7. März 2014 24 / 32 6. Klassische Suche: Datenstrukturen für Suchalgorithmen Open-Liste Open-Listen 6. Klassische Suche: Datenstrukturen für Suchalgorithmen Open-Liste Open-Listen: Einträge modifizieren Open-Liste Die Open-Liste (auch: Frontier) organisiert die Blätter des Suchbaums. I Manche Implementierungen unterstützen zusätzlich die Modifikation eines Eintrags in der Open-Liste, wenn ein billigerer Pfad zum zugehörigen Zustand gefunden wird. I Dies macht die Implementierung komplizierter. Sie muss zwei Operationen effizient unterstützen: I bestimme und entferne den nächsten zu expandieren Knoten I füge ein neuen Knoten ein, der Kandidat für Expansion ist wir betrachten solche Modifikationen nicht und verwenden stattdessen verzögerte Duplikateliminierung ( später) Anmerkung: trotz des Namens ist es meist eine sehr schlechte Idee, die Open-Liste als einfache Liste zu implementieren. M. Helmert (Universität Basel) Grundlagen der Künstlichen Intelligenz 7. März 2014 6. Klassische Suche: Datenstrukturen für Suchalgorithmen 25 / 32 Open-Liste M. Helmert (Universität Basel) Grundlagen der Künstlichen Intelligenz 7. März 2014 6. Klassische Suche: Datenstrukturen für Suchalgorithmen 26 / 32 Closed-Liste Interface von Open-Listen Methoden einer Open-Liste open open.is empty() testet, ob die Open-Liste leer ist open.pop() entfernt den nächsten zu expandieren Knoten und liefert ihn zurück 6.4 Closed-Liste open.insert(n) fügt Knoten node n in die Open-Liste ein I Unterschiedliche Suchalgorithmen verwenden unterschiedliche Strategien für die Entscheidung, welcher Knoten in open.pop zurückgeliefert wird. I Die Wahl der passenden Datenstruktur hängt von dieser Strategie ab (z. B.: Stack, Deque, Min-Heap). M. Helmert (Universität Basel) Grundlagen der Künstlichen Intelligenz 7. März 2014 27 / 32 M. Helmert (Universität Basel) Grundlagen der Künstlichen Intelligenz 7. März 2014 28 / 32 6. Klassische Suche: Datenstrukturen für Suchalgorithmen Closed-Liste Closed-Listen Closed-Liste Interface und Implementierung von Closed-Listen Methoden einer Closed-Liste closed closed.insert(n) füge Knoten n in closed ein; falls ein Knoten mit demselben Zustand bereits in closed existiert, ersetze ihn Closed-Liste Die Closed-Liste merkt sich die expandierten Zustände, um mehrfache Expansion desselben Zustands zu vermeiden Sie muss zwei Operationen effizient unterstützen: I füge einen Knoten ein, dessen Zustand noch nicht in der Closed-Liste ist I teste, ob ein Knoten mit einem gegebenen Zustand in der Closed-Liste ist; falls ja, liefere ihn zurück closed.lookup(s) teste, ob ein Knoten mit Zustand s in der Closed-Liste vorhanden ist; falls ja, liefere ihn zurück; sonst, liefere none zurück I Anmerkung: trotz des Namens ist es meist eine sehr schlechte Idee, die Closed-Liste als einfache Liste zu implementieren. (Warum?) M. Helmert (Universität Basel) 6. Klassische Suche: Datenstrukturen für Suchalgorithmen Grundlagen der Künstlichen Intelligenz 6. Klassische Suche: Datenstrukturen für Suchalgorithmen 7. März 2014 29 / 32 Zusammenfassung Hash-Tabellen mit Zuständen als Schlüssel können als effiziente Implementierung einer Closed-Liste dienen. M. Helmert (Universität Basel) Grundlagen der Künstlichen Intelligenz 6. Klassische Suche: Datenstrukturen für Suchalgorithmen 7. März 2014 30 / 32 Zusammenfassung Zusammenfassung 6.5 Zusammenfassung M. Helmert (Universität Basel) Grundlagen der Künstlichen Intelligenz 7. März 2014 31 / 32 I Suchknoten: repräsentieren während der Suche erreichte Knoten und zugehörige Informationen I Knotenexpansion: Erzeugen der Nachfolgeknoten eines Knoten durch Anwenden der Aktionen, die im Zustand des Knoten anwendbar sind I Open-Liste oder Frontier: Menge der Knoten, die derzeit Kandidaten für Expansion sind I Closed-Liste: Menge der bereits expandierten Knoten (und deren Zustände) M. Helmert (Universität Basel) Grundlagen der Künstlichen Intelligenz 7. März 2014 32 / 32