Algorithmique et Programmation
Projet : Arbres couvrants minimaux par l’algorithme de Kruskal
et application au probl`eme du voyageur de commerce
Ecole normale sup´erieure
D´epartement d’informatique
2011-2012
Dans un graphe non-oriene pond´er´e G= (V, E, w), un arbre couvrant minimal Aest un ensemble
d’arˆetes de Gqui :
i) est un arbre (c’est-`a-dire connexe et acyclique)
ii) touche tous les sommets de G(c’est “couvrant”)
iii) est de poids minimal, c’est-`a-dire que X
{u,v}∈A
w(u, v) est minimal
1 Algorithme de Kruskal pour l’arbre couvrant minimal
L’algorithme de Kruskal (voir [1, §24.2]) est un algorithme glouton. Il construit une forˆet dont tous
les ´el´ements finissent par fusionner pour former un arbre couvrant. Pour cela, il maintient une partition
P⊆ P(S) des nœuds S. Voici le pseudo-code de l’algorithme de Kruskal :
1: function ACM-Kruskal(G)
2: A0← ∅
3: P← ∅
4: for each xVdo MakeSet(P, x)
5: trier Epar ordre croissant de poids w
6: for all {s, t} ∈ E(dans l’ordre) do
7: if Find(P, s)6=Find(P, t)then
8: A0A0∪ {{s, t}}
9: Union(P, s, t)
10: end if
11: end for
12: end function
13: return A
Je vous renvoie au Cormen pour une preuve de correction.
Union-Find. L’algorithme de Kruskal est efficacement impl´emene avec la structure de donn´ee Union-
Find (voir [1, §22.3]). Cette structure de donn´ee g`ere une collection d’ensemble disjoints contenant des
´el´ements d’un mˆeme univers. Elle supporte les trois op´erations suivantes :
i)MakeSet(P, x) : cr´ee dans Pun ensemble singleton contenant x.
ii)Union(P, x, y) : indique qu’en fait xet yappartiennent au mˆeme ensemble.
iii)Find(P, x) : renvoie le repr´esentant “canonique” de l’ensemble contenant x.
Si on utilise une telle structure, ainsi qu’un algorithme de tri en O(nlog n), l’algorithme de Kruskal est
en O(|E|log |E|).
Tri efficace. Pour trier la liste des arˆetes, on impl´ementera un tri rapide (a.k.a. “QuickSort”), mais
on utilisera un tri par insertion pour les appels r´ecursifs en de¸c`a d’une certaine taille (par exemple 100,
mais il faut ajuster exp´erimentalement). Pour choisir le pivot dans le QuickSort, on choisira 3 ´elements
du tableau et on prendra celui du milieu (c’est la technique dite “median of three”). Strictement parlant,
ce tri est en On2dans le pire des cas, mais en pratique il est bien plus rapide que le tri fusion ou que
les tri en O(nlog n).
1
2 Application au probl`eme du voyageur de commerce
Une des applications classique des arbres couvrant minimaux est un algorithme de 2-approximation
pour le probl`eme du voyageur de commerce.
Soit G= (V, E, w) un graphe complet (E=S2), pond´er´e, non oriene et qui v´erifie l’in´egalit´e
triangulaire : s, t, u V, w({s, u})w({s, t}) + w({t, u}). On cherche `a trouver un circuit, c’est `a dire
un chemin s1, . . . , snVpassant une et une seule fois par chaque sommet, de poids Pn
i=1 w({si, si+1})
minimal (avec la convention sn+1 =s1). On peut montrer (ce qu’on ne demande pas, voir [1, §37.2.1])
que le parcours pr´efixe d’un arbre couvrant minimal de Gest un circuit de poids au plus double du poids
minimal.
Vous ´ecrirez une fonction C qui prend en argument un graphe complet de taille arbitraire et calcule
un circuit grˆace `a cette heuristique. La sortie sur ´ecran sera la liste, dans l’ordre, des sommets `a visiter
suivie du poids du circuit. Les poids seront de type double.
Vous ´ecrirez ´egalement un programme de d´emonstration qui teste votre fonction sur des graphes
al´eatoires. Le programme prendra en argument en ligne de commande le nombre de sommets des graphes
`a g´en´erer. Les graphes seront g´en´er´es de la mani`ere suivante (afin de s’assurer que l’in´egalit´e triangulaire
est v´erifi´e) : pour chaque sommet siS, on choisit une position al´eatoire (xi, yi)R2dans le plan ;
chaque arˆete a alors pour poids la distance euclidienne entre ses extr´emit´es :
w({si, sj}) = q(xixj)2+ (yiyj)2
3 Travail demand´e
Vous ´ecrirez une fonction C qui calcule un arbre couvrant minimal par l’algorithme de Kruskal.
L’argument de la fonction sera un graphe connexe de taille arbitraire sous forme de listes d’adjacence
(efficace pour repr´esenter les graphes peu denses). Les poids seront de type double. La sortie sur ´ecran sera
la liste des arˆetes qui forment l’arbre (dans un ordre quelconque) suivie du poids de l’arbre. Votre fonction
utilisera la structure de donn´ees Union-Find ainsi que l’algorithme de tri que vous devrez ´egalement
programmer.
Vous ´ecrirez ´egalement un programme de d´emonstration qui calcule des arbres couvrants minimaux
sur des graphes connexes g´en´er´es al´eatoirement. Le programme prendra en argument en ligne de com-
mande le nombre de sommets Vet le nombre d’arˆetes Edes graphes `a g´en´erer.
Enfin, vous ferez quelques exp´eriences en variant |E|et |V|pour v´erifier exp´erimentalement le coˆut
th´eorique (attention au coˆut de la g´en´eration du graphe et de la sortie sur ´ecran).
R´ef´erences
[1] Thomas H. Cormen, Clifford Stein, Ronald L. Rivest, and Charles E. Leiserson. Introduction `a
l’algorithmique. Dunod, 2nd edition, 2001.
2
1 / 2 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !