\chapter{\acfp{CSP}}
\label{csp}
    Bei \acp{CSP} handelt es sich um eine Teilmenge von Suchproblemen, bei denen \say{Zustände keine Black-Box und Pfade nicht relevant} sind.
    Hierbei werden den Variablen $X_i$ Werte aus den Domänen $D_i$ zugewiesen.
    Diese müssen eine Reihe von Randbedingungen $C_j$ erfüllen.
    Für die Bestimmung der optimalen Lösung wird hierbei die Nutzenfunktion (\ref{nutzentheorie}) verwendet.

    \section{Beispiele}
    \label{csp: examples}
        \subsection{Karteneinfärbung}
        \label{csp: Karteneinfaerbung}
            \includegraphics[width = \textwidth]{karteneinfärbung.png}

        \subsection{N-Damen-Problem}
        \label{csp: n-damen}
            \includegraphics[width = \textwidth]{n-damen.png}

        \subsection{Sudoku}
        \label{csp: sudoku}
            \includegraphics[width = \textwidth]{sudoku.png}

    \section{Lösungswege}
    \label{csp: solutions}
        \subsection{\acp{CSP} als klassische Suchprobleme}
        \label{csp: klassisches suchproblem}
            Man kann ein \ac{CSP} in ein klassisches Suchproblem umwandeln:
            \begin{itemize}
                \item Startzustand: keine Zuweisungen der Variablen $X_i$
                \item Nachfolgerfunktion: Einer unbelegten Variablen einen Wert zuweisen
                \item Zieltest: Prüfen, ob eine Variablenzuweisung die Rahmenbedingungen erfüllt
            \end{itemize}
            Dies hat allerdings klare Probleme:
            \begin{itemize}
                \item Die Breitensuche muss bis zur tiefsten Ebene durchlaufen, um eine Lösung zu finden (Worst Case für Breitensuche).
                \item Die Tiefensuche probiert ganzen Pfad durch, auch wenn schon früh eine der Randbedingungen $C_j$ verletzt wird.
            \end{itemize}

        \subsection{Backtracking}
        \label{csp: backtracking}
            Beim Backtracking wird folgende Kombination von Mechanismen benutzt:
            $$\text{Backtracking} = \text{Tiefensuche}+\text{Variablensortierung}+\text{Konfliktvermeidung}$$
            Für die Reihenfolge, in der die Variablen belegt werden gibt es mehrere Heuristiken
            \begin{itemize}
                \item \textbf{Minimum Remaining Value:}\\
                    Es wird immer die Variable gewählt, die am wenigsten Belegungsmöglichkeiten hat.
                    Dies hat das Ziel möglichst schnell auf Fehler zu stoßen.
                \item \textbf{Least Constraint Value:}\\
                    Es wird immer die Variable gewählt, die die anderen Variablen am wenigsten Einschränkt.
                    Dies hat das Ziel möglichst flexibel zu bleiben.
            \end{itemize}

        \subsection{Forward Checking}
        \label{forward checking}
            \textbf{Prinzip:} Während der Suche unmögliche Werte in noch nicht zugewiesenen Variablen entfernen
            
            \subsubsection{Beispiel}
            \label{forward checking: example}
                \includegraphics[width = .5\textwidth]{forward_checking1.png}
                \includegraphics[width = .5\textwidth]{forward_checking2.png}
                \includegraphics[width = .5\textwidth]{forward_checking3.png}
                \includegraphics[width = .5\textwidth]{forward_checking4.png}

        \subsection{Constraint Propagation}
        \label{constraint propagation}
            \includegraphics[width = \textwidth]{constraint propagation.png}

        \subsection{Arc Consistency}
        \label{arc consistency}
            \includegraphics[width = \textwidth]{arc consistency.png}

            \includegraphics[width = \textwidth]{arc_consistency2.png}
            {\Large\color{red}Achtung!}\\
            Das Arc Consistency Verfahren hat den Nachteil, dass nicht alle Konflikte sicher gefunden werden.
            Daher gibt es das Verfahren der \say{k-Consistency}. Hierbei werden mehrere Knoten im Abhängigkeitsgraph geprüft.