\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: