\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.
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
Affectation de variables (tuple) qui satisfait une contrainte
\begin{itemize}
\item Types de support:
\begin{itemize}
\item Support de domaine: tuple $t$ satisfait $C$ tel que $t[i]\in mathtt{dom}(X_i)$et $\lbrace x_i = t[i]\forall1\leq i \leq n$
\item Support d'intervalle tuple $t$ satisfait $C$ tel que $min(\mathtt{dom}(X_i))\leq t[i]\leq max(\mathtt{dom}(X_i))$ et $\lbrace x_i = t[i]\forall1\leq i \leq n$
\end{itemize}
\item Propriétés:
\begin{itemize}
\item Support de domaine $\subset$ Support d'intervalle
\item Support d'intervalle: ne garantit pas l'existence d'une solution pour la contrainte
\end{itemize}
\end{itemize}
\paragraph{Cohérence}
Algorithme de \textbf{filtrage}: retire les valeurs d'un domaine pour lesquelles il n'y a pas de support
Niveaux de cohérence:
\begin{itemize}
\item Domaine: $\exists$ support de \textbf{domaine} pour toute variable $X$ de la portée de la contrainte et toute valeur $v$ dans le domaine de $X$.
\item Intervalle: $\exists$ support d'\textbf{intervalle} pour toute variable $X$ de la portée de la contrainte et toute valeur $v$ dans le domaine de $X$.
\item Bornes: $\exists$ support d'\textbf{intervalle} pour toute variable $X$ de la portée de la contrainte et la plus petite et la plus grande valeur du domaine de $X$.
\end{itemize}
Propriétés des cohérences:
\begin{itemize}
\item Cohérence de domaine $\subset$ Cohérence d'intervalle $\subset$ Cohérence de bornes
\item Cohérence locale: on a filtré itérativement les contraintes d'un problème
\item Algorithme \ref{alg:fouilleproffiltrage}
\end{itemize}
\begin{algorithm}[H]
\DontPrintSemicolon
\Deb{
\Repeter{$S \neq\emptyset$}{
Filtrer les domaines jusqu'à la cohérence locale \;
\item À chaque noeud de l'arbre, on applique la cohérence locale puis instancie une variable $X$
\item On filtre les contraintes contenant $X$. Si d'autres variables $Y$ voient leur domaine modifié, on filtre ensuite les contraintes sur $Y$ ainsi de suite. On garde une liste de contraintes à vérifier.
\item On ordonne $S$ en donnait priorité aux contraintes qui filtrent davantage de valeurs en moins de temps
\item Instanciation: toutes les valeurs retirées sauf une
\item ValeurSupprimée: Une valeur est supprimée du domaine
\item BorneInferieure: La borne inférieure est augmentée
\item BorneSuperieure: La borne supérieure est diminuée
\end{itemize}
Idéal: Un algorithme de filtrage pour chaque par type de filtrage pour les autres variables. Il est moins couteux de rétablir la cohérence que l'appliquer la première fois.
\paragraph{Branch \& Bound}
Optimisation: En minimisant $X$, si on trouve une solution où $X=v$, on ajoute la contrainte $X<v$ au problème. Cette contrainte filtre al borne supérieure et les autres la borne inférieure. Si la borne inférieure est supérieure à la borne supérieure de cette nouvelle contrainte, on déclenche un retour arrière.
\paragraph{Cohérence de singleton}
Affecter temporairement une valeur à une variable, puis appliquer la cohérence locale.
S'il n'y a pas de cohérence locale, on retire cette valeur du domaine.
En pratique, on teste chaque paire variable/valeur une seule fois.
\paragraph{Cohérence de chemin}
Créer un graphe où chaque paire variable et valeur représente un noeud. On ajoute les arêtes entre les noeuds si aucune contrainte n'empêche une solution partielle incluant ces deux noeuds.
On vérifie si pour chaque arête, il existe une chemin de longueur $l$ reliant les deux noeuds. Sinon on supprime l'arête. Si un noeud est isolé du graphe, on le supprime. Il existe $n!$ permutations.
On applique généralement la cohérence de chemin de longueur 2 qui est équivalente et a $\binom{n}{3}$ permutations. La complexité est $\mathcal{O}(n^3)$.