\section{Chapitre 3: Autopsie d'un solveur}
\label{sec:ch3}

\subsection{Le modèle}
\label{sec:ch3modele}

\begin{itemize}
\item Variable: Possède un nom et un domaine
\item Contrainte (classe abstraite):
  \begin{itemize}
  \item Portée: vecteur de variables
  \item Trois méthodes de filtrage:
    \begin{itemize}
    \item Filtrage depuis zéro
    \item Filtrage sur modification du domaine
    \item Filtrage sur modification des bornes
    \end{itemize}
  \end{itemize}

\item Prétraitement pour diminuer le nombre de variables
\item Filtrage initiale, remplace les variables avec une seule valeur dans le domaine par des constantes
\end{itemize}

\subsection{L'heuristique}
\label{sec:ch3heu}

\begin{itemize}
\item Prend en paramètre l'ensemble des variables, retourne une variable et une valeurs pour le branchement.
\item C'est une classe abstraite.
\end{itemize}

\subsection{Le solveur}
\label{sec:ch3solv}

\begin{itemize}
\item Crée l'arbre de recherche et l'explore
\item Heuristiques définissent sa configuration
\item Entrée: modèle, Sortie: solution
\end{itemize}

\subsection{Le domaine}
\label{sec:ch3domaine}

\begin{itemize}
\item Ensemble de valeurs à tester
\item Méthodes: Bornes, appartenance, valeurs, filtres
\item Domaine intervalle: ne garde que les bornes supérieures et inférieures
  \begin{itemize}
  \item Structure: Pile de valeurs. 
  \item Chaque fois qu'on visite un enfant, le domaine ajoute sur sa pile le nouvel intervalle. 
  \item Lors d'un retour arrière, l'intervalle sur la pile est celui du noeud parent.
  \item Opérations en temps constant, sauf qu'on ne peut retirer de valeurs.
  \end{itemize}
\item Domaine énuméré: les valeurs ne forment pas un intervalle
  \begin{itemize}
  \item Structure: liste doublement chaînée et tableau de drapeaux et pointeurs
  \item Retrait d'une valeur:
    \begin{itemize}
    \item Enlever le drapeau
    \item Retirer le noeud de la liste chainée
    \item Garder le pointeur vers le prédécesseur et le successeur
    \end{itemize}
  \item Réinsertion:
    \begin{itemize}
    \item Dans l'ordre inverse de leur suppression
    \item Entre le noeud précédent et le noeud suivant
    \item On restaure les pointeurs
    \item On replace le drapeu
    \end{itemize}
  \end{itemize}
\item Domaine énuméré avec retours arrière rapides:
  \begin{itemize}
  \item Deux vecteurs $A[1,\ldots,d]$ et $B[1,\ldots,d]$ et une variable de cardinalité $C$
  \item Invariant: $B[A[i]]=i$
  \item Domaine: $B[1,C]$
  \item Retrait de $v$:
    \begin{itemize}
    \item Échanger $B[v]$ avec $B[C]$
    \item Mettre à jour $A$
    \item $C \leftarrow C-1$
    \end{itemize}
  \item Réinsertion d'une valeur:
    \begin{itemize}
    \item $C \leftarrow C+1$
    \end{itemize}
  \item Désavantages:
    \begin{itemize}
    \item Inefficace de trouver les bornes du domaine
    \item Algorithmes de filtrage moins efficaces
    \end{itemize}
  \end{itemize}
\end{itemize}

\begin{tabular}[H]{|l|l|l|l|}
  Opération & Intervalle & Énuméré & Retours arrières rapides\\
  Test valeur & $\mathcal{O}(1)$ & $\mathcal{O}(1)$ & $\mathcal{O}(1)$ \\
  Itérer valeurs & $\mathcal{O}(1)$ & $\mathcal{O}(1)$ & $\mathcal{O}(1)$  \\
  Retourner bornes & $\mathcal{O}(1)$ & $\mathcal{O}(1)$ & $\mathcal{O}(d)$ \\
  Changer bornes & $\mathcal{O}(1)$ & $\mathcal{O}(d)$ & $\mathcal{O}(d)$ \\
  Retirer valeur  & non disponible & $\mathcal{O}(1)$ & $\mathcal{O}(1)$ \\
  Enregistrer $k$ changements & $\mathcal{O}(1)$ & $\mathcal{O}(k)$ & $\mathcal{O}(1)$ \\
  Restaurer $k$ valeurs  & $\mathcal{O}(1)$ & $\mathcal{O}(k)$ & $\mathcal{O}(1)$ \\                     
\end{tabular}

\subsection{Méta-contraintes}
\label{sec:ch3meta}

\begin{align}
  \begin{aligned}
    \textsc{ifThen}(C_1,C_2) &\Leftrightarrow (C_1 \Rightarrow C_2) \\
    \textsc{ifThenElse}(C_1,C_2,C_3) &\Leftrightarrow (C_1 \wedge C_2) \vee (\neg C_1 \wedge C_3)
  \end{aligned}
\end{align}

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