Cours conception et analyse d`algorithmes
Transcription
Cours conception et analyse d`algorithmes
Cours conception et analyse d’algorithmes Correction du TD 6 1. 3-coloriage et hamiltonien sont FPT pour la treewidth Supposons que notre graphe G = (V, E) est donné par un arbre de décomposition sympathique T de largeur k. On enracine l’arbre T par un de ses sacs, et on note TS le sous-arbre enraciné au noeud S (formé de S et de tous les noeuds de T en dessous de S dans l’arbre enraciné). À chaque noeud S de l’arbre est associé un sac, qu’on note S aussi par abus de notation (remarquer qu’il y a en général plusieurs noeuds possédant le même sac dans un arbre de décomposition sympathique, mais on précisera si on parle du sac ou du noeud quand c’est nécessaire). Enfin, on note V (S) l’ensemble des sommets apparaissant dans les sacs du sous-arbres TS et G(V ) le sous-graphe de G induit par V (S) (ie on garde uniquement ces sommets et les arêtes de G qui les joignent). Le principe de programmation dynamique est de traiter un sous-problème associé à chaque sousarbre, en commençant par les sous-problèmes associés aux sacs feuilles de l’arbre. Étant donné un sac S contenant i sommets {x1 , . . . , xi } notre sous-problème associé consistera à déterminer, quels sont les 3-coloriages partiels φ : S → {1, 2, 3} des sommets de S qui peuvent être complété en un 3-coloriage de G(S). La réponse au sous-problème peut-être représenté comme une table booléenne à 3i entrées, i = |S|. Il y a 4 cas à traiter, correspondants aux 4 types de noeuds d’un arbre de décomposition sympathique : – Un noeud feuille S contient un unique sommet x de G, le coloriage est trivialement possible pour les 3 affectations de couleurs à x. – Un noeud d’élimination S a un unique fils S 0 dans l’arbre et le sac S s’obtient en supprimant un sommet de S 0 : S = S 0 \ {x}. Dans ce cas G(S) = G(S 0 ). Par définition de l’ordre dans lequel on traite les sous-problèmes, le sous-problème associé à S 0 est déjà traité lorsqu’on traite S : on connait les coloriages partiels des sommets de S 0 qui s’étendent en coloriages de G(S 0 ), donc a fortiori on connait les coloriages partiels des sommets de S ⊂ S 0 qui s’étendent en coloriages de G(S) = G(S 0 ) : il s’agit des φ|S tels que l’un des 3 coloriages étendant φ|S à S 0 est valide : on constuit la table de S en temps O(3|S| ) – Un noeud d’ajout S a un unique fils S 0 dans l’arbre et le sac V (S) s’obtient ajoutant un sommet x à S 0 : V (S) = V (S 0 ) ∪ {x}. Dans ce cas V (S) = V (S 0 ) ∪ {x} et par définition des arbres de décompositions, les seules arêtes qui sont dans G(S) et pas dans G(S 0 ) sont des arêtes de x à un sommet de S (en particulier il n’y a pas d’arête de x vers V (S) \ S). On connait les coloriages partiels de S 0 qui s’étendent en coloriages de G(S 0 ). Pour décider comment un tel coloriage φ|S 0 peut s’étendrent en un coloriage de G(S) il suffit d’exclure les couleurs données par φ|S 0 aux voisins de x dans S : on construit la table de S en temps O(|S| · 3|S| ). – Un noeud binaire S a deux fils S1 et S2 qui ont les mêmes sacs (ie en tant que sac S = S1 = S2 ). Les graphes G(S1 ) et G(S2 ) par contre sont en général différent et plus précisément l’intersection de ces deux graphes se réduit aux sommets de S : V (S1 ) ∩ V (S2 ) = S. Deux 3-coloriages de G(S1 ) et G(S2 ) s’étendent donc en un coloriage de G(S) si et seulement si il coincident sur S : la table de S s’obtient en faisant le ET booléen des tables de S1 et S2 , en temps O(3|S| ). 1 Lorsqu’on arrive au noeud racine R, on a G(R) = G et on peut dire si le graphe est 3-coloriable. On remarque qu’on pourrait pour un coût à peine plus élevé compter les 3-coloriages de G. Si la décomposition sympathique a m noeuds, l’algorithme est de complexité O(m · k · 3k ). Pour le problème Hamiltonien, la structure de l’algorithme est la même mais il faut faire attention à bien choisir le sous-problème associé à un noeud S de façon à pouvoir recoller les solutions partielles. Un bon choix est le suivant : pour chaque triplets (C, U, L) où U et L sont des sousensembles distincts de S et C est un couplage parfait de S \ (U ∪ L), décider s’il existe un ensemble de chemins disjoints dans G(S) tels que les extrémités de ces chemins soient données par C, les sommets de U soient internes aux chemins et les sommets de L soient libre. La table d’un noeud peut donc être indexée par les couplages parfaits possibles à 2j éléments (où 0 ≤ j ≤ bk/2c). Pour chacun des couplages, on doit déterminer l´état des au plus k − 2j noeuds restants (sommet isolé ou appartenant à un chemin). On obtient donc une table ayant au plus O(k!2k ) entrées. Il y a 4 cas à traiter, correspondants aux 4 types de noeuds d’un arbre de décomposition sympathique : – Un noeud feuille S contient un unique sommet x de G, la seule valeur possible pour la table de S est que le sommet x soit isolé. – Un noeud d’élimination S a un unique fils S 0 dans l’arbre et le sac S s’obtient en supprimant un sommet de S 0 : S = S 0 \ {x}. Dans ce cas, on sait que le noeud x n’apparaitra plus dans les noeuds parents de S, il faut donc ne conserver les configurations de S 0 pour lesquelles x est de degré 2. La table de S est donc obtenue à partir de la table de S 0 , en ne gardant que les configurations où x est de degré 2 et en effaçant la valeur de x. – Un noeud d’ajout S a un unique fils S 0 dans l’arbre et le sac V (S) s’obtient ajoutant un sommet x à S 0 : V (S) = V (S 0 ) ∪ {x}. Le sommet x peut être ajoutée à chacune des tables de S 0 de trois manières possibles : soit en étant un sommet isolé (ce qui peut toujours être le cas), il peut être ajouté à un sommet de degré 1 (si l’arête correspondante est présente dans le graphe), dans ce cas la valeur du couplage doit être actualisée ainsi que la valeur de l’ancien sommet de degré 1 dans le couplage, la dernière possibilité (pour trouver les configurations où x est de degré 2) est de sélectionner pour chaque paire d’arêtes {(x, y), (x, z)} où y, z ∈ S, les configurations de S 0 pour lesquelles y et z appartiennent au couplage mais en n’étant pas couplés, et de rajouter la configuration correspondant à l’ajout des arêtes (x, y) (x, z). – Un noeud binaire S a deux fils S1 et S2 qui ont les mêmes sacs (ie en tant que sac S = S1 = S2 ). Pour fusionner deux configurations C1 et C2 de S1 et S2 , il faut explorer toutes les façons de raccorder les couplages corresondants, en veillant à ne pas créer de boucles. Par exemple, si x est couplé à y1 dans C1 et à y2 dans C2 et que y1 6= y2 , on peut créer une nouvelle configuration dans laquelle y1 et y2 sont couplés et x est de degré 2. Notez que s’il existe x de degré 2 dans C1 et C2 , elles ne peuvent être fusionnées. La terminaison de l’algorithme s’effectue à la racine par une variation de la procédure appliquée à un arbre binaire, en vérifiant qu’aucun sommet ne reste isolé. 2. Color coding for k-path 1. Par exploration récursive directe on teste les n voisins de chaque sommet, et pour ces n voisins les n − 1 voisins suivants, etc, pour une complexité totale de n(n − 1) . . . (n − k − 1) ∼ nk . Pour k = log n la complexité nlog n n’est pas polynomiale, sauf à considérer que log n ≤ 15, ce que nous ne ferons pas ici... 2. On considère les n · 2k problèmes de l’existence d’un chemin multicolore issu de s utilisant 2 des sommets d’ensemble de couleurs X ⊂ {1, . . . , k}. La table de vérité Ts,X se remplit en temps O(k · 2k · n) grace à la relation Ts,X = ET t∈V (s),C(t)∈X Tt,X\C(t) où V (s) désigne l’ensemble des voisins de s. 3. On choisit des couleurs au hasard pour chaque sommet, puis on applique l’algorithme précédent. S’il n’existe pas de k-chemins, on donnera toujours √ la bonne réponse. S’il existe un k-chemin, k −k on le trouvera avec probabilité au moins k!/k ∼ e / πk. Si on répète m fois l’algo, la probabilité −k −k de le trouver devient 1 − (1 − e−k )m = 1 − em log(1−e ) = 1 − e−me ≥ 1 − e−1 si m > ek . 4. En répétant m = elog n = n fois l’algorithme on a une probabilité positive de donner la bonne réponse, qu’on peut rendre aussi proche qu’on veut de 1 en répétant encore un peu plus. 3. Plongement de k triangles 1. On part d’un premier sommet et on marque les voisins de ses voisins. Si on trouve marque deux fois un même sommet on a trouvé un triangle, sinon il n’y a pas de triangle contenant x. Puis on recommence dans le graphe restant, jusqu’à avoir essayé ou utilisé chaque sommet. Cet algo est en O(n3 ), polynomial. 2. Puisque T est un ensemble de triangles maximal, il ne peut exister de triangle disjoint de T dans G. 3. On construit T en temps O(n3 ) : si r ≥ k on peut répondre OUI. Sinon |T | < 3k, on peut donc considérer toutes les configurations d’intersections possibles entre T et T ∗ : pour chaque triangle de T on doit choisir le sous-ensemble des 3 sommets appelés à intersecter T ∗ puis on doit partitionner les r ≤ m ≤ 3r sommets ainsi obtenus en k groupes d’au plus 3 sommets 2-à-2 voisins. Le nombre f (k) = O(k k ) de telles configurations ne dépend que de k et on les construit en temps n · f (k). Un fois la configuration d’intersection P = (P1 , . . . , Pk ) choisie, on en construit de manière gloutone une complétion arbitraitre : soit on trouve effectivement k triangles et on répond OUI, soit on s’arrête en essayant de compléter la i-ème composante connexe Pi . L’ensemble S d’au plus 2(k−1) sommets qu’on a utilisé jusqu’ici pour compléter gloutonnement contient alors nécessairement un sommet qui pourrait compléter le triangle commencé par Pi . Pour chaque sommet x de S qui pourait compléter Pi , on pose P 0 = (P1 , . . . , Pi ∪ {x}, . . . , Pk ) et on recommence récursivement au début du présent paragraphe avec P 0 au lieu de P , s’il n’existe aucun x dans S ayant cette propriété, on explore la configuration d’intersection suivante. On aura moins de 2k appels récursifs à chaque niveau, et la profondeur de récursion est au plus 2k, soit un coût total de l’ordre de O(k 2k ·n). Pour chacune des f (k) configurations d’intersection initiale on paye un coût de cet ordre. Au total la complexité est de l’ordre de O(k O(k) · n) = 2O(k log k) · n. 4. Générateurs minimaux en temps polynomial paramétrique (Pâle 2010) 1. les Gi = {i} engendrent évidemment tous les sous-ensembles. 2. Prendre les Ci = {i}. 3. m < 2k 4. Il suffit qu’il existe un y appartenant exactement aux mêmes Ci que x. 3 5. On garde un représentant par classe d’équivalence pour l’appartenance aux i . On obtient ainsi un instance dans laquelle pour toute paire d’éléments x, y les ensembles les contenant sont disjoints. On peut donc associer à l’élément x l’ensemble des parties Ci qui le contient. Si on peut trouver un ensemble générateur de taille k il y a au plus 2k ensembles Ci et donc on k dispose au plus de 22 sous-ensembles distincts des Ci pour caractériser les éléments restants. k Le nombre d’éléments restant est donc au plus 22 . 6. On considère la réduction au noyau décrite dans la question précédente, ce qui se fait par exemple en temps P (C) = O(nm log n) en construisant pour chaque x la table d’appartenance de x aux Ci puis en ordonnant ces tables dans l’ordre lexicographique pour éliminer les doublons et reconstuire la nouvelle instance. Si l’instance restante porte sur m > 2k ensembles on répond tout de suite non. Sinon le nombre d’éléments x restant est alors inférieur k k à 2m < 22 . On teste alors toutes les collections de k sous-ensembles de ces 22 éléments, k 22 soit au plus 2 k possibilités à tester : pour chacune de ces possibilités il faut vérifier qu’on 22 k 22 l 2 2 engendre bien les Ci : f (k) = m2( k ) = O(2k+( k ) ). Il n’est en fait utile que de considérer des sous-ensembles des Ci , ce qui peut réduire significativement la complexité... 5. Noyau quadratique pour MaxSat 1. Considérons l’affectation qui met toutes les variables à la valeur VRAI ; si moins de m/2 clauses sont satisfaites alors plus de m/2 clauses contiennent des négations de variables. Ces clauses sont satisfaites par l’affectation qui met toutes les variables à la valeur FAUX. 2. On suppose que les littéraux à l’intérieur d’une clause sont formées de variables distinctes (les clauses ne satisfaisant pas cette condition peuvent être simplifiées ou éliminées avant de commencer l’exercice...) On peut alors satisfaire au moins k clauses longues en affectant satisfaisant successivement un littéral pour chacune de ces clauses : tant qu’on a pas fixé la valeur de k variables on est toujours sur d’en trouver une libre dans n’importe quelle clause longue. 3. S’il y a au moins k clauses longues ou si k < m/2, la réponse est OUI et on peut prendre comme noyau la formule satisfiable x avec le paramètre 1. Supposons donc qu’il y ait i < k clauses longues. L’ensemble des clauses courtes muni du paramètre k − i est équivalent au problème de départ : si on peut satisfaire k − i clauses courtes, on peut identifier k − i variables qui suffisent à le faire et il reste i variables libres qui suffisent à satisfaire les i clauses longues ; inversement si on pouvait satisfaire k clauses dans le problème de départ, k − i de ces clauses étaient courtes. Maintenant soit il y a plus de 2k clauses courtes, et le point 1 nous assure que la réponse est Oui et qu’on peut à nouveau prendre un noyau trivial, soit il y a moins de 2k clauses courtes. Ces 2k clauses avec au plus k littéraux forment un noyau de taille quadratique (précisément au plus 2k 2 ) équivalent à l’instance de départ. 4