95 lines
3.6 KiB
TeX
95 lines
3.6 KiB
TeX
\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:
|