INF550 Promotion 2008 Conception et analyse d'algorithmes Examen du mercredi 8 décembre 2010. 3 heures Documents autorisés : poly, transparents du cours, énoncés de PC Le barême est indicatif. On vous demande d'accorder une attention particulière à une rédaction soignée, qui sera un critère important dans l'évaluation. I. De la diculté de trouver des gens gentils (4 pts) Soit G un graphe d'ensemble de sommets X et d'ensemble d'arêtes A. Étant donné un sous-ensemble de sommet S ⊂ X , on dénit l'ensemble des arêtes induites AS = {{u, v} ∈ A | u ∈ S, v ∈ S} et l'excès de S par e(S) = |AS | − |S|. Le problème Excès consiste, étant donné G et k > 0, à décider s'il existe un sous-ensemble S d'excès inférieur ou égal à −k dans G. On rappelle que le problème Stable, consistant à décider s'il existe un ensemble S de k sommets indépendants (i.e. tel que AS = ∅) dans G est NP-complet. 1. Montrer que l'excès d'un graphe connexe est supérieur ou égal à -1. Donner plus généralement une borne inférieure à l'excès d'un graphe formé de k composantes connexes (rappel : deux sommets u et v sont dans la même composante connexe de G s'il existe un chemin allant de u à v dans G). 2. Montrer que le problème On considère le problème Excès est NP-complet. BonneAmbiance Donnée : suivant : Un ensemble X d'utilisateurs d'un réseau social ; pour chaque utilisateur un ensemble d'amis et un ensemble d'ennemis (les relations être amis et être ennemis sont supposées symétriques). Un entier k > 0. Problème : Existe-t-il un groupe d'utilisateurs U ⊂ X tel que le nombre de paires d'utilisateurs de U qui sont amis moins le nombre de paires d'utilisateurs de U qui sont ennemis est au moins égal à k ? 3. Montrer que le problème BonneAmbiance est NP-complet. (Indication : Il pourra être utile de considérer un utilisateur ami de tous les membres du réseau.) II. Des ots pour un temps d'évacuation (4 pts) On modélise un bâtiment par un graphe : les sommets sont les pièces et les arêtes les couloirs entre ces pièces. Chaque couloir est décrit par une capacité entière, qui indique combien de personnes peuvent emprunter ce couloir simultanément (à chaque unité de temps). 1 1. On fait dans un premier temps l'hypothèse qu'il faut une unité de temps pour traverser un couloir (traverser une pièce est instantané). On suppose de plus que tous les occupants du batiment sont dans une même pièce au départ et que la sortie se fait à partir d'une pièce unique. Le problème est de décider si on peut évacuer tout le monde en t unités de temps ou moins. Modéliser ce problème à l'aide de problèmes de ots dans un graphe bien choisi et en déduire un algorithme pour trouver le temps d'évacuation. Donner une borne sur la complexité de votre algorithme dans le pire cas. (Indication : On pourra commencer par se demander s'il est possible d'évacuer le batiment en 1 unité de temps ; puis en 2 unités de temps...) 2. Étendre l'algorithme au cas où les personnes sont dans des pièces diérentes et où il y a plusieurs sorties. 3. Étendre l'algorithme au cas où plusieurs unités de temps peuvent être nécessaire pour traverser un couloir. 4. Justier (à moins que ce ne soit déjà fait) le fait qu'il n'ait pas été nécessaire dans la modélisation de la capacité d'un couloir de tenir compte de la possibilité que des personnes l'empruntent simultanément dans des directions opposées. III. Algorithme approché pour la couverture par sommets (4 pts) On rappelle que le problème CouvrantMin(G) consiste à trouver dans un graphe G un ensemble couvrant de cardinal minimum où un ensemble S de sommet est couvrant si chaque arête de G a au moins une de ses extrémités dans S . On suppose dans un premier temps que le graphe est connexe et on considère l'algorithme suivant : choisir un sommet x0 arbitraire, construire un arbre couvrant en profondeur de G à partir de x0 et renvoyer l'ensemble des sommets qui ne sont pas des feuilles (i.e. qui ont au moins un descendant dans l'arbre). On rappelle qu'un arbre couvrant en profondeur de racine x0 s'obtient comme ensemble des arêtes marquées par l'appel DFS(x0 ) où DFS est la procédure de parcours récursif suivante : DFS(x) : tant que x a un voisin y encore non visité faire { marquer l'arête {x, y} et faire DFS(y )} 1. Donner la complexité de cet algorithme en fonction des nombres n de sommets et/ou m d'arêtes du graphe. 2. Montrer que l'ensemble obtenu est un ensemble couvrant de G. 3. Quel est le facteur d'approximation de la solution obtenue. (Indication 1 : On pourra montrer que s'il existe un couplage à k sommets dans G (i.e. un ensemble de k arêtes disjointes) alors tout ensemble couvrant de G contient au moins k sommets. Indication 2 : colorier les sommets internes de l'arbre couvrant alternativement en deux couleurs et utiliser la couleur la plus fréquente pour construire un couplage ). 4. Adapter l'algorithme au cas où le graphe n'est plus nécessairement connexe. Quel est alors le facteur d'approximation obtenu ? 2 IV. Programmation linéaire et approximation pour un ordonnancement (4 pts) On considère un problème d'ordonnancement sur une unique machine avec des contraintes de précédence et des coûts associés à chaque tâche proportionnellement à leur date de n d'exécution. Plus précisément on se donne un ensemble de tâches numérotées {1, . . . , n} et pour chaque tâche j , sa durée dj , l'ensemble de ses prédécesseurs Pj ⊂ {1, . . . , n} et son facteur de coût αj : si la tâche j termine à l'instant t, elle coûte αj t. On suppose les di entiers et on travaille en temps discret. Le but est d'ordonnancer les tâches de façon à minimiser la somme des coûts d'exécution. An de modéliser le problème par un programme linéaire en entiers, on se donne une variable xj,t ∈ {0, 1} pour chaque tâche j et chaque instant t, qui servira à indiquer si la tâche j termine exactement au temps t. 1. Compléter la description du programme linéaire modélisant le problème. En particulier il faudra s'assurer que : chaque tâche termine à un temps bien déni, qu'une tâche ne commence pas avant que ses prédécesseurs soient terminées, qu'au bout d'un temps t, au plus t unités de temps ont été utilisées pour eectuer des tâches. Enn il faudra préciser quelle est la fonctionnelle linéaire à minimiser. On relache maintenant la contrainte de variables entières en la remplaçant par 0 ≤ xj,t ≤ 1. Notons x̂j,t un optimum du problème linéaire ainsi obtenu : on peut interpréter x̂j,t comme une fraction de tâche j exécutée à l'instant tP . On associe à la tâche j la quantité Tj = t tx̂j,t qui moyenne les temps de n d'exécution par P fraction de la tâche, et le temps de demi-exécution θj qui est le plus grand θ tel que 0≤t<θ x̂j,t ≤ 12 . 2. Montrer que Tj > θj /2. 3. Montrer que si on ordonne les tâches par θj croissants, une tâche ne s'exécute jamais avant un de ses prédécesseurs. 4. Montrer de plus que dans cet ordre, la tâche j se termine au plus tard au temps 4Tj . 5. En déduire un algorithme d'approximation pour le problème d'ordonnancement d'origine et donner son facteur d'approximation. V. Générateurs minimaux en temps polynomial paramétrique (4 pts) Le problème EnsembleGénérateur est le suivant : étant donnée une collection C = (C1 , . . . , Cm ) de parties deux à deux distinctes de {1, . . . , n}, existe-t-il k parties (G1 , . . . , Gk ) de {1, . . . , n} (éventuellement distinctes des Ci ) qui engendrent les Ci par union : chaque Ci doit pouvoir s'écrire comme union d'un sous-ensemble des Gj . 1. Montrer que si k ≥ n la réponse est toujours positive. 2. Donner un exemple de collection C avec m = n tel que la réponse soit négative pour k < n. 3. Si la réponse est positive donner une borne supérieure sur m en fonction de k . 3 Le probleme EnsembleGénérateur est en fait NP-complet (on ne demande pas de le montrer). Dans le reste de l'exercice on veut montrer que le problème est polynomial en n et m à k xé (FPT). 4. Donner une condition susante sur un entier x pour qu'on puisse le supprimer de tous les Ci où il apparait sans changer la réponse au problème posé. 5. Montrer comment construire à partir d'une instance (C, k) du problème EnsembleS 0 k Générateur une autre instance (C 0 , k 0 ) portant sur au plus 22 éléments (| Ci | < k 22 ) et telle que la réponse à EnsembleGénérateur(C, k) est positive si et seulement si la réponse à EnsembleGénérateur(C 0 , k 0 ) l'est. 6. Déduire de la question précédente un algorithme pour le problème EnsembleGénérateur(C, k) de complexité f (k) + P (C) où P (C) est une fonction au plus polynomiale de la taille de C et f une fonction de k qu'on précisera toutes les deux. 4