226 lines
6.2 KiB
TeX
226 lines
6.2 KiB
TeX
|
|
\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:
|
|
%%% mode: latex
|
|
%%% TeX-master: "notes_de_cours"
|
|
%%% End:
|