2018-02-25 22:44:15 -05:00
\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: