Décrit un graphe de flux, à savoir un graphe orienté ayant une source et un puit. C'est-à-dire un sommet avec uniquement des arètes sortantes (resp. rentrantes), et pour chaque arète (u, v), il n'existe pas d'arète (v, u) existante. Chaque arète possède une capacité $c > 0$.
Décrit un graphe de flux, à savoir un graphe orienté ayant une source et un puit. C'est-à-dire un sommet avec uniquement des arètes sortantes (resp. rentrantes), et pour chaque arète (u, v), il n'existe pas d'arète (v, u). Chaque arète possède une capacité $c > 0$.
\item\textbf{ResidualGraph}(FlowingGraph) \jmpi\\
Décrit un graphe de flux particulier obtenu à partir d'un graphe de flux, à capacité ou à flux (flow/capacité), telle que pour chaque arète ($u, v$), il existe son chemin retour ($v, u$) dont on aura calculé la capacité à partir de celle initiale (ou du flux initial). \jmpi\\
Cette structure est tout spécialement utilisé notamment pour calculer à partir d'un graphe de flux (\textit{FlowingGraph}), un flux maximum en utilisant l'algorithme d'Edmonds-Karp à partir de l'algorithme de parcours en largeur, révisé pour le graphe résiduel.
Cette structure est tout spécialement utilisée notamment pour calculer à partir d'un graphe de flux (\textit{FlowingGraph}), un flux maximum en utilisant l'algorithme d'Edmonds-Karp à partir de l'algorithme de parcours en largeur, révisé pour le graphe résiduel.
\end{itemize}
\section{Algorithme d'Edmonds-Karp}
\subsection{Breadth First Search de graphe orienté}
...
...
@@ -187,10 +187,14 @@
\end{flushleft}
\subsection{Gestion d'un graphe résiduel}
\begin{justify}
Pour gérer les graphes résiduels, nous utiliserons une classe \textit{ResidualGraph} qui se construit à partir d'un graphe parent de type \textit{FlowingGraph}. Durant la construction, le graphe construira pour chaque arète $(u, v)$ du père, une arète $(v, u)$ de poid nul si les arètes du parent ont pour label des entiers pour capacité, sinon, on effectue le calcul de flot en fonction du label $\frac{\text{flux}}{\text{capacité}}$. \\
Pour gérer les graphes résiduels, nous utiliserons une classe \textit{ResidualGraph} qui se construit à partir d'un graphe parent de type \textit{FlowingGraph}. Durant la construction, le graphe construira pour chaque arète $(u, v)$ du père, une arète $(v, u)$ qui sera:
\begin{itemize}[label=-]
\item de poid nul si les arètes du graphe initial ont des valeurs entières en label
\item d'un poid qu'on calculera selon les valeurs $\frac{\text{flux}}{\text{capacité}}$
\end{itemize}
\jmpi
\noindent
La classe \textit{ResidualGraph} possède des fonctions utiles dont notamment la fonction de parcours en largeur utilisé pour l'algorithme d'Edmonds-Karp ainsi qu'une fonction pour déterminer, au fur et à mesure des changements opérés, si le puit est atteignable depuis une source $s$.
La classe \textit{ResidualGraph} possède des fonctions utiles dont notamment la fonction de parcours en largeur utilisée pour l'algorithme d'Edmonds-Karp ainsi qu'une fonction pour déterminer, au fur et à mesure des changements opérés, si le puit est atteignable depuis une source $s$.
\end{justify}
\subsection{Implémentation et résultats}
\begin{justify}
...
...
@@ -287,23 +291,23 @@
\end{figure}
Dans un premier temps on regarde si l'on peut créer un graphe orienté qui réalise cette séquence.Pour cela, on regarde si notre
séquence contient pas un nombre plus grand ou égal au nombre de sommets, car un sommet peut etre au maximum connecté à tous les autres.De plus
on regarde si la somme des degrès entrants est égal à la somme des degrès sortant car il est impossible que le flot sortant de la source soit
différent de celui qui entre dans le puit. Une fois toute ces vérifications faites nous pouvons créer un graphe correspodant à la séquence, pour
cela nous commencons par modéliser le problème en un problème de flot max. On crée donc un digraph avec 10 sommets parmis lesquels un sera la
source et un le puit. Puis les 8 autres sommets seront les sommets de la séquence deux fois reproduits.On fait donc partir de la source des arêtes
qui vont jusqu'a les sommets d'une des deux séquences et l'on met sur ces arêtes les labels qui correspondent au degres sortant du sommet en question
dans la séquence, puis on fait partir de lautre séquence des arêtes qui vont jusqu'au puit, avec comme label celui du degrès sortant du sommet
en question dans la séquence.
séquence contient pas un nombre plus grand ou égal au nombre de sommets, car un sommet peut-être au maximum connecté à tous les autres.De plus,
on regarde si la somme des degrès entrants est égale à la somme des degrès sortant car il est impossible que le flot sortant de la source soit
différent de celui qui entre dans le puit. Une fois toute ces vérifications faites, nous pouvons créer un graphe correspodant à la séquence. Pour
cela, nous commencons par modéliser le problème en un problème de flot maximum. On crée donc un digraph avec 10 sommets parmis lesquels l'un sera la
source et un autre, le puit. Puis les 8 autres sommets seront les sommets de la séquence deux fois reproduits.On fait donc partir de la source des arètes
qui vont jusqu'aux sommets d'une des deux séquences et l'on met sur ces arètes les labels qui correspondent au degrès sortant du sommet en question
dans la séquence, puis on fait partir de l'autre séquence des arètes qui vont jusqu'au puit, avec comme label celui du degrès sortant du sommet
en question dans la séquence. Puis entre chaque sommet des 2 séquences, on crée des arètes qui relient chaque sommet de la séquence à chaque sommet de l'autre séquence, sauf si le sommet en question est identique et on met un label de $1$ sur toutes ces arètes.
\begin{figure}[h]
\centering
\includegraphics[scale=0.75]{figure_3.png}
\caption{Graphe de flot obtenu en transformant la séquence en graphe}
\includegraphics[scale=0.7]{figure_3.png}
\caption{Graphe de flot obtenu en transformant la séquence en graphe de problème de flots}
\end{figure}
\noindent
Puis entre chaque sommet des 2 séquences, on crée des arètes qui relient chaque sommet de la séquence à chaque sommet de l'autre séquence, sauf si le sommet en question est identique et on met un label de $1$ sur toutes ces arètes. Une fois le problème modélisé en un problème de flot, on fait appel à l'algorithme d'Edmonds-Karp qui va retourner le flot maximum du graphe que l'on vient de créer grâce à la séquence.
Une fois le problème modélisé en un problème de flot, on fait appel à l'algorithme d'Edmonds-Karp qui va retourner le flot maximum du graphe que l'on vient de créer grâce à la séquence.