\chapter{Suchverfahren}
\label{suchverfahren}
    Bei der Modellerstellung (\ref{suchprobleme: umgebungsmodelle}) für Suchprobleme (\ref{suchprobleme}) entstehen zumeist Zustandsgraphen.
    Beim Durchlaufen des Graphen entsteht dann durch das Expandieren einzelner Knoten mithilfe der Nachfolgerfunktion (\ref{suchprobleme}) entsteht ein Suchbaum:\\
    \includegraphics[width = \textwidth]{graph zu suchbaum.png}

    \section{Breitensuche}
    \label{breadth-first search}
        Bei der Breitensuche wird der Graph Schicht für Schicht durchlaufen.\\
        \includegraphics[width = \textwidth]{breitensuche.png} 
        Die Breitensuche hat dabei den Vorteil, dass sie \textbf{vollständig} (alle Knoten werden erreicht) und \textbf{optimal} (Lösung mit geringster Tiefe wird gefunden) ist.
        Allerdins nimmt der Speicherbedarf der Breitensuche exponentiell mit der Anzahl der Knoten zu:\\
        \includegraphics[width = .8\textwidth]{breitensuche_speicherbedarf.png}

    \section{Tiefensuche}
    \label{depth-first search}
        Bei der Tiefensuche werden immer die tiefsten Knoten zuerst expandiert.\\
        \includegraphics[width = \textwidth]{tiefensuche.png} 
        Dies hat den Nachteil, dass die Tiefensuche \textbf{nicht vollständig} (unendlich tiefer Pfad möglich) und \textbf{nicht optimal} (findet bestenfalls die linkeste Lösung).
        Allerdings brauch keine Information über beendete Pfade gespeichert werden.
        Daher ist der Speicherbedarf der Tiefensuche nur linear von der Anzahl der Knoten abhängig.

    \section{Informierte Suche}
    \label{informed search}
        Falls bestimmte Informationen über den Graphen bekannt sind kann eine Heuristik erstellt werden.
        Die Heuristik $h(n)$ ist hierbei eine Funktion, welche die Kosten für das erreichen des Ziels über einen Knoten $n$ abschätzt.
        Dies kann dazu benutzt werden effizienter durch den Graph zu laufen.
        Hierbei ist allerdings zu beachten, dass eine Heuristik nicht perfekt ist (mehr Informationen zu der Bewertung von Heuristiken siehe Zusammenfassung KB).
        Eine informierte Suche ist folglich \textbf{nicht optimal}.
        Sie kann aber ({\color{red}falls Endlospfade vermieden werden}) \textbf{vollständig} sein.

    \section{A*-Suche}
    \label{a-star search}
        Die A*-Suche nutzt die Summe der Heuristik $h(n)$ und der Länge des bisherigen Weges $g(n)$ um einen Pfad zu wählen.
        $$f(n)=h(n)+g(n)$$
        Die A*-Suche ist \textbf{optimal} für eine Baumsuche, falls $h(s)$ zulässig ist ($h(s)$ überschätzt nicht).
        Zudem ist die A*-Suche \textbf{optimal} für eine Graphsuche, falls $h(s)$ konsistent ist.
        $h(s)$ ist konsistent, wenn $h(s) \le c(s,a,s') + h(s')$ ($a$: Aktion, die Nachfolger $s'$ generiert) gilt.
        Falls eine Lösung existiert ist die A*-Suche \textbf{vollständig}.
        Außerdem ist die A*-Suche \textbf{optimal effizient} (kein Suchalgorithmus muss weniger knoten expandieren).
        Allerdings ist auch bei der A*-Suche die Anzahl der im Speicher zu haltenden Knoten exponentiell.

        \subsection{Beispiel}
        \label{example: a-star}
            \includegraphics[width = \textwidth]{beispiel A*.png}

    \section{Hinweise zur Implementierung}
    \label{Hinweise zur Implementierung}
        \includegraphics[width = \textwidth]{hinweise_zur_implementierung.png}

        \includegraphics[width = \textwidth]{hinweise_zur_implementierung2.png}

        \includegraphics[width = \textwidth]{hinweise_zur_implementierung3.png}