Skip to content
Snippets Groups Projects
Verified Commit c7dc957b authored by Rin BAUDELET's avatar Rin BAUDELET
Browse files

Last commit before submitting the project

parent d5a136aa
No related branches found
No related tags found
No related merge requests found
# UCA L3 - Optimisation des Graphes [TP]
> par **Rin Baudelet** et **Léna Combronde**
***
## Description
Travaux pratiques d'optimisation des graphes avec pour objectif d'implémenter l'algorithme
d'Edmonds-Karp ainsi que la conversion d'une séquence en un problème de flots.
> ### Dépendance
> ***
> **Python** version 3.9+ <br/>
> **SageMath** ~= 9.2 <br/>
> **Jupyter** Notebooks
## Organisation
- ### Sources files
- **(root)** <br/> contient le fichier main.py ainsi que les fichiers de configurations du projet
- **/ucagraphs** <br/> contient les fonctions usuelles (@see \_\_init\_\_.py)
- **/flowgraph** <br/> contient les différentes classes utiles pour le reste du
programme, dont notamment la partie sur Edmonds-Karp.
- ### Notebooks
> Contient notamment les notebooks jupyter utilisés pour les tests de fonctions et affichage des résultats
- **edmonds\_karp.ipynb** contient les résultats de l'utilisation de l'algorithme d'Edmonds-Karp sur la première figure
- **degrees\_sequence.ipynb** contient les résultats de la transformation de la sequence {(3,2),(3,2),(1,2),(1,2)} en problème de flots.
- ### Models
> contient l'implémentation des différentes figures nécessaires pour ces travaux.
- ### Latex
> contient le fichier source pour la génération du rapport de TP.
\ No newline at end of file
No preview for this file type
......@@ -119,10 +119,10 @@
\subsection{Classes}
\begin{itemize}[label=]
\item \textbf{FlowingGraph}(DiGraph) \jmpi \\
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 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.
séquence contient pas un nombre plus grand ou égal au nombre de sommets, car un sommet peuttre 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.
\begin{figure}[h]\label{fig:figure_4}
\centering
\includegraphics[scale=0.7]{figure_4.png}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment