it-swarm.com.de

Was ist der Unterschied zwischen Graphensuche und Baumsuche?

Was ist der Unterschied zwischen Graphensuche und Baumsuche Versionen bezüglich DFS, A * Suchen in künstliche Intelligenz?

87
Rayhanur Rahman

Den vorhandenen Antworten nach zu urteilen, scheint dieses Konzept sehr verwirrend zu sein.

Das Problem ist immer ein Graph

Die Unterscheidung zwischen Baumsuche und Diagrammsuche beruht nicht auf der Tatsache, ob das Problemdiagramm ein Baum oder ein allgemeines Diagramm ist. Es wird immer davon ausgegangen, dass es sich um ein allgemeines Diagramm handelt. Die Unterscheidung liegt in dem Traversal Pattern, das zum Durchsuchen des Graphen verwendet wird, der graphisch oder baumförmig sein kann.

Wenn es sich um ein baumförmiges Problem handelt, führen beide Algorithmusvarianten zu gleichwertigen Ergebnissen. So können Sie die einfachere Baumsuchvariante auswählen.

Unterschied zwischen Grafik- und Baumsuche

Ihr grundlegender Graphensuchalgorithmus sieht ungefähr so ​​aus. Mit einem Startknoten start, gerichteten Kanten als successors und einer goal Spezifikation, die in der Schleifenbedingung verwendet wird. open hält die aktuell betrachteten Knoten im Speicher, die offene Liste. Beachten Sie, dass der folgende Pseudocode nicht in jedem Aspekt korrekt ist (2).

Baumsuche

open <- []
next <- start

while next is not goal {
    add all successors of next to open
    next <- select one node from open
    remove next from open
}

return next

Je nachdem, wie Sie select from open Implementieren, erhalten Sie verschiedene Varianten von Suchalgorithmen, z. B. Tiefensuche (DFS) (neuestes Element auswählen), Breitensuche (BFS) (ältestes Element auswählen) oder Suche nach einheitlichen Kosten ( Wählen Sie das Element mit den niedrigsten Pfadkosten), die beliebte A-Stern-Suche, indem Sie den Knoten mit dem niedrigsten Wert Kosten plus Heuristik usw. auswählen.

Der oben angegebene Algorithmus heißt eigentlich Baumsuche . Der Status des zugrunde liegenden Problemgraphen wird mehrmals aufgerufen, wenn im Startstatus mehrere gerichtete Pfade zu ihm vorhanden sind. Es ist sogar möglich, einen Zustand unendlich oft zu besuchen, wenn er in einer gerichteten Schleife liegt. Jeder Besuch entspricht jedoch einem anderen Knoten in dem von unserem Suchalgorithmus generierten Baum. Diese offensichtliche Ineffizienz wird manchmal gewünscht, wie später erläutert wird.

Grafische Suche

Wie wir gesehen haben, kann die Baumsuche einen Zustand mehrmals besuchen. Und als solches wird es den "Unterbaum", der nach diesem Zustand gefunden wird, mehrmals untersuchen, was teuer sein kann. Die Graphensuche behebt dies, indem alle besuchten Staaten in einer geschlossenen Liste aufgezeichnet werden. Wenn ein neu gefundener Nachfolger von next bereits bekannt ist, wird er nicht in die offene Liste eingefügt:

open <- []
closed <- []
next <- start

while next is not goal {
    add next to closed
    add all successors of next to open, which are not in closed 
    remove next from open
    next <- select from open
}

return next

Vergleich

Wir bemerken, dass die Graphensuche mehr Speicher benötigt, da sie alle besuchten Zustände verfolgt. Dies kann durch die kleinere offene Liste ausgeglichen werden, was zu einer verbesserten Sucheffizienz führt.

Optimale Lösungen

Einige Methoden zur Implementierung von select können garantieren, dass optimale Lösungen zurückgegeben werden - dh ein kürzester Pfad oder ein Pfad mit minimalen Kosten (für Diagramme mit Kosten) an Kanten befestigt). Dies gilt grundsätzlich, wenn Knoten in der Reihenfolge steigender Kosten erweitert werden oder wenn die Kosten eine positive Konstante ungleich Null sind. Ein üblicher Algorithmus, der diese Art der Auswahl implementiert, ist Uniform Cost Search , oder wenn die Schrittkosten identisch sind, [~ # ~] bfs [~ # ~] oder [~ # ~] iddfs [~ # ~] . IDDFS vermeidet den aggressiven Speicherverbrauch von BFS und wird im Allgemeinen für nicht informierte Suche (auch bekannt als Brute Force) empfohlen, wenn die Schrittgröße konstant ist.

A *

Auch der (sehr beliebte) Suchalgorithmus A * tree liefert eine optimale Lösung, wenn er mit einer zulässige Heuristik verwendet wird =. Der Suchalgorithmus A * graph gibt diese Garantie jedoch nur dann, wenn er mit einer konsistenten (oder "monotonen") Heuristik verwendet wird (eine stärkere Bedingung als Zulässigkeit).

(2) Fehler des Pseudocodes

Der Einfachheit halber enthält der vorgestellte Code nicht:

  • fehlerhafte Suchen behandeln, d. h. es funktioniert nur, wenn eine Lösung gefunden werden kann
160
ziggystar

Ein Baum ist ein Sonderfall eines Graphen. Was auch immer für allgemeine Graphen funktioniert, funktioniert auch für Bäume. Ein Baum ist ein Graph, bei dem genau ein Pfad zwischen jedem Knotenpaar liegt. Dies impliziert, dass es keine Zyklen enthält, wie in einer vorherigen Antwort angegeben, aber ein gerichteter Graph ohne Zyklen (eine DAG, gerichteter azyklischer Graph) ist nicht notwendigerweise ein Baum.

Wenn Sie jedoch wissen, dass Ihr Diagramm einige Einschränkungen aufweist, z. Wenn es sich um einen Baum oder eine DAG handelt, können Sie in der Regel einen effizienteren Suchalgorithmus finden als für ein uneingeschränktes Diagramm. Beispielsweise ist es wahrscheinlich wenig sinnvoll, A * oder dessen nicht-heuristisches Gegenstück "Dijkstra-Algorithmus" in einem Baum zu verwenden (in dem ohnehin nur ein Pfad zur Auswahl steht, den Sie über DFS oder BFS finden können) oder auf einer DAG (wo ein optimaler Pfad gefunden werden kann, indem Eckpunkte in der Reihenfolge berücksichtigt werden, die durch topologische Sortierung erhalten wird).

Ein ungerichteter Graph ist ein Sonderfall eines gerichteten, nämlich der Fall, der der Regel folgt, „wenn es eine Kante (Verknüpfung, Übergang) von u bis v gibt es auch eine Kante von v bis u .

pdate: Beachten Sie, dass, wenn es Ihnen wichtig ist, das Durchlaufmuster der Suche und nicht die Struktur des Diagramms selbst ist, Das ist nicht die Antwort. Siehe z. B. die Antwort von @ ziggystar.

6
njlarsson

Der einzige Unterschied zwischen einem Graphen und einem Baum ist Zyklus. Ein Graph kann Zyklen enthalten, ein Baum nicht. Wenn Sie also einen Suchalgorithmus in einem Baum implementieren, müssen Sie die Existenz von Zyklen nicht berücksichtigen, aber wenn Sie mit einem beliebigen Diagramm arbeiten, müssen Sie sie berücksichtigen. Wenn Sie die Zyklen nicht verarbeiten, kann der Algorithmus möglicherweise in eine Endlosschleife oder eine endlose Rekursion geraten.

Ein weiterer zu überlegender Punkt sind die Richtungseigenschaften des Graphen, mit dem Sie sich befassen. In den meisten Fällen handelt es sich um Bäume, die Eltern-Kind-Beziehungen an jedem Edge darstellen. Ein DAG (Directed Acyclic Graph) zeigt ebenfalls ähnliche Eigenschaften. Bidirektionale Diagramme sind jedoch unterschiedlich. Jede Kante in einem bidirektionalen Diagramm repräsentiert zwei Nachbarn. Daher sollten sich die algorithmischen Ansätze für diese beiden Diagrammtypen etwas unterscheiden.

2
0605002

In einfachen Worten, Baum enthält keine Zyklen und wo als Graph kann. Wenn wir also suchen, sollten wir Zyklen in Graphen vermeiden, damit wir nicht in Endlosschleifen geraten.

Ein weiterer Aspekt ist, dass der Baum typischerweise eine Art topologische Sortierung oder eine Eigenschaft wie ein binärer Suchbaum aufweist, was die Suche im Vergleich zu Diagrammen so schnell und einfach macht.

1
Madhi

GRAFIK GEGEN BAUM

  • Graphen haben Zyklen
  • Bäume haben keine Zyklen "Stellen Sie sich zum Beispiel einen Baum in Ihrem Kopf vor, Zweige haben keine direkten Verbindungen zur Wurzel, aber Zweige haben Verbindungen zu anderen Zweigen nach oben."

Aber im Falle von AI Graph-search vs Tree-search

Die Diagrammsuche hat eine gute Eigenschaft, die immer dann angezeigt wird, wenn der Algorithmus einen neuen Knoten durchsucht und ihn als besucht markiert. "Unabhängig vom verwendeten Algorithmus" untersucht der Algorithmus normalerweise alle anderen Knoten, die vom aktuellen Knoten aus erreichbar sind.

Betrachten Sie beispielsweise das folgende Diagramm mit den drei Eckpunkten A B und C und die folgenden Kanten

A-B, B-C und C-A, Nun gibt es einen Zyklus von C nach A,

Und wenn DFS mit A beginnt, generiert A einen neuen Status B, B generiert einen neuen Status C, aber wenn C untersucht wird, versucht der Algorithmus, einen neuen Status A zu generieren, aber A ist bereits besucht, sodass er ignoriert wird. Cool!

Aber was ist mit Bäumen? Nun, Bäume Algorithmus markieren den besuchten Knoten nicht als besucht, aber Bäume haben keine Zyklen, wie würde es in einer Endlosschleife kommen?

Betrachten Sie diesen Baum mit 3 Eckpunkten und die folgenden Kanten

A - B - C bei A verwurzelt, nach unten. Nehmen wir an, wir verwenden den DFS-Algorithmus

A erzeugt einen neuen Zustand B, B erzeugt zwei Zustände A und C, weil Bäume nicht "Markiere einen besuchten Knoten, wenn er erkundet ist" haben, daher wird der DFS-Algorithmus möglicherweise wieder A untersuchen und somit einen neuen Zustand B erzeugen Wir geraten in eine Endlosschleife.

Haben Sie jedoch etwas bemerkt, arbeiten wir an ungerichteten Kanten, d. H. Es besteht eine Verbindung zwischen A-B und B-A. Dies ist natürlich kein Zyklus, da der Zyklus impliziert, dass die Eckpunkte> = 3 sein müssen und alle Eckpunkte mit Ausnahme des ersten und des letzten Knotens unterschiedlich sind.

ST A-> B-> A-> B-> A es ist kein Zyklus, weil es die Zykluseigenschaft verletzt> = 3. Aber in der Tat ist A-> B-> C-> A ein Zyklus> = 3 verschiedene Knoten. Der erste und der letzte Knoten sind gleich.

Betrachten Sie noch einmal die Baumkanten A-> B-> C-> B-> A, natürlich ist es kein Zyklus, da es zwei Bs gibt, was bedeutet, dass nicht alle Knoten unterschiedlich sind.

Zuletzt können Sie einen Baumsuchalgorithmus implementieren, um zu verhindern, dass derselbe Knoten zweimal durchsucht wird. Das hat aber Konsequenzen.

0
Mohamed Horani