\section{Chapitre 2: Fouille et filtrage}
\label{sec:ch2}

\subsection{Processus de résolution}
\label{sec:ch2res}

\paragraph{Énumération}

\begin{itemize}
\item Force brute: énumérer toutes les solutions candidates
\item Itération et filtration
\item Au moins une unité de temps sur chaque solution candidate
\item Compléxité dans
  \begin{align}
    \Omega \left( \prod_{i=1}^{n} \| \texttt{dom}(x_i) \| \right)
  \end{align}
\item Fondement des algorithmes les plus sophistiqués
\end{itemize}

\paragraph{Fouille en profondeur}

\begin{itemize}
\item Créer un arbre de recherche
\item Chaque noeud équivaut à une solution partielle
\item Ordre de visite:
  \begin{itemize}
  \item Racine 
  \item Premier enfant non visité depuis la gauche
  \item Si tous les enfants visités, retour au noeud parent
  \end{itemize}
\item Validité
  \begin{itemize}
  \item Doit visiter toutes les solutions candidates possibles
  \item Ne devrait pas visiter deux fois la même solution partielle ou candidate
  \end{itemize}
\item Décisions de l'arbre de recherche: \textbf{heuristique} décide de la politique de choix
\item Voir Algorithme \ref{alg:fouilleprofcomp}: $K$=Solution candidate, $P$=Solution partielle, $S$=Solution
\end{itemize}

\begin{algorithm}
  \DontPrintSemicolon
  \Deb{
    \Repeter{$S \neq \emptyset$}{
      $K \leftarrow \lbrace x_i \mid \left\lVert \mathtt{dom}(x_i)\right\rVert > 1  \rbrace$ \;
      \Si{$K = \emptyset$}{
        \Si{$\mathtt{dom}(x_1), \ldots, \mathtt{dom}(x_n) \text{ satisfait contraintes}$}{
          \Retour{$\mathtt{dom}(x_1), \ldots, \mathtt{dom}(x_n)$}
        }
        \Sinon{\Retour{$\emptyset$}}
      }
      Choisir une variable $x_i \in K$\;
      Choisir une valeur $v\in \mathtt{dom}(x_i)$\;
      $S \leftarrow \texttt{FouilleEnProfondeurComplète}(\mathtt{dom}(x_1), \ldots, \mathtt{dom}(x_{i-1}),\lbrace v \rbrace, \mathtt{dom}(x_{x+1}), \ldots, \mathtt{dom}(x_{n}))$\;
      \Si{$S=\emptyset$}{$\mathtt{dom}(x_i) \leftarrow \mathtt{dom}(x_i) \setminus \lbrace v \rbrace$}
    }
    \Retour{$S$}
  }
\caption{FouilleEnProfondeurComplète($\mathtt{dom}(x_1), \ldots, \mathtt{dom}(x_n)$)}
\label{alg:fouilleprofcomp}
\end{algorithm}

\paragraph{Fouille en profondeur avec retours arrières}

On améliore l'algorithme précédent en validant les contraintes pour chaque solution partielle. Algorithme \ref{alg:fouilleprofretarr}. Seul un sous-ensemble des noeuds est exploré. Permet de résoudre certains problèmes en temps polynomial.

\begin{algorithm}
  \DontPrintSemicolon
  \Deb{
    \Repeter{$S \neq \emptyset$}{
      $K \leftarrow \lbrace x_i \mid \left\lVert \mathtt{dom}(x_i)\right\rVert > 1 \rbrace$ \;
      $P \leftarrow \lbrace x_i \mid \left\lVert \mathtt{dom}(x_i)\right\rVert = 1 \rbrace$
      \Pour{$C_j \in \mathcal{C}$}{
        \Si{$Portée(C_j) \subseteq P \wedge \neg C_j$}{\Retour{$\emptyset$}}
      }
      \Si{$C = \emptyset$}{ \Retour{$\mathtt{dom}(x_1), \ldots, \mathtt{dom}(x_n)$}}
      Choisir une variable $x_i \in K$\;
      Choisir une valeur $v\in \mathtt{dom}(x_i)$\;
      $S \leftarrow \texttt{FouilleEnProfondeurRetArr}(\mathtt{dom}(x_1), \ldots, \mathtt{dom}(x_{i-1}),\lbrace v \rbrace, \mathtt{dom}(x_{x+1}), \ldots, \mathtt{dom}(x_{n}))$\;
      \Si{$S=\emptyset$}{$\mathtt{dom}(x_i) \leftarrow \mathtt{dom}(x_i) \setminus \lbrace v \rbrace$}
    }
    \Retour{$S$}
  }
\caption{FouilleEnProfondeurRetArr($\mathtt{dom}(x_1), \ldots, \mathtt{dom}(x_n)$)}
\label{alg:fouilleprofretarr}
\end{algorithm}

\paragraph{Vérification anticipée}

S'il reste une seule variable non instanciée, itérer sur toutes les valeurs du domaine de celle-ci. Explore un sous-ensemble de noeuds explorés par la fouille avec retours arrières. Certains problèmes peuvent être résolus sans retour arrière.

\subsection{Filtrage des domaines}
\label{sec:ch2filt}

\begin{itemize}
\item \textbf{Algorithme de filtrage}: domaine des variables dans la portée de la contrainte, modifie les domaines
\item Un algorithme de filtrage par contrainte
\end{itemize}

\paragraph{Support}




%%% Local Variables:
%%% mode: latex
%%% TeX-master: "notes_de_cours"
%%% End:
