ajout fin chapitre 2 et chapitre 3
This commit is contained in:
parent
07d0aa2726
commit
adbb670cda
2 changed files with 227 additions and 4 deletions
118
chapitre2.tex
118
chapitre2.tex
|
@ -37,7 +37,7 @@
|
|||
\item Voir Algorithme \ref{alg:fouilleprofcomp}: $K$=Solution candidate, $P$=Solution partielle, $S$=Solution
|
||||
\end{itemize}
|
||||
|
||||
\begin{algorithm}
|
||||
\begin{algorithm}[H]
|
||||
\DontPrintSemicolon
|
||||
\Deb{
|
||||
\Repeter{$S \neq \emptyset$}{
|
||||
|
@ -63,7 +63,7 @@
|
|||
|
||||
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}
|
||||
\begin{algorithm}[H]
|
||||
\DontPrintSemicolon
|
||||
\Deb{
|
||||
\Repeter{$S \neq \emptyset$}{
|
||||
|
@ -96,7 +96,119 @@ S'il reste une seule variable non instanciée, itérer sur toutes les valeurs du
|
|||
\item Un algorithme de filtrage par contrainte
|
||||
\end{itemize}
|
||||
|
||||
\paragraph{Support}
|
||||
\paragraph{Support}
|
||||
|
||||
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] \forall 1 \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] \forall 1 \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 \;
|
||||
$K \leftarrow \lbrace x_i \mid \left\lVert \mathtt{dom}(x_i)\right\rVert > 1 \rbrace$ \;
|
||||
\Si{$\exists dom(X_i)=\emptyset$}{$\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{FouilleEnProfondeurFiltrage}(\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{FouilleEnProfondeurFiltrage($\mathtt{dom}(x_1), \ldots, \mathtt{dom}(x_n)$)}
|
||||
\label{alg:fouilleproffiltrage}
|
||||
\end{algorithm}
|
||||
|
||||
\paragraph{Propagation des contraintes}
|
||||
|
||||
Méthode efficace pour obtenir la cohérence locale
|
||||
|
||||
\begin{itemize}
|
||||
\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
|
||||
\end{itemize}
|
||||
|
||||
\begin{algorithm}[H]
|
||||
\DontPrintSemicolon
|
||||
\Deb{
|
||||
$S \leftarrow \lbrace C_k \mid X_i \in Portée(C_k) \rbrace$\;
|
||||
\Tq{$S \neq \emptyset$}{
|
||||
Choisir une contrainte $C_k$ dans $S$\;
|
||||
Filtrer $C_k$\;
|
||||
\Si{la contrainte n'est pas satisfiable}{\Retour{Échec}}
|
||||
\PourCh{$X_j \mid dom(X_j) filtré$}{
|
||||
$S \leftarrow S \cup \lbrace C_a \mid X_j \in Portée(C_a) \rbrace$
|
||||
}
|
||||
$S \leftarrow S \setminus \lbrace C_k \rbrace$
|
||||
}
|
||||
\Retour{Succès}
|
||||
}
|
||||
\caption{PropagationDesContraintes($X_i,C_1,\ldots,C_m$)}
|
||||
\label{alg:propcontr}
|
||||
\end{algorithm}
|
||||
|
||||
\paragraph{Types de filtrage}
|
||||
|
||||
\begin{itemize}
|
||||
\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)$.
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
113
chapitre3.tex
113
chapitre3.tex
|
@ -1,6 +1,117 @@
|
|||
\section{Chapitre 3}
|
||||
\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"
|
||||
|
|
Loading…
Reference in a new issue