Iterative Tiefensuche

Iterative Tiefensuche

Die iterative Tiefensuche (engl. iterative deepening search) ist ein Begriff aus der Informatik. Sie ist ein Verfahren zum Suchen eines Knotens in einem Graphen. Der Algorithmus kombiniert die wünschenswerten Eigenschaften von Tiefensuche (geringer Speicherverbrauch) und Breitensuche (Optimalität).

Inhaltsverzeichnis

Allgemeines

Die iterative Tiefensuche ist wie die normale Tiefensuche eine uninformierte Suche. Sie funktioniert wie die Tiefensuche, vermeidet jedoch durch Begrenzung der Suchtiefe deren Nachteile bezüglich Vollständigkeit. Bei der iterativen Tiefensuche wird iterativ eine Beschränkte Tiefensuche durchgeführt, und dabei das Level, bis zu welchem die Beschränkte Tiefensuche den Graphen erkundet, bei jeder Iteration um eins erhöht. Im ersten Schritt werden also alle Knoten, zu denen ein Pfad der Länge 0 führt, mittels Tiefensuche erkundet. Im nächsten Schritt werden dann alle Knoten, zu denen ein Pfad der Länge 1 führt, mittels Tiefensuche erkundet und so weiter. Hierdurch wird erreicht, dass Iterative Tiefensuche prinzipiell auf allen Graphen vollständig ist, da die Suche sich nun nicht mehr in einem endlos langen Pfad verlieren kann. Damit stellt die iterative Tiefensuche eine Kombination der Tiefen- und der Breitensuche dar. Sie hat einerseits den gleichen Speicherplatzverbrauch wie normale Tiefensuche (im Arbeitsspeicher muss jeweils maximal ein kompletter Ast bis zur momentanen Iterationstiefe gespeichert werden), liefert aber bei monoton steigenden Pfadkosten, ebenso wie die Breitensuche, eine optimale Lösung. Da für jede neue Iteration auch der bereits durchlaufene Suchbaum komplett neu aufgebaut werden muss, ist die Laufzeit höher als bei normaler Tiefensuche. Da in einem Suchbaum aber jeweils der größte Teil der Knoten Blätter sind ist dieser geringe Mehraufwand gegenüber den Vorteilen hinnehmbar.

Algorithmus (informell)

  1. Bestimme den Knoten, an dem die Suche beginnen soll
  2. Rufe Beschränkte Tiefensuche mit der aktuellen Suchtiefe auf
  3. Erhöhe die Suchtiefe um 1 und gehe zu Schritt 2

Algorithmus (formal)

Iterative Tiefensuche (Knoten, Ziel)
{
  IterationsTiefe := 0
  while (IterationsTiefe < unendlich)
  {
    Beschränkte_Tiefensuche (Knoten, Ziel, IterationsTiefe);
    IterationsTiefe := IterationsTiefe + 1;
  }
}

Algorithmusbeispiel: Erzeugen des Tiefensuchwaldes (iterativ)

Der folgende iterative Algorithmus erzeugt den Tiefensuchwald eines Graphen G mittels Setzen von Discovery- und Finishing-Times und Färben der Knoten. In Anlehnung an Cormen, Leiserson, Rivest, Stein, Introduction to Algorithms, MIT Press, 2001, werden zunächst alle Knoten weiß gefärbt. Anschließend startet die Tiefensuche per Definition beim alphabetisch kleinsten Knoten und färbt diesen grau. Danach wird ein Stack verwendet, worin der bereits entdeckte Weg bis zu einem Knoten ohne weißen Nachbarn gespeichert wird. Alle Knoten im Stack sind grau. Der Stack wird abgetragen, bis einer der gespeicherten Knoten noch einen weiteren weißen Nachbarn hat oder der Stack leer ist. Damit wird das der Rekursion eigene Backtracking simuliert.

Die vorgefertigte Methode nextw(u) liefert für einen Knoten u den (per Definition alphabetisch kleinsten) weißen Nachbarn. Existiert kein solcher, liefert sie NULL bzw. FALSE.

1       for each v of G{                        //Alle Knoten weiß und Vorgänger nil
2               col[v]=w;
3               pi[v]=nil;
4       }
5       time=0;                         
6       S=0;                                    //Stack S initialisieren
7       for each u of G{                        //für alle weißen Knoten u
8               if col[u]==w{           
9                       time++;                 //Zeitzähler erhöhen
10                      col[u]=g;               //Aktuellen Knoten grau färben
11                      d[u]=time;              //Entdeckzeit setzen
12                      push(S,u);              //Aktuellen Knoten auf Stack
13                      while S not 0{                          //Solange Stack belegt ist
14                              time++;                         //Zeitzähler erhöhen
15                              v=nextw(u)      
16                              if v {                          //wenn nächster weißer Nachbar
17                                      col[v]=g;               //v grau färben
18                                      d[v]=time;              //Entdeckzeit setzen
19                                      pi[v]=u;                //Vorgänger setzen
20                                      if nextw(v) push(S,v);
21                                      u=v;                    //Aktueller Knoten ist v
22                              }else{                          //wenn v NULL
23                                      col[u]=s;               //Aktuellen Knoten schwarz färben
24                                      f[u]=time;              //Finishing-Time setzen
25                                      if S not 0 u=pop(S);    //neuer aktueller Knoten von Stack
26                                      if col[u]==g push(S,u); //Solange Knoten noch nicht Schwarz, wieder auf den Stack
27                              }
28                      }
29              }
30      }
nextw(u)
1       for each node of adj[u]                                      
                if col[node]==w return node;                          
2       return false;

Eigenschaften

Speicherplatzverbrauch

Da intern auf Tiefensuche zurückgegriffen wird, ist der Speicherplatzbedarf ähnlich dem der normalen Tiefensuche.

Laufzeit

Da im schlimmsten Fall alle möglichen Pfade zu allen möglichen Knoten betrachtet werden müssen, beträgt die Laufzeit von Iterativer Tiefensuche \mathcal{O}( \vert V \vert + \vert E \vert ) wobei  \vert V \vert für die Anzahl der Knoten und  \vert E \vert für die Anzahl der Kanten im Graph steht.

Vollständigkeit

Da sich Iterative Tiefensuche weder in unendlich langen Pfaden noch in Zyklen verlieren kann, ist der Algorithmus vollständig.


Optimalität

Iterative Tiefensuche ist optimal, falls alle Pfadkosten äquivalent sind, da Tiefensuche in diesem Fall den kürzesten Pfad zu einem Ziel findet. Sind die Pfadkosten jedoch nicht äquivalent, so kann es wie bei der Breitensuche dazu kommen, dass ein suboptimaler Pfad gewählt wird.


Siehe auch

Literatur


Wikimedia Foundation.

Игры ⚽ Нужно решить контрольную?

Schlagen Sie auch in anderen Wörterbüchern nach:

  • Tiefensuche — (Depth First Search) ist in der Informatik ein Verfahren zum Suchen eines Knotens in einem Graphen. Sie zählt zu den uninformierten Suchalgorithmen. Eine Verbesserung der Tiefensuche ist die iterative Tiefensuche. Inha …   Deutsch Wikipedia

  • Beschränkte Tiefensuche — (engl. Depth Limited search, DLS) ist in der Informatik ein Verfahren zum Suchen eines Knotens in einem Graphen. Der Algorithmus ist eine Abwandlung der Tiefensuche. Anwendung findet die Beschränkte Tiefensuche im Algorithmus der Iterativen… …   Deutsch Wikipedia

  • Depth-First Search — Tiefensuche Tiefensuche (Depth First Search) ist in der Informatik ein Verfahren zum Suchen eines Knotens in einem Graphen. Sie zählt zu den uninformierten Suchalgorithmen. Eine Verbesserung der Tiefensuche ist die iterative Tiefensuche.… …   Deutsch Wikipedia

  • Breitendurchlauf — Breitensuche Breitensuche (Breadth First Search) ist ein Fachbegriff der Informatik, welcher ein Verfahren zum Durchsuchen bzw. Durchlaufen der Knoten eines Graphens bezeichnet. Sie zählt zu den uninformierten Suchen. Inhaltsverzeichnis …   Deutsch Wikipedia

  • Uniforme Kostensuche — Breitensuche Breitensuche (Breadth First Search) ist ein Fachbegriff der Informatik, welcher ein Verfahren zum Durchsuchen bzw. Durchlaufen der Knoten eines Graphens bezeichnet. Sie zählt zu den uninformierten Suchen. Inhaltsverzeichnis …   Deutsch Wikipedia

  • Alpha-Beta-Suche — Die Alpha Beta Suche, auch Alpha Beta Cut oder Alpha Beta Pruning genannt, ist eine optimierte Variante des Minimax Suchverfahrens, also eines Algorithmus zur Bestimmung eines optimalen Zuges bei Spielen mit zwei gegnerischen Parteien. Während… …   Deutsch Wikipedia

  • Minimaxalgorithmus — Der Minimax Algorithmus ist ein Algorithmus zur Ermittlung der optimalen Spielstrategie für bestimmte Spiele, bei denen zwei gegnerische Spieler abwechselnd Züge ausführen (z. B. Schach, Go, Reversi, Dame, Mühle oder Vier gewinnt), insbesondere… …   Deutsch Wikipedia

  • Minmax-Algorithmus — Der Minimax Algorithmus ist ein Algorithmus zur Ermittlung der optimalen Spielstrategie für bestimmte Spiele, bei denen zwei gegnerische Spieler abwechselnd Züge ausführen (z. B. Schach, Go, Reversi, Dame, Mühle oder Vier gewinnt), insbesondere… …   Deutsch Wikipedia

  • Minimax-Algorithmus — Der Minimax Algorithmus ist ein Algorithmus zur Ermittlung der optimalen Spielstrategie für bestimmte Spiele, bei denen zwei gegnerische Spieler abwechselnd Züge ausführen (z. B. Schach, Go, Reversi, Dame, Mühle oder Vier gewinnt),… …   Deutsch Wikipedia

  • Breitensuche — (englisch breadth first search, BFS) ist ein Fachbegriff der Informatik, welcher ein Verfahren zum Durchsuchen bzw. Durchlaufen der Knoten eines Graphen bezeichnet. Sie zählt zu den uninformierten Suchen …   Deutsch Wikipedia

Share the article and excerpts

Direct link
Do a right-click on the link above
and select “Copy Link”