archetype | title | linkTitle | author | readings | tldr | outcomes | quizzes | assignments | youtube | fhmedia | ||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
lecture-cg |
Suche mit Breitensuche |
Breitensuche |
Carsten Gips (HSBI) |
|
Die Breitensuche gehört zu den "Uninformierten Suchverfahren": Es werden keine weiteren
Pfadkosten, sondern nur die Anzahl der Schritte berücksichtigt.
Die Breitensuche entsteht, wenn man bei der Tree-Search oder der Graph-Search für die
Datenstruktur eine **Queue** benutzt: Expandierte Nachfolger werden immer **hinten**
in die Queue eingefügt, und der nächste zu expandierende Knoten wird **vorn** aus der
Queue genommen. Dadurch wird bei der Breitensuche der Suchbaum ebenenweise entwickelt.
|
|
|
|
|
::: notes => [Problemlösen == Suche im Graphen]{.alert} :::
\bigskip \bigskip
Uninformierte ("blinde") Suche:
Keine Informationen über die Kosten eines Pfades: Nur die [Pfadlänge]{.alert} (Anzahl der Schritte) zählt.
::: notes Varianten:
- Tiefensuche
- Breitensuche :::
::: notes Erinnerung Graph-Search :::
- Füge Startknoten in leere Datenstruktur (Stack, Queue, ...) ein
- Entnehme Knoten aus der Datenstruktur:
- Knoten ist gesuchtes Element: Abbruch, melde "gefunden"
- Markiere aktuellen Knoten, und
- Expandiere alle Nachfolger des Knotens und füge alle unmarkierten Nachfolger, die noch nicht in der Datenstruktur sind, in die Datenstruktur ein
- Falls die Datenstruktur leer ist: Abbruch, melde "nicht gefunden"
- Gehe zu Schritt 2
\bigskip => Was passiert, wenn wir eine [Queue]{.alert} einsetzen?
:::::: notes :::center {width="90%"} ::: ::::::
[[Tafelbeispiel Breitensuche (Queue, Suchbaum, markierte Knoten)]{.bsp}]{.slides}
::::::::: notes
-
Nachfolger eines Knotens: Alle von diesem Zustand durch Aktionen erreichbare Zustände
-
Suchalgorithmus mit [Queue]{.alert} als Datenstruktur => Breitensuche
- Zu betrachtender Knoten in Schritt 2 wird vorn aus der Queue genommen
- Expandierte Knoten werden in Schritt 2.a hinten in die Queue eingefügt Dabei i.A. die vorgegebene Reihenfolge der Nachfolgeknoten beachten!
Auswirkung: Suchbaum wird ebenenweise aufgebaut (deshalb "Breitensuche")
-
Graph-Search: Markierte Knoten müssen geeignet gespeichert werden: separate Datenstruktur => Aufwand!
In der Beschreibung der Algorithmen werden häufig nur die letzten Knoten der partiellen Wege in den Datenstrukturen mitgeführt (das gilt auch für die Beschreibung im [@Russell2020]). Dies erschwert die Nachvollziehbarkeit, wenn man die Queue oder den Stack schrittweise aufschreibt. Deshalb wird für diese Veranstaltung die Konvention eingeführt, immer die partiellen Wege aufzuschreiben.
Nicht Bestandteil der Algorithmen, dient aber der Nachvollziehbarkeit: Expandierte Knoten sollen alphabetisch sortiert an der korrekten Stelle in der Datenstruktur auftauchen, dabei soll aber natürlich die Reihenfolge der ursprünglich in der Datenstruktur enthaltenen Knoten nicht modifiziert werden. (Bei "echten" Problemen wird die Reihenfolge der expandierten Nachfolger in der Regel durch eine Reihenfolge der anwendbaren Operationen bestimmt.)
-
Die Breitensuche wurde zufällig am Beispiel Graph-Search eingeführt. Man kann auch die Tree-Search-Variante einsetzen. Wichtig ist nur, dass als Datenstruktur eine Queue genutzt wird.
-
Im [@Russell2020] wird die Breitensuche ebenfalls auf der Basis des Graph-Search-Algorithmus eingeführt. Allerdings wird die Abbruchbedingung modifiziert: Die Zielbedingung wird nicht erst (wie bei Graph-Search eigentlich definiert) geprüft, wenn ein Knoten aus der Queue entnommen wird, sondern bereits bei der Erzeugung der Nachfolgerknoten (vor dem Einfügen in die Queue). Dadurch spart man sich die Expansion einer zusätzlichen Ebene: Die Komplexität wäre in diesem Fall "nur"
$O(b^{d})$ . :::::::::
Tiefensuche | Breitensuche | |
---|---|---|
Vollständigkeit | nein1 | ja2 |
Optimalität | nein | ja |
Zeitkomplexität | ||
Speicherkomplexität |
::: notes
- Zeitkomplexität: maximal zu expandierende Knotenzahl
- Speicher:
- TS: in jeder Tiefe weitere
$b$ Knoten speichern - BS: alle Knoten einer Ebene im Speicher halten3 :::
- TS: in jeder Tiefe weitere
\vfill \footnotesize
b: Verzweigungsfaktor, d: Ebene d. höchsten Lösungsknotens, m: Länge d. längsten Pfades
\normalsize
Breitensuche:
Annahme:
Tiefe | exp. Knoten | Zeit | Speicher |
---|---|---|---|
2 | 0.1 s | 1 MB | |
4 | 10 s | 100 MB | |
6 | 20 min | 10 GB | |
8 | 30 h | 1 TB | |
10 | 130 d | 100 TB |
\pause \bigskip
Tiefensuche:
Annahme: längster Pfad (Tiefe)
=> Speicherbedarf [ca. 10 MB]{.alert}
- Uninformierte Suchverfahren
- Keine weiteren Pfadkosten (nur Anzahl der Schritte)
- Breitensuche: Verfolge alle Pfade (baue den Suchbaum ebenenweise auf)
::: slides
Unless otherwise noted, this work is licensed under CC BY-SA 4.0. :::