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

Documents pareils