• Aucun résultat trouvé

santes fortements connexes . . . 148 A.1.3 Adaptation à la recherche de polygones . . . 151

A.2 Fixer le paramètre de rugosité . . . 157 A.3 Utilisation dans T-UGOm . . . 158 A.4 Conclusion partielle . . . 161

A.1

Recherche des polygones

[Szwarcfiter et Lauer, 1975, Szwarcfiter et Lauer, 1976] proposent un algorithme de recherche des cycles élémentaires dans un graphe orienté. Un graphe orienté est un en- semble de nœuds relié entre eux par des arêtes orientées, de telle sorte qu’elles peuvent être parcourues dans un sens mais pas dans l’autre.

Définition A.1.1. Soient a et b deux nœuds d’un graphe. Il existe un chemin de a vers b

dans le graphe, noté a → b si et seulement si, pour n ∈ N, il existe une suite de sommets, éventuellement vide, s1, s2, . . . , sntelle que (a, s1) , (s1, s2) , . . . , (sn, b) sont des arrêtes du

graphe. Un cycle F est un ensemble de nœuds du graphes tels que ∀v ∈ F, v → v. Le cycle est élémentaire lorsque le chemin ne passe qu’une fois par chaque sommet.

Pour plus de détails sur la notion de graphe, voir [Berge, 1983].

Dans notre cas, nous avons un ensemble de points, interconnectés par des segments. En utilisant les points comme les sommets d’un graphe et en associant à chaque segment deux arêtes orientés, une parcourant le segment dans un sens, l’autre dans le sens inverse, alors un polygone est un cycle élémentaire du graphe ainsi définit, ce qui nous permet alors d’appliquer l’algorithme tel quel.

A.1.1

Recherche des cycles élémentaires

Soient :

– B l’ensemble des booléens ;

– A la liste des adjacences de chaque sommet ; – B un ensemble de listes, une par sommet ; – N le nombre de nœuds dans le graphe ;

– marque indique pour chaque sommet s’il est marqué ou non ;

– atteint un tableau de booléens, indiquant, pour chaque sommet, s’il a été traité ou non.

L’algorithme nécesite deux procédures utilitaires, présentées dans les algorithmes A.1 et A.2.

Algorithme A.1 Procédure noncycle

Entrées : (x, y) ∈ (N?)2 insérer x dans B (y) supprimer y de A (x)

L’algorithme de recherche exhaustive des cycles élémentaires dans un graphe fortement connexe est donné par l’algorithme A.3.

Enfin, l’algorithme A.4 permet de rechercher l’ensemble des cycles élémentaires dans un graphe quelconque.

Algorithme A.2 Procédure démarquer

Entrées : x ∈ N? marque(x) ← faux

pour tout y ∈ B(x) faire

insérer x dans A (y)

si marque(y) alors

démarquer (y)

fin si fin pour

vider B (x)

Soient N le nombre de sommets, M le nombre d’arrêtes et C le nombre de cycles élé- mentaires, [Szwarcfiter et Lauer, 1975, Szwarcfiter et Lauer, 1976] indiquent que la com- plexité en temps de l’algorithme est O (N + (C + 1) M) et sa complexité en espace est O(N + M) – pour la notion de complexité en algorithmique, voir [Cormen et al., 2004]. Fondamentalement, la structure de points reliés par des segments est un graphe non- orienté et associer à un segment deux arrêtes, l’une parcourant le segment dans un sens et l’autre dans le sens opposé, est la méthode classique pour assimiler un graphe non-orienté à un graphe orienté (voir [Berge, 1983]). Cette approche n’entraîne pas de modification de coût, ni en temps ni en espace.

Dans le cas d’un graphe orienté, deux sommets reliés par deux arrêtes (donc l’une par- courue dans un sens et l’autre dans le sens opposé) forment un cycle élémentaire. Or, en transformant le graphe non-orienté en graphe orienté, toutes les arêtes sont dédoublées, de sorte que chaque arrête donne naissance à un cycle élémentaire. Cependant, dans un graphe non-orienté, un cycle est nécessairement composé d’au moins trois points et d’au moins trois arêtes, il est donc aisé de palier à ce problème simplement en ne stockant pas les cycles composés uniquement de deux sommets. De plus, chaque arête ayant été dédoublée pour passer d’un graphe non-orienté à un graphe orienté, chaque cycle sera détecté deux fois. Donc, avant de stocker un cycle, il faudra s’assurer qu’il n’a pas déjà été trouvé. Ceci ne modifie pas les réactions de l’algorithme, puisqu’il ne s’agit que de stocker où non un cycle élémentaire qui a été détecté. Dans la mesure où l’algorithme recherche des cycles élémentaires, c’est-à-dire que chaque sommet du cycle ne doit être parcouru qu’une fois, il conserve sa justesse telle que présentée dans [Szwarcfiter et Lauer, 1975, Szwarcfiter et Lauer, 1976].

Dans l’algorithme A.4, la dernière boucle s’effectue sur tous les composants fortement connectés du graphe et il faut y chercher le nœud de plus grand degré, c’est-à-dire duquel entrent et sortent le plus d’arêtes. Ceci nécessite la mise au point d’un nouvel algorithme.

Algorithme A.3 Fonction cycle

Entrées : (v, q1) ∈ (N?) 2

Sorties : vrai si au moins un cycle élémentaire dans la composante fortement connexe contenant v a été trouvé, faux sinon

f ∈ B

(q, t) ∈ (N?)2

position : tableau indiquant pour chaque sommet du graphe sa position dans la pile ; il doit garder ses valeurs d’un appel de la fonction à l’autre

marque(v) ← vrai f ← faux

empiler v

t ←nombre de sommets dans la pile position(v) ← t si atteint(v) alors q ← q1 sinon q ← t fin si

pour tout w ∈ A(v) faire si ¬marque(w) alors si cycle (w, q) alors f ← vrai sinon noncycle (v, w) fin si

sinon si position(w) ≤ q alors

la chaîne passant de v à w telle que stockée dans la pile est un cycle élémentaire f ← vrai sinon noncycle (v, w) fin si fin pour dépiler v si f alors démarquer (v) fin si atteint(v) ← vrai position(v) ← N + 1 retourner f

Algorithme A.4 Recherche de l’ensemble des cycles élémentaires d’un digraphe

Entrées : A contient la liste des adjacences des composants fortements connexes d’un digraphe D

b ∈ B

pour j variant de 1 à N par pas de 1 faire

marque(j) ← faux atteint(j) ← faux

fin pour

pour tout composant fortement connecté non trivial faire

s ←sommet du composant actuel de plus grand degré b ←cycle (s, 0)

fin pour

Documents relatifs