Algorithmique et Programmation
Projet : Algorithme de Prim
Ecole normale sup´erieure, D´epartement d’informatique
2013-2014
Dans un graphe connexe non-oriene avec arˆetes pond´er´ees G= (V, E, w), un arbre couvrant mini-
mal est un ensemble d’arˆetes de Gqui est un arbre, touche tous les sommets de G, et est de poids
P{u,v}∈Aw(u, v) minimal. L’algorithme de Prim (voir [?,§24.2]) construit un arbre couvrant minimal
de mani`ere “gloutonne”. Il part d’un sommet rarbitraire et de A=puis fait grossir Aen y adjoignant
une arˆete de poids minimal qui laisse l’ensemble des arˆetes de Aconnect´ees `a ret sans cycle. On note
uvpour dire que {u, v} ∈ E. Voici l’algorithme de Prim :
1: function ACM-Prim(G)
2: choisir rV,A← ∅ et S← {r}.
3: while S6=Vdo
4: choisir s /Stel que minxS,xsw(x, s) soit minimum.
5: AA∪ {{x, s}} et SS∪ {s}
6: end while
7: return A
8: end function
1 File de priorit´e
Pour une impl´ementation efficace, l’algorithme de Prim utilise une file de priorit´e pour les ´el´ements
de V\Savec cl´e Clef(u)R∪ {+∞} ´egale au poids de la plus petite arˆete de Greliant uaux sommets
de S. Voici le pseudo-code :
1: function ACM-Prim(G)
2: A← ∅
3: choisir rV
4: for all trdo Insertion(P, t, w(s, t))
5: for all t6=ret t6∼ rdo Insertion(P, t, +)
6: while P6=do
7: sExtraire-Min(P)
8: uchoisir un sommet tel que us, u /P, et w(s, u) = Clef(s)
9: AA∪ {{s, u}}
10: for all tsdo
11: if tPet w(s, t)<Clef(t)then
12: Diminuer-Clef(P, t, w(s, t))
13: end if
14: end for
15: end while
16: return A
17: end function
Si la file de priorit´e est implanee `a l’aide des tas de Fibonacci (voir [?,§21]), les fonctions Extraire-
Min et Diminuer-clef se font respectivement en temps amorti O(log |V|) et O(1). On obtient un coˆut
total O(|E|+|V|log |V|), qui est meilleur que celui de Kruskal.
2 Travail demand´e
Vous ´ecrirez et testerez une fonction qui calcule un arbre couvrant minimal par l’algorithme de Prim
avec tas de Fibonacci. La fonction prend en entr´ee un graphe connexe pond´er´e de taille arbitraire donn´e
Conception : Charles Bouillaguet. R´evis´e par Claire Mathieu 9/2013.
1
sous forme de listes d’adjacence. Les poids sont de type entier. La sortie sur ´ecran est la liste des arˆetes qui
forment l’arbre (dans un ordre quelconque) suivie du poids de l’arbre. Ainsi, votre travail se d´ecompose
en les ´etapes suivantes.
1. Impl´ementation d’une fonction pour tester si un graphe est connexe. La fonction prend en entr´ee
un graphe de taille arbitraire donn´e sous forme de listes d’adjacence, et donne en sortie une valeur
binaire, vrai ou faux.
2. Implementation d’une fonction qui prend en entr´ee deux entiers net m[n1, n(n1)/2] et
donne en sortie un graphe connexe `a nsommets et marˆetes donn´e sous forme de listes d’adjacence.
Vous pourrez utiliser la m´ethode de rejet : faire de mani`ere r´ep´et´ee une g´en´eration al´eatoire d’un
graphe `a nsommets et marˆetes, jusqu’`a ce que le graphe obtenu soit connexe.
3. Impl´ementation na¨
ıve de l’algorithme de Prim. Tests sur des graphes connexes al´eatoires dont les
arˆetes ont des poids al´eatoires uniformes entre 1 et 1000.
4. Impl´ementation d’une file de priorit´e avec un tableau. Impl´ementation de l’algorithme de Prim avec
une file de priorit´e. Tests.
5. Impl´ementation d’une file de priorit´e avec un tas de Fibonacci. Impl´ementation de l’algorithme de
Prim avec une file de priorit´e. Tests.
6. Comparaison entre la complexit´e en temps des diverses impl´ementations de l’algorithme de Prim.
Quelles sont, selon les impl´ementations, les plus grandes valeurs de (n, m) pour lesquelles le pro-
bl`eme puisse ˆetre r´esolu en un temps raisonnable (de l’ordre de quelques secondes) ?
3 Bonus
Cette partie est optionnelle.
On peut utiliser l’arbre couvrant minimum pour obtenir un tour qui donne une solution approcee
au probl`eme du voyageur de commerce, comme suit.
Soit G= (V, E, w) un graphe complet (Eest l’ensemble de toutes les paires de sommets de V),
pond´er´e, non oriene et dont les poids sont positifs ou nuls et v´erifient l’in´egalit´e triangulaire : s, t, u
V, w({s, u})w({s, t}) + w({t, u}). On cherche `a trouver un tour, c’est `a dire un chemin s1, . . . , snV
passant une et une seule fois par chaque sommet, et qui soit de poids Pn1
i=1 w({si, si+1}) + w({sn, s1})
minimal. Il est connu (voir [?,§37.2.1]) que le parcours pr´efixe d’un arbre couvrant minimal de Gest un
tour de poids au plus double du poids minimal.
Vous ´ecrirez une fonction qui prend en argument un graphe complet de taille arbitraire, dont les poids
sont positifs ou nuls et v´erifient l’in´egalit´e triangulaire, et qui 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 flottant 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´ee) : pour chaque sommet siS, on choisit une position al´eatoire uniforme (xi, yi)[0,1]2
dans le carr´e unit´e ; chaque arˆete a alors pour poids la distance euclidienne entre ses extr´emit´es :
w({si, sj}) = q(xixj)2+ (yiyj)2
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 !