ajout chapitre 6 et section chapitre 7
This commit is contained in:
parent
e5e878beb6
commit
97335d9538
7 changed files with 325 additions and 7 deletions
|
@ -0,0 +1,10 @@
|
|||
@book{papadimitriou2013combinatorial,
|
||||
title={Combinatorial Optimization: Algorithms and Complexity},
|
||||
author={Papadimitriou, C.H. and Steiglitz, K.},
|
||||
isbn={9780486320137},
|
||||
series={Dover Books on Computer Science},
|
||||
url={https://books.google.com/books?id=BSPCAgAAQBAJ},
|
||||
year={2013},
|
||||
publisher={Dover Publications}
|
||||
}
|
||||
|
|
@ -208,11 +208,6 @@ On vérifie si pour chaque arête, il existe une chemin de longueur $l$ reliant
|
|||
|
||||
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)$.
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
%%% Local Variables:
|
||||
%%% mode: latex
|
||||
%%% TeX-master: "notes_de_cours"
|
||||
|
|
|
@ -28,8 +28,82 @@ Techniques additionnelles
|
|||
\subsection{Heuristiques de choix de valeurs}
|
||||
\label{sec:choixvaleurs}
|
||||
|
||||
\begin{itemize}
|
||||
\item Le choix dépend souvent d'une connaissance du problème. On peut trier les valeurs du premier choix au dernier choix.
|
||||
\item Déviation: solveur branche sur une valeur qui n'est pas le premier choix
|
||||
\end{itemize}
|
||||
|
||||
\subsection{Fouille LDS}
|
||||
\label{sec:fouillelds}
|
||||
|
||||
\begin{algorithm}[H]
|
||||
\DontPrintSemicolon
|
||||
\Deb{
|
||||
$Candidats \leftarrow \lbrace X_i \mid |dom(X_i)| >1 \rbrace$ \;
|
||||
\Si{$Candidats = \emptyset$}{
|
||||
\Si{$dom(X_1),\ldots,dom(X_n)$ sat. contraintes}{
|
||||
\Retour{$dom(X_1),\ldots,dom(X_n)$}
|
||||
}
|
||||
\Sinon{
|
||||
\Retour{$\emptyset$}
|
||||
}
|
||||
}
|
||||
Choisir une variable $X_i \in Candidats$ \;
|
||||
\Si{$nbDeviations < |Candidats|$}{
|
||||
$Solution \leftarrow LDS(dom(X_1),\ldots,dom(X_{i-1}),\lbrace v_1 \rbrace, \ldots, dom(X_n)4,nbDeviations)$ \;
|
||||
\Si{$Solution \neq \emptyset$}{\Retour{$Solution$}}
|
||||
}
|
||||
\Si{$nbDeviations>0$}{
|
||||
$Solution \leftarrow LDS(dom(X_1),\ldots,dom(X_{i-1}),\lbrace v_2 \rbrace, \ldots, dom(X_n),nbDeviations)$ \;
|
||||
\Si{$Solution \neq \emptyset$}{\Retour{$Solution$}}
|
||||
}
|
||||
\Retour{$\emptyset$} \;
|
||||
}
|
||||
\caption{LDS($dom(X_1),\ldots,dom(X_n)$,nbDeviations)}
|
||||
\end{algorithm}
|
||||
|
||||
\subsection{Redémarrage}
|
||||
\label{sec:redemarrage}
|
||||
|
||||
\begin{itemize}
|
||||
\item Heuristique stochastique: après un certain temps ou un certain nombre de retours arrières, on redémarre la recherche
|
||||
\item Possibilité de visiter deux fois le même noeud: risque à prendre, inefficace, mais acceptable
|
||||
\item Si on ne fait pas attention: possibilité de ne jamais visiter une branche de l'arbre, inacceptable
|
||||
\end{itemize}
|
||||
|
||||
Stratégies de redémarrage:
|
||||
|
||||
Garantissent que la totalité de l'arbre est visité
|
||||
\begin{itemize}
|
||||
\item Géométrique: $1, r, r^2, r^3, ... | r>1$
|
||||
\item Luby: $1,1,2,1,1,2,4,1,1,2,1,1,2,4,8, \ldots$ nombre de retours arrières est à un facteur logarithmique de la séquence optimale
|
||||
\end{itemize}
|
||||
|
||||
\subsection{Nogoods}
|
||||
\label{sec:nogoods}
|
||||
|
||||
\begin{itemize}
|
||||
\item Cette stratégie réduit la possibilité de revisiter des noeuds
|
||||
\item Contrainte ajoutée au modèle, prévient un second retour arrière pour les mêmes raisons
|
||||
\item Un noeud est identifié par un ensemble de contraintes de branchement $p(n)= \lbrace b1, \ldots, b_j\rbrace$
|
||||
\item Soit $n$ le noeud où le retour arrière est déclenché sans avoir visité ses descendants. Au moins une contrainte a été violée.
|
||||
\begin{align}
|
||||
J(n) = \lbrace b_i \in p(n) \mid portée(bi) \cap portée(C) \neq \emptyset \rbrace
|
||||
\end{align}
|
||||
\item Si un retour arrière se produit sur chacun des enfants $c_1, \ldots, c_k$ de $n$
|
||||
\begin{align}
|
||||
J(n) = p(n) \bigcup_{i=1}^k J(c_i)
|
||||
\end{align}
|
||||
\item Favoriser l'arité du nogood la plus petite
|
||||
\item Gestion: Effacer ...
|
||||
\begin{itemize}
|
||||
\item les plus vieux,
|
||||
\item les moins appelés,
|
||||
\item ceux avec arité la plus grande
|
||||
\end{itemize}
|
||||
\end{itemize}
|
||||
|
||||
Les solveurs SAT utilisent des heuristiques d'apprentissage, le redémarrage et des nogoods
|
||||
|
||||
|
||||
|
||||
|
|
218
chapitre7.tex
218
chapitre7.tex
|
@ -1,7 +1,223 @@
|
|||
|
||||
\section{Chapitre 7:}
|
||||
\section{Chapitre 7: Problème du flot maximum}
|
||||
\label{sec:ch7}
|
||||
|
||||
Référence: \cite{papadimitriou2013combinatorial}
|
||||
|
||||
\subsection{Les graphes orientés}
|
||||
\label{sec:graphesorientes}
|
||||
|
||||
\begin{itemize}
|
||||
\item Un graphe est un tuple $(V,E)$ formé de \textbf{sommets} $V$ et d'\textbf{arêtes} $E \subseteq V \times V$.
|
||||
\item Une arête est représentée par une paire de sommets. Ces sommets sont \textbf{adjacents}.
|
||||
\item Un graphe peut avoir des \textbf{poids} sur ses arêtes.
|
||||
\item Un \textbf{chemin} est une suite de sommets distincts. Il a une \textbf{origine} et une \textbf{destination}.
|
||||
\item Un \textbf{cycle} est une suite de sommets distincts dont le dernier sommet est adjacent au premier.
|
||||
\item Liste de proximité: Tableau $Adj$ dont chaque élément $Adj[i]$ pointe sur une liste qui contient les sommets adjacents. Cette liste peut être doublement chaînée
|
||||
\end{itemize}
|
||||
|
||||
\subsection{Fouille en profondeur}
|
||||
\label{sec:fouilleprofondeur}
|
||||
|
||||
\begin{itemize}
|
||||
\item Code de couleurs: Blanc=non visité, Gris=visite non complétée, Noir=visite complétée
|
||||
\item Vecteur parent: Encode une forêt. $u$ est le parent de $v$ = $Parent[v]=u$
|
||||
\item Complexité:
|
||||
\begin{table}[!ht]
|
||||
\centering
|
||||
\begin{tabular}{l|l}
|
||||
Étape & Complexité \\
|
||||
\hline
|
||||
Initialisation & $\mathcal{O}(|V|)$ \\
|
||||
Visite & $|V|$ \\
|
||||
Arête & $|E|$ \\
|
||||
\hline
|
||||
\textbf{Total} & $\mathcal{O}(|V|+|E|)$
|
||||
\end{tabular}
|
||||
\caption{Complexité de la fouille en profondeur}
|
||||
\label{tab:compfouilleprof}
|
||||
\end{table}
|
||||
\end{itemize}
|
||||
|
||||
|
||||
\begin{algorithm}[!ht]
|
||||
\Deb{
|
||||
\PourTous{$u \in V$}{
|
||||
$Couleur[u] \leftarrow Blanc$ \;
|
||||
$Parent[u] \leftarrow Nul$ \;
|
||||
}
|
||||
\PourTous{$u \in V$}{
|
||||
\Si{$Couleur[u]=Blanc$}{
|
||||
Visite$(u,V,E)$ \;
|
||||
}
|
||||
}
|
||||
}
|
||||
\caption{FouilleProfondeur$(V,E)$}
|
||||
\end{algorithm}
|
||||
|
||||
\begin{algorithm}[!ht]
|
||||
\Deb{
|
||||
$Couleur[u]=Gris$ \;
|
||||
\Pour{$v \in Adj[u]$}{
|
||||
\Si{$Couleur[u]=Blanc$}{
|
||||
$Parent[v] \leftarrow u$ \;
|
||||
Visite$(v,V,E)$ \;
|
||||
}
|
||||
}
|
||||
$Couleur[u]=Noir$
|
||||
}
|
||||
\caption{Visite$(u,V,E)$}
|
||||
\end{algorithm}
|
||||
|
||||
Pour trouver un chemin entre $s$ et $t$, on exécute seulement la fouille en profondeur sur l'origine $s$. Si $t$ est nul, il n'y a pas de chemin de $s$ vers $t$.
|
||||
|
||||
\subsection{Problème du flot maximum}
|
||||
\label{sec:flotmaximum}
|
||||
|
||||
Définition du problème:
|
||||
\begin{itemize}
|
||||
\item $s$: Source
|
||||
\item $t$: Puits
|
||||
\item $c(a,b)$: Capacité
|
||||
\item $f(a,b)=-f(b,a)$: Flot
|
||||
\item Instance: $FlotMaximum(G=(V,E),s,t,c)$
|
||||
\end{itemize}
|
||||
|
||||
Contraintes: un flot valide satisfait ces contraintes
|
||||
\begin{itemize}
|
||||
\item Conservation du flot:
|
||||
\begin{align}
|
||||
\sum_{b \mid (b,a) \in E} f(b,a) &= \sum_{b \mid (a,b) \in E} f(a,b) & \forall a \in V \setminus \lbrace s,t \rbrace
|
||||
\end{align}
|
||||
\item Ce qui équivaut à:
|
||||
\begin{align}
|
||||
\sum_{b \in V} f(a,b) &= 0 & \forall a \in V \setminus \lbrace s,t \rbrace
|
||||
\end{align}
|
||||
\item Contrainte de capacité:
|
||||
\begin{align}
|
||||
f(a,b) &\leq c(a,b) & \forall (a,b) \in E \\
|
||||
f(a,b) &\leq 0 & \forall (a,b) \notin E
|
||||
\end{align}
|
||||
\end{itemize}
|
||||
|
||||
Le problème du flot maximum consiste à trouver un flot valide dont la valeur est maximale
|
||||
\begin{align}
|
||||
v(f) &= \sum_{a \in V}f(s,a)\\
|
||||
&= \sum_{a \in V} f(a,t)
|
||||
\end{align}
|
||||
|
||||
Représentation graphique
|
||||
|
||||
\begin{figure}[!ht]
|
||||
\centering
|
||||
\includegraphics[width=12cm]{exemple_flot}
|
||||
\caption{Représentation graphique d'un flot}
|
||||
\label{fig:grapheflot}
|
||||
\end{figure}
|
||||
|
||||
\subsection{Chemins augmentant}
|
||||
\label{sec:cheminsaugmentant}
|
||||
|
||||
Objectif: Identifier les chemins augmentants dans le graphe résiduel
|
||||
|
||||
\paragraph{Graphe résiduel}
|
||||
\begin{itemize}
|
||||
\item Utilisé pour identifier les chemins reliant la source au puits
|
||||
\item Mêmes noeuds que le graphe original, mais les arêtes peuvent avoir un poids et une orientation différente
|
||||
\item Notation: $G_f = (V, E_f)$
|
||||
\item Existence d'une arête dans le graphe résiduel
|
||||
\begin{align}
|
||||
(a,b) \in E_{f} \iff f(a,b) < c(a,b)
|
||||
c_f(a.b) = c(a,b) - f(a.b)
|
||||
\end{align}
|
||||
\item Chemin augmentant: relie la source au puits dans le graphe résiduel. Non nul
|
||||
\end{itemize}
|
||||
|
||||
Exemple de graphe résiduel (Figure \ref{fig:grapheresiduel})
|
||||
|
||||
\begin{figure}[h]
|
||||
\centering
|
||||
\includegraphics[width=7cm]{exemple_flot_residuel}
|
||||
\caption{Graphe résiduel}
|
||||
\label{fig:grapheresiduel}
|
||||
\end{figure}
|
||||
|
||||
\clearpage
|
||||
|
||||
\subsection{Algorithme de Ford-Fulkerson}
|
||||
\label{sec:fordfulkerson}
|
||||
|
||||
\begin{algorithm}[h]
|
||||
\Deb{
|
||||
\Pour{$i \in \binom{|V|}{2}$}{
|
||||
$f[i] \leftarrow 0$
|
||||
}
|
||||
\Repeter{aucun chemin entre $s$ et $t$ dans $G_f$}{
|
||||
Construire $G_f$ \;
|
||||
Trouver le chemin $C$ de $s$ à $t$ avec une fouille en profondeur \;
|
||||
\Si{$\exists C$}{
|
||||
$q=min(c_f(a,b)) | (a,b) \in C$ \;
|
||||
\PourTous{$(a,b) \in C$}{
|
||||
$f(a,b) \leftarrow f(a,b)+q$ \;
|
||||
$f(b,a) \leftarrow f(b,a)-q$ \;
|
||||
}
|
||||
}
|
||||
}
|
||||
\Retour{f} \;
|
||||
}
|
||||
\caption{Ford-Fulkerson}
|
||||
\end{algorithm}
|
||||
|
||||
Complexité:
|
||||
|
||||
\begin{table}[h]
|
||||
\centering
|
||||
\begin{tabular}{l|l}
|
||||
Étape & Complexité \\
|
||||
\hline
|
||||
Chemin dans le graphe résiduel & $\mathcal{O}(|V|+|E|), |V|-1 \leq |E| \rightarrow \mathcal{O}(|E|)$ \\
|
||||
Mise à jour du graphe résiduel & $\mathcal{O}(|V|)$ \\
|
||||
\hline
|
||||
\textbf{Total} & $\mathcal{O}(v(f)|E|)$
|
||||
\end{tabular}
|
||||
\caption{Complexité de Ford-Fulkerson}
|
||||
\label{tab:compfouilleprof}
|
||||
\end{table}
|
||||
|
||||
\subsection{Coupe minimale}
|
||||
\label{sec:coupeminimale}
|
||||
|
||||
\begin{itemize}
|
||||
\item Une coupe est une bipartition des noeuds tel que la source est dans $S$ et le puits dans $T$
|
||||
\item Capacité d'une coupe
|
||||
\begin{align}
|
||||
c(S,T) &= \sum_{a \in S} \sum_{b \in T} c(a,b)
|
||||
\end{align}
|
||||
\item Flot net d'une coupe: quantité de flot passant d'un noeud dans $S$ à un noeud dans $T$:
|
||||
\begin{align}
|
||||
f(S,T) &= \sum_{a\in S, b\in T} f(a,b)
|
||||
\end{align}
|
||||
\item Théorème: Pour toute coupe $(S,T)$ et tout flot valide $f$: $v(f)=f(S,T)$
|
||||
\end{itemize}
|
||||
|
||||
Trois affirmations équivalentes:
|
||||
|
||||
\begin{enumerate}
|
||||
\item $f$ est un flot maximum dans $G$
|
||||
\item Le graphe résiduel $G_f$ n'a pas de chemin augmentant
|
||||
\item Il existe une coupe $(S,T)$ dont la capacité $c(S,T)$ est égale a $v(f)$
|
||||
\end{enumerate}
|
||||
|
||||
En résumé:
|
||||
|
||||
\begin{itemize}
|
||||
\item
|
||||
\end{itemize}
|
||||
|
||||
\subsection{Ordonnancement}
|
||||
\label{sec:ordonnancement}
|
||||
|
||||
|
||||
|
||||
|
||||
%%% Local Variables:
|
||||
|
|
10
exemple_flot.dot
Normal file
10
exemple_flot.dot
Normal file
|
@ -0,0 +1,10 @@
|
|||
digraph {
|
||||
rankdir="LR";
|
||||
1->2[label="3/3"]
|
||||
1->3[label="4/7"]
|
||||
2->4[label="2/2"]
|
||||
2->5[label="1/2"]
|
||||
3->5[label="4/4"]
|
||||
4->6[label="2/3"]
|
||||
5->6[label="5/5"]
|
||||
}
|
5
exemple_flot_residuel.dot
Normal file
5
exemple_flot_residuel.dot
Normal file
|
@ -0,0 +1,5 @@
|
|||
digraph {
|
||||
1->3[label="3/7"]
|
||||
2->5[label="1/2"]
|
||||
4->6[label="1/3"]
|
||||
}
|
10
makefile
10
makefile
|
@ -1,10 +1,16 @@
|
|||
build: notes_de_cours.pdf
|
||||
|
||||
exemple_flot.png:
|
||||
dot -Tpng /media/francois/MEGA5TO/git/ift7020_notes_de_cours/exemple_flot.dot -o /media/francois/MEGA5TO/git/ift7020_notes_de_cours/exemple_flot.png
|
||||
|
||||
exemple_flot_residuel.png:
|
||||
dot -Tpng /media/francois/MEGA5TO/git/ift7020_notes_de_cours/exemple_flot_residuel.dot -o /media/francois/MEGA5TO/git/ift7020_notes_de_cours/exemple_flot_residuel.png
|
||||
|
||||
notes_de_cours.pdf: notes_de_cours.bbl
|
||||
pdflatex notes_de_cours.tex
|
||||
pdflatex notes_de_cours.tex
|
||||
|
||||
notes_de_cours.bbl: notes_de_cours.tex
|
||||
notes_de_cours.bbl: notes_de_cours.tex exemple_flot.png exemple_flot_residuel.png
|
||||
pdflatex notes_de_cours.tex
|
||||
bibtex notes_de_cours.aux
|
||||
|
||||
|
@ -20,3 +26,5 @@ clean:
|
|||
-rm *.out
|
||||
-rm *.toc
|
||||
-rm *.pdf
|
||||
-rm exemple_flot.png exemple_flot_residuel.png
|
||||
|
||||
|
|
Loading…
Reference in a new issue