Cours conception et analyse d’algorithmes Correction du TD 5 1. De la difficulté de trouver des gens gentils 1. Un graphe connexe à n sommets possède un arbre couvrant donc au moins n − 1 arêtes : e(A) = −1. Pour chaque composante connexe on a un excès de −1 au moins donc au total l’excès est au moins −k. 2. Le problème est clairement dans NP. Soit (G, k) une instance de Stable. On considère le problème Excès(G, k) : si G admet un stable S de taille k alors e(S) = −k ; inversement s’il existe un sous-ensemble S d’excès k dans G alors le graphe induit (S, AS ) possède au moins k composantes connexes et on peut extraire de S k sommets indépendants. 3. Considérons une instance (G = (X, A), k) du problème Excès. On considère l’instance du problème BonneAmbiance avec X ∪ {j} comme ensemble d’utilisateur, où j est un nouvel utilisateur (le jocker), {(j, x) | x ∈ X} comme amitiés (le jocker est le seul amis de chacun des autres utilisateur) et A comme ensemble d’inimitiés. Soit S un ensemble d’utilisateurs tel que le nombre d’amis soit k plus le nombre d’ennemis. Alors S contient forcément j (sinon le nombre d’amis est 0) et le nombre d’amis est |S| − 1 alors que le nombre d’ennemis est |AS |. D’où e(S ∪ {j}) = −k. Inversement soit S un ensemble de sommets d’excès −k. Dans le groupe S ∪ {j} le nombre d’amis est |S| et le nombre d’ennemis est |AS | d’où |S| − |AS | = k. 2. Algorithme approché pour la couverture par sommets 1. La complexité est linéaire en le nombre d’arêtes si on dispose d’une représentation par liste d’adjacence, quadratique si on a qu’une matrice d’incidence. Plus précisément on fait au plus n appels récursifs mais le test de la boucle nécessite de parcourir toutes les arêtes issues de x : on effectue au plus 2m tests et n appels récursifs. 2. Considérons une arête a de G : si a est dans l’arbre couvrant T alors l’une de ses deux extrémités est le père de l’autre et a est couverte ; sinon soit a = {x, y} avec x visité avant y par DFS : mezalor x n’est pas une feuille sinon DFS aurait essayé d’emprunter a à partir de x (en fait on voit que x est nécessairement un ancètre de y) ; a est donc couverte. 3. Preuve de l’indication 1 : Les k arêtes d’un couplage ne partagent pas leur extrémité, il faut donc au moins k sommets pour les couvrir. Construction du couplage : on couple chaque sommet de la couleur la plus fréquente avec l’un de ses fils ; on obtient ainsi un couplage de cardinal au moins la moitier du nombre de sommets internes de l’arbre. Conclusion : le couvrant a cardinal au plus OPT*2. 1 3. Réseau avec relais, NP-complétude, approximation a. Un algorithme d’approximation pour Réseau avec relais. 1. Étant donné un arbre connectant optimal T , son parcours (par exemple en profondeur) permet de construire un cycle hamiltonien dans GS . Le poids d’une arête (x, y) de ce cycle est majoré par la longueur du chemin de x à y dans le parcours de T . Ce parcours utilise au total exactement 2 fois chaque arêtes de T donc le poids du cycle hamiltonien construit dans GS est au plus 2|T | et, en enlevant une arête, c’est aussi une borne sur le poids d’un arbre couvrant de poids minimum dans GS . 2. Un arbre couvrant TS de poids minimum de GS permet de construire un ensemble d’arêtes F connectant les sommets de S à un coût au plus p(TS ) : on prend l’union des chemins minimaux de G associés aux arêtes de TS , et on élimine encore des arêtes s’il y a des cycles. La complexité de l’algorithme dépend du cardinal de S : il faut calculer les distances deux à deux entre ces sommets (|S|2 · (|E| + |X| log |X|) ou |X|3 ) puis appliquer un algorithme de calcul d’un arbre couvrant de poids minimum (O(|S|2 log |S|)). Le réseau de moindre coût avec relais s’appelle aussi arbre de Steiner. b. NP-complétude du problème Réseau avec relais. 1. On réalise un parcours en profondeur du graphe obtenu qui permet de s’assurer que tous les sommets de S sont connectés entre eux. 2. Étant donné un ensemble Y avec |Y | = 3n et une collection C de triplets de Y on construit une instance de Réseau avec relais en prenant comme ensemble de sommets X = {x0 }∪C ∪Y , comme ensemble d’arêtes E = {(x0 , c) | c ∈ C} ∪ {(c, y) | c ∈ C, y ∈ c}, comme ensemble de sommets à relier S = {x0 } ∪ Y et comme taille de réseau à ne pas dépasser k = 4n. Un certificat de réseau avec relais sur ce graphe à 4n arêtes contient exactement une arête (c, y) pour tout y ∈ Y (ce qui donne 3n arêtes) et n arêtes entre x0 et les c correspondants. L’ensemble des c forme une partition de |Y | de taille n. 4. Recouvrement d’ensembles et de mots a. Recouvrement par ensembles est N P-complet. La version de décision du problème Recouvrement par ensembles prend comme données un ensemble fini E, une famille S de sous-ensembles de E, une function poids w : S 7→ N et un entier W et réponds à la question existe-t-il un ensemble J ⊆ {1, . . . , n} tel que ∪j∈J Sj = E et P w(S j) ≤ W ? j∈J Recouvrement d’ensemble est un problème dans N Ppuisque étant donnée une solution J il est facile de calculer P en temps polynomial l’union ∪j∈J Sj en temps polynomial (pour le comparer à E) et la somme j∈J w(Sj ) (pour le comparer à W ). On réduit Recouvrement par sommets à Recouvrement d’ensemble comme suit. Supposons donné un graphe G = (V, E) et un entier k. On considère la famille S = {Sv }v∈V , où Sv est l’ensemble des arêtes incidente au sommet v. On choisi un poids w(Sv ) = 1 pour tout sommet v. Avec ces notations, un ensemble X ⊆ V est un ensemble de sommets recouvrant duPgraphe G si et seulement si ∪v∈X Sx = E. De plus, le cardinal de X est égal à son poids w(X) = v∈X w(Sv ). 2 Donc recouvrement par sommet(G = (V, E), k) donne la même réponse que recouvrement par ensemble(E, S, w, k). Puisque Recouvrement par sommets est N P-complet et que la réduction proposée est polynomiale, Recouvrement d’ensemble est aussi N P-complet. b Algorithme approché glouton. i. Soit J = {j1 , . . . , jp } un recouvrement optimal. On a W0 = X w(Sj ) = j∈J Donc X w(Sj ) j∈J |Sj | × |Sj | ≥ min( j∈J X w(Sj ) w(Sj ) )× |Sj | ≥ min( ) × n. j∈J |Sj | |Sj | j∈J w(Sj ) W0 ≥ min( ). j∈J n |Sj | 1) A l’étape 1, l’algorithme glouton choisit T1 tel que c(T1 ) = w(T |T1 | soit minimum. Comme ce w(T1 ) W0 ≤ . minimum est inférieur ou égal à Wn0 , on obtient bien |T1 | n ii. A l’étape i on peut restreindre le problème à F = E \F , considérer les sous-ensembles Si0 = Si \F et supposer que l’on est au début de l’algorithme. L’optimal pour ce problème est W00 ≤ W0 et par W0 W0 la question précédente on obtient c(Ti ) ≤ 0 et par suite c(Ti ) ≤ . n−j+1 |F | P iii. Le poids de la solution obtenue par l’algorithme glouton est W = ki=1 w(Ti ). Si l’ensemble Ti contient les éléments xj pour j = αi , αi + 1, . . . , βi , alors la question précédente montre que P i βi −αi W0 1 W i) c(Ti ) = βw(T ≤ n−α . Donc w(Ti ) ≤ W0 n−α ≤ W0 βj=α . Par conséquent W ≤ i n−j+1 0 i −αi i +1 i +1 Pk Pβi 1 i=1 j=αi n−j+1 = Hn . L’algorithme est donc Hn approché. iv. On peut prendre comme poids w(Si ) = 1/i pour i = 1, . . . , n et w(Sn+1 ) = (1 + ε). L’algorithme choisit alors Sn puis Sn−1 et ainsi de suite jusqu’à S1 obtenant un poids Hn . La solution optimale est obtenu en prenant Sn+1 qui a poids ((1 + ε)/n). Noter que l’énoncé imposait des poids entiers, il convient donc de multiplier tous les poids par n! pour satisfaire cette condition. c. Recouvrement de mots. i. Le mot σ12k est abk c et le f optimal est abk+1 c. ii. L’algorithme à égalité de longueur de chevauchements pour l’exemple précédent peut choisir σ12k qui donne un ensemble S = {abk c, bk+1 } composé de deux mots qui n’ont qu’un 0-chevauchement d’où la solution obtenue abk cbk+1 . Cette solution est de longueur 2k + 3 alors que la solution optimale est de longueur k + 2. Le facteur d’approximation est supérieur ou égal à 2k+3 k+2 qui aussi proche que l’on veut de 2. iii. Il suffit de prendre pour f la concaténation des mots θ1 , θ2 , . . . θp . Comme les Sθi recouvrent S, tout fj est élément d’un des Sθi , donc facteur du θi correspondant. Le poids W0 de la solution optimale au problème Q est égal à la somme des longueurs des mots θi , qui est exactement la longueur de f . iv. Soit k ∈ {1, . . . , n}. On va montrer que fk est dans un des sous-ensemble Sπi . Si k est égal à l’un des bi ou des ei alors c’est clairement le cas, sinon puisque 1 = b1 < e1 < b2 < e2 < · · · < bt < et = n et que bi = ei−1 + 1, il existe un indice i tel que bi < k < ei . Donc, le facteur fk commence après fbi et avant fei . Comme on suppose que les fi ne sont pas facteurs les uns des autres, le facteur fk 3 termine avant fbi . Donc fk est contenu dans le sous mot πi = σbi ei ki et il appartient à l’ensemble Sπi . Les Sπi constituent donc un recouvrement de S. v. Soit i ∈ {1, . . . , t − 2}. Par définition, le facteur fbi+1 commence après fei dans le mot f (car bi+1 > ei ) donc fbi+1 termine après fei (car fbi+1 n’est pas facteur de fei ). D’autre part, fbi+1 termine avant que fbi+2 ne commence. Donc fei termine avant que fbi+2 ne commence. Donc πi et πi+2 ne s’intersectent pas. X X X l(πi ) ≤ l(f ). Donc l(π) ≤ 2l(f ). l(πi ) ≤ l(f ) et On en déduit que i i impair i pair vi. On considère l’algorithme qui remplace le problème P sur les mots par le problème Q correspondant sur les ensembles, puis qui résout Q par l’algorithme glouton de la partie II, enfin qui concatène les mots u correspondants aux Su de la solution trouvée. D’après les questions b.iii, b.iv, b.v, on sait que s’il existe une solution de poids l pour le problème P de recouvrement de mots, alors il existe aussi une solution de poids au plus 2l obtenu en passant le problème Q correspondant. On obtient une solution de poids au plus 2lHn en utilisant un algorithme glouton pour résoudre le problème P . Notre algorithme est donc 2Hn approché. 4