\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) > 1 \right\rVert \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) > 1 \right\rVert \rbrace$ \; $P \leftarrow \lbrace x_i \mid \left\lVert \mathtt{dom}(x_i) = 1 \right\rVert \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} %%% Local Variables: %%% mode: latex %%% TeX-master: "notes_de_cours" %%% End: