ajout fin chapitre 2 et chapitre 3

This commit is contained in:
François Pelletier 2018-02-26 20:50:39 -05:00
parent 07d0aa2726
commit adbb670cda
2 changed files with 227 additions and 4 deletions

View file

@ -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)$.

View file

@ -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"