From c185b516c785aa660734ccf31fe3bfd836268427 Mon Sep 17 00:00:00 2001 From: Vincent Nivoliers <vincent.nivoliers@univ-lyon1.fr> Date: Tue, 5 Mar 2019 18:20:54 +0100 Subject: [PATCH] premier jet du sujet --- Images/uf_example.png | Bin 0 -> 7792 bytes Images/uf_example.tex | 47 +++++++++++ Images/uf_fusion.png | Bin 0 -> 9078 bytes Images/uf_fusion.tex | 56 +++++++++++++ readme.md | 178 ++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 281 insertions(+) create mode 100644 Images/uf_example.png create mode 100644 Images/uf_example.tex create mode 100644 Images/uf_fusion.png create mode 100644 Images/uf_fusion.tex diff --git a/Images/uf_example.png b/Images/uf_example.png new file mode 100644 index 0000000000000000000000000000000000000000..fe96b2244a1a228e2b135bbcf6e26b0a00a56dff GIT binary patch literal 7792 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 R@qdQ_IvNJ*)vER}{{yc6;dcN4 literal 0 HcmV?d00001 diff --git a/Images/uf_example.tex b/Images/uf_example.tex new file mode 100644 index 0000000..15b2641 --- /dev/null +++ b/Images/uf_example.tex @@ -0,0 +1,47 @@ +\documentclass{standalone} +\usepackage{tikz} + +\begin{document} + +\tikzset{ + ufnode/.style={ + circle, + draw, + thick + }, + ufedge/.style={ + -latex, + thick + } +} + +\begin{tikzpicture} + \draw + (0,1) node[ufnode] (n0) {0} + (1,2) node[ufnode] (n1) {1} + (2,1) node[ufnode] (n2) {2} + (5,1) node[ufnode] (n3) {3} + (6,2) node[ufnode] (n4) {4} + (7,1) node[ufnode] (n5) {5} + (7,0) node[ufnode] (n6) {6} + (10,1) node[ufnode] (n7) {7} + (10,2) node[ufnode] (n8) {8} + (13,2) node[ufnode] (n9) {9} + ; + + \draw[ufedge] (n0) -- (n1) ; + \draw[ufedge] (n2) -- (n1) ; + \draw[ufedge] (n1) edge[loop above] (n1) ; + + \draw[ufedge] (n3) -- (n4) ; + \draw[ufedge] (n5) -- (n4) ; + \draw[ufedge] (n6) -- (n5) ; + \draw[ufedge] (n4) edge[loop above] (n4) ; + + \draw[ufedge] (n7) -- (n8) ; + \draw[ufedge] (n8) edge[loop above] (n8) ; + + \draw[ufedge] (n9) edge[loop above] (n9) ; +\end{tikzpicture} + +\end{document} diff --git a/Images/uf_fusion.png b/Images/uf_fusion.png new file mode 100644 index 0000000000000000000000000000000000000000..b2f723aed62e93af2e94046aa6eaa74cf4f430fc GIT binary patch literal 9078 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 S*ABHt24J9TqEoGfeDXhclU1Vt literal 0 HcmV?d00001 diff --git a/Images/uf_fusion.tex b/Images/uf_fusion.tex new file mode 100644 index 0000000..55aeb55 --- /dev/null +++ b/Images/uf_fusion.tex @@ -0,0 +1,56 @@ +\documentclass{standalone} +\usepackage{tikz} + +\begin{document} + +\tikzset{ + ufnode/.style={ + circle, + draw, + thick + }, + ufedge/.style={ + -latex, + thick + } +} + +\begin{tikzpicture} + \draw + (0,1) node[ufnode] (n00) {0} + (1,2) node[ufnode] (n10) {1} + (2,1) node[ufnode] (n20) {2} + (4,1) node[ufnode] (n30) {3} + (5,2) node[ufnode] (n40) {4} + (6,1) node[ufnode] (n50) {5} + (6,0) node[ufnode] (n60) {6} + + (0,1) +(10,0) node[ufnode] (n01) {0} + (1,2) +(10,0) node[ufnode] (n11) {1} + (2,1) +(10,0) node[ufnode] (n21) {2} + (4,1) +(10,0) node[ufnode] (n31) {3} + (5,2) +(10,0) node[ufnode] (n41) {4} + (6,1) +(10,0) node[ufnode] (n51) {5} + (6,0) +(10,0) node[ufnode] (n61) {6} + ; + + \draw[ufedge] (n00) -- (n10) ; + \draw[ufedge] (n20) -- (n10) ; + \draw[ufedge] (n10) -- (n40) ; + + \draw[ufedge] (n30) -- (n40) ; + \draw[ufedge] (n50) -- (n40) ; + \draw[ufedge] (n60) -- (n50) ; + \draw[ufedge] (n40) edge[loop above] (n4) ; + + \draw[ufedge] (n01) -- (n11) ; + \draw[ufedge] (n21) -- (n11) ; + \draw[ufedge] (n11) edge[loop above] (n11) ; + + \draw[ufedge] (n31) -- (n41) ; + \draw[ufedge] (n51) -- (n41) ; + \draw[ufedge] (n61) -- (n51) ; + \draw[ufedge] (n41) -- (n11) ; +\end{tikzpicture} + +\end{document} diff --git a/readme.md b/readme.md index 8a72264..374a1c1 100644 --- a/readme.md +++ b/readme.md @@ -1 +1,179 @@ # Structure Union Find et labyrinthes + +Le but de ce TP est d'aborder le problème de l'Union-Find, et la structure de +données associée, et de l'appliquer pour la création de labyrinthes. + +## Union Find + +Le problème de l'union find est de gérer des ensembles disjoints d'objets : un +objet ne peut pas appartenir à deux ensembles en même temps. Initialement, tous +les objets sont dans leur propre ensemble, qui ne contient qu'eux. Il est +ensuite proposé deux opérations : + +* l'*union* permet de joindre deux ensembles ; +* la *recherche* permet de déterminer si deux objets sont dans le même ensemble. + +## Application à la création de labyrinthe + +### Un labyrinthe intéressant + +Ce TP vous propose d'appliquer la notion d'union find à la création de +labyrinthes. Cette création de labyrinthes se base sur le principe suivant : + +* le labyrinthe est créé sur une grille carrée ; +* au début chaque case de la grille est entourée de murs ; +* petit à petit des murs sont abattus pour créer le labyrinthe. + +En appliquant naïvement ce principe, il est peu probable que le labyrinthe +obtenu soit intéressant. Tout d'abord, si le nombre de murs n'est pas important, +il est peu probable que l'entrée et la sortie du labyrinthe soient accessibles +par un chemin. Ensuite ce procédé va vider le labyrinthes de ses murs sans créer +les recoins tortueux qui rendent les labyrinthes intéressants. + + + +Pour obtenir un résultat plus intéressant, nous allons donc rajouter les deux +contraintes suivantes : + +* depuis toute case, il est possible d'aller à toute autre case ; +* il n'y a qu'un seul chemin possible pour aller d'une case à une autre. + +Les labyrinthes ainsi obtenus deviennent plus intéressants. + + + +C'est pour mettre en place ces contraintes que l'Union-Find devient utile. + +### Lien entre Union-Find et labyrinthes + +Le principe est de dire que deux cases sont dans le même ensemble s'il existe un +chemin pour aller de l'une à l'autre dans le labyrinthe. Initialement, toutes +les cases sont entourées de murs, et donc chaque case est dans son propre +ensemble qui ne contient qu'elle. + +Abattre le mur entre les cases $a$ et $b$ permet de créer un chemin entre ces +deux cases. Ainsi, pour s'assurer de ne jamais créer plus d'un chemin pour +aller d'une case à une autre, il suffit de ne jamais abattre de mur séparant des +cases qui sont déjà reliées par un chemin. On utilisera donc la *recherche* pour +déterminer si deux cases sont reliées par un chemin ou non. + +En créant un chemin entre la case $a$ et la case $b$, on crée en réalité des +chemins entre toutes les cases qu'on pouvait atteindre depuis $a$ et toutes les +cases qu'on pouvait atteindre depuis $b$. On réalise donc l'*union* de +l'ensemble contenant $a$ et de l'ensemble contenant $b$. + +## Implémentation + +Ce dépôt contient un code de base pour gérer les grilles les afficher, abattre +et monter des murs. Il vous reste donc à rajouter des fichiers pour la structure +d'Union-Find et tout ce que vous trouvez utile, et à compléter le constructeur +de la classe `Labyrinthe` pour abattre des murs et créer un labyrinthe +intéressant. + +### Union-Find + +#### Arbres + +Le principe de l'Union-Find est fondé sur des arbres, mais contrairement aux +arbres binaires que vous avez déjà manipulés, ces arbres stockent les liens de +parenté de bas en haut : chaque nœud connaît son *parent*. Par convention, le +parent de la racine de l'arbre est lui-même. Chaque arbre correspond à un +ensemble disjoint. Initialement, chaque élément est donc la racine de son propre +arbre, qui ne contient que lui. + + + +Dans l'exemple ci dessus, l'Union-Find contient 4 ensembles, $0$ est l'enfant de +$1$, $1$ est la racine de son arbre. + +Du point de vue de l'implémentation, le plus simple est d'identifier les $n$ +objets par les entiers de $[0,n-1]$. Un tableau `tab` d'entiers de taille $n$ +permet de stocker dans la case $i$ le numéro du parent de la case $i$. Dans +l'exemple précédent, nous aurions donc le tableau + +``` +[1, 1, 1, 4, 4, 4, 5, 8, 8, 9] +``` + +#### Recherche + +Chaque ensemble est identifié par la racine de l'arbre qui le représente. La +recherche consiste donc à suivre la chaîne de parents d'un nœud jusqu'à +atteindre la racine de l'arbre. Pour déterminer si deux nœuds sont dans le même +ensemble, on regarde si les racines de leurs arbres sont identiques. + +#### Union + +Pour unir deux ensemble, il suffit de s'assurer que deux arbres initialement +distincts finissent avec la même racine. Il suffit donc de faire en sorte que le +parent de l'une des deux racines devienne l'autre racine. + +Dans l'exemple précédent la fusion des deux premier arbres donnerait donc l'un +des deux arbres suivants + + + +Ce qui revient à renseigner 4 comme parent de 1 + +``` +[1, 4, 1, 4, 4, 4, ...] +``` + +ou à renseigner 1 comme parent de 4 + +``` +[1, 1, 1, 4, 1, 4, ...] +``` + +### Mise en place pour les labyrinthes + +Muni·e de cette base pour l'Union-Find, il est désormais possible de l'utiliser +pour nos labyrinthes. + +#### Mélange des murs + +Pour que les labyrinthes soient intéressants, il est nécessaire d'essayer +d'abattre l'ensemble des murs dans un ordre aléatoire. La première solution +naïve serait de tirer un mur au hasard, et s'il est debout d'essayer de +l'abattre. Dans la mesure où petit à petit il ne sera plus possible d'abattre la +majorité des murs, cette solution finira par coûter très cher pour abattre les +derniers murs, et il sera difficile également de savoir quand s'arrêter. + +La bonne solution consiste à créer une petite structure de votre choix pour +représenter un mur entre deux cases, et de stocker dans un tableau tous les murs +possibles. Vous pouvez ensuite mélanger ce tableau en utilisant l'algorithme vu +en cours, ou les fonctionnalités de la librairie standard. + +Une fois le tableau mélangé, vous pouvez le parcourir linéairement, et essayer +d'abattre chacun des murs qu'il contient. Après un passage, il n'est plus +possible d'abattre le moindre mur, et le labyrinthe respecte les contraintes. + +#### Utilisation de l'Union-Find + +Pour utiliser votre Union-Find, vous pouvez numéroter implicitement toutes les +cases de la grille en disant que la case à la ligne $l$ et la colonne $c$ est +associée au numéro $l \times \mathrm{largeur} + c$. + +À chaque mur traité, récupérez les racines des arbres Union-Find des cases de +part et d'autre. Si les racines sont les mêmes, les cases sont déjà reliées par +un chemin, et le mur doit rester en place, sinon vous pouvez l'abattre, et +fusionner les ensembles des deux cases. + +### Optimisation de l'Union-Find + +L'implémentation initiale de l'Union-Find proposée peut être coûteuse en terme +de complexité. Dans le pire des cas, les fusions sont réalisées dans un ordre +tel que les arbres sont en réalité des sortes de listes chaînées, qu'il faut +parcourir d'un bout à l'autre pour en trouver la racine. La complexité dans le +pire des cas pour une recherche est donc linéaire, et la fusion nécessitant de +trouver les racines des deux arbres a la même complexité. Ces complexités +peuvent être nettement améliorées grâce à deux idées simples à mettre en œuvre. + +#### Compression de chemin + +Lorsque vous cherchez la racine d'un arbre, vous partez d'un nœud et sautez de +nœud en nœud pour la trouver. La compression de chemin fait en sorte qu'une fois +la racine trouvée, tous les nœuds sur le chemin changent de parent, pour prendre +directement la racine pour parente. + +#### Minimisation des hauteurs -- GitLab