118 lines
3.9 KiB
TeX
118 lines
3.9 KiB
TeX
\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:
|