Exercice 2 : NP COMPLETUDE & Programmation Dynamique
1) Les problèmes de la classe NP-complet sont des problèmes NP qui ne peuvent être résolus en un temps polynomial, mais pour lesquels tout autre problème NP peut être réduit à eux. Cela signifie que si une solution efficiente (en un temps polynomial) était trouvée pour un problème NP-complet, alors des solutions efficientes pourraient également être trouvées pour tous les autres problèmes NP.
2) Énonce : Une instance de SAT est une formule booléenne f composée de :
- n variables booléennes : x1, x2, ..., xn ;
- m connecteurs booléens : toute fonction booléenne avec une ou deux entrées et une sortie, telle que ∧ (ET), ∨ (OU), ¬ (NON), → (implication), ↔ (si et seulement si) ; et
- Des parenthèses. (Sans nuire à la généralité, on suppose qu’il n’y a pas de parenthèses redondantes, c’est-à-dire qu’il y a au plus une paire de parenthèses par connecteur booléen.)
Il est facile d’écrire une formule booléenne f dans une longueur qui est polynomiale en n + m. Comme c’est le cas avec les circuits combinatoires booléens, une assignation de vérité pour une formule booléenne f est un ensemble de valeurs pour les variables de f, et une assignation satisfaisante est une assignation pour laquelle l’évaluation de la formule donne 1. Une formule possédant une assignation satisfaisante est une formule satisfaisable. Le problème de la satisfiabilité consiste à savoir si une formule booléenne donnée est satisfaisable ; en termes des langages formels, on dira : SAT = {〈ϕ〉 tel que est une formule booléenne satisfaisable}
Bien soit la formule ϕ = (( x1 → x2) ∨ ¬((¬x1 ↔ x3) ∨ x4)) ∧ ¬ x2 elle possède l’assignation satisfaisante 〈x1 = 0, x2 = 0, x3 = 1, x4 = 1〉, puisque
ϕ = ((0 → 0) ∨ ¬((¬0 ↔ 1) ∨ 1)) ∧ ¬0
= (1 ∨ ¬(1 ∨ 1)) ∧ 1
= (1 ∨ 0) ∧ 1 = 1
Et on conclut que cette formule ϕ appartient à SAT.
Fin de l’énoncé (je vous l’accorde c’est très long mais facile à comprendre, vrai de vrai !)
Maintenant démontrons qu’il est NP-Complet :
Soit la formule booléenne suivante (¬x1 ∨ x2 ∨ x3) ∧ (¬x2 ∨ x3) ∧ (¬x3 ∨ x1) Pour x1=0, x2=1, x3=1 la formule est satisfaisable, c’est-à-dire admet un modèle. L’algorithme naïf permettant de déterminer si une formule booléenne arbitraire est satisfaisable ne s’exécute pas en temps polynomial. Il existe 2n assignations possibles d’une formule ϕ à n variables. Si la longueur de f est polynomiale en n, alors la vérification de chaque assignation demande un temps Ω(2n), ce qui est suprapolynomial par rapport à la longueur de ϕ. Comme nous allons le montrer, un algorithme polynomial a très peu de chances d’exister. Pour montrer que la satisfiabilité d’une formule booléenne est un problème NP-Complet, nous allons :
- Montrer que SAT ∈ NP : On montre qu’un certificat consistant en une assignation satisfaisante pour une formule f en entrée peut être validé en temps polynomial. L’algorithme de vérification remplace tout simplement chaque variable de la formule par sa valeur correspondante, puis évalue l’expression. Ce travail peut facilement s’effectuer en temps polynomial. Si l’expression a pour évaluation 1, la formule est satisfaisable. Donc, SAT ∈ NP.
- Montrer que SAT est NP-difficile : On montre que CIRCUIT-SAT ≤P SAT. Autrement dit, toute instance du problème de satisfiabilité de circuit peut être réduite en temps polynomial à une instance du problème de satisfiabilité de formule. On peut faire appel à une récurrence pour exprimer un circuit combinatoire booléen quelconque comme une formule booléenne. On regarde simplement la porte qui produit le résultat du circuit, et on exprime de manière récurrente chacune des entrées de la porte en tant que formules. La formule correspondant au circuit est alors obtenue en écrivant une expression qui applique la fonction de la porte aux formules de ses entrées. Malheureusement, cette méthode directe n’est pas une réduction en temps polynomial. Les sous-formules partagées peuvent faire croître exponentiellement la taille de la formule générée, pour peu qu’il y ait des portes dont les fils de sortie aient des facteurs d’éventail de 2 ou plus. Donc, l’algorithme de réduction devra être un peu plus astucieux.
A partir du schéma ci-dessus, on dénote le principe fondamental de la réduction de CIRCUIT-SAT à SAT. Pour chaque fil xi du circuit C, la formule ϕ à une variable xi. L’opération propre à une porte peut maintenant être exprimée comme une formule mettant en jeu les variables situées de ses fils incidents. Par exemple, l’opération de la porte ET en sortie est x10 ↔ (x7 ∧ x8 ∧ x9). La formule ϕ produite par l’algorithme de réduction est le ET entre la variable de sortie du circuit et la conjonction des clauses décrivant l’opération de chaque porte. Pour le circuit de la figure 4, la formule est :
ϕ = x10 ∧ (x4 ↔ ¬x3) ∧ (x5 ↔ (x1 ∨ x2)) ∧ (x6 ↔ ¬x4) ∧ (x7 ↔ (x1 ∧ x2 ∧ x4)) ∧ (x8 ↔ (x5 ∨ x6)) ∧ (x9 ↔ (x6 ∧ x7)) ∧ (x10 ↔ (x8 ∧ x9))
Étant donné un circuit C, il est immédiat de produire une telle formule f en temps polynomial. Pourquoi le circuit C est-il satisfaisable exactement quand la formule f est satisfaisable ? Si C possède une assignation satisfaisante, chaque fil du circuit a une valeur bien définie et la sortie du circuit est 1. Donc, l’assignation de valeurs de fil aux variables de f fait que chaque clause de f est évaluée à 1, et donc que leur conjonction est aussi évaluée à 1. Réciproquement, s’il existe une assignation qui donne une évaluation 1 pour f, le circuit C est satisfaisable de par une démonstration analogue. On a donc montré que CIRCUIT-SAT ≤P SAT.
Donc SAT est un problème NP-Complet.
3. Problème de Clique
Une clique dans un graphe non orienté G = (S, A) est un sous-graphe complet de G, c’est-à-dire que deux sommets quelconques de la clique sont toujours adjacents. La taille d’une clique est le nombre de sommets qu’elle contient. Le problème de la clique est le problème d’optimisation consistant à trouver une clique de taille maximale dans un graphe. Le problème de décision associé est celui de savoir s’il existe une clique de taille K dans le graphe. De manière formelle la définition d’une clique est :
CILIQUE = { < G, k > / G est un graphe contenant une Clique de taille k }
- En entrée : Graphe G = (S, A) et une constante k
- Sortie : Existe-t-il dans G une clique S’ ⊆ S avec |S’| = k ?
* Montrons que clique appartient à NP : Pour montrer que CILIQUE ∈ NP, pour un graphe donné G = (S, A), on utilise l’ensemble S’ ⊆ S des sommets de la clique comme certificat pour G. Vérifier que S’ est une clique peut être accompli en temps polynomial, en testant si pour toute paire u, v ∈ S’ l’arête (u, v) appartient à A.
** Nous allons montrer que 3-CNF-SAT se réduit polynomialement à CLIQUE, c’est-à-dire 3-CNF-SAT ≤P CLIQUE. L’algorithme de réduction commence avec une instance de 3-CNF-SAT. Soit f = ( C1 ∧ C2 ∧ .... Ck )une formule booléenne sous forme 3-CNF à k clauses. Pour r = 1, 2, ..., k, chaque clause Cr possède exactement trois littéraux distincts lr1, lr2 et lr3. Nous allons construire un graphe G tel que f soit satisfaisable si et seulement si G possède une clique de taille k. Le graphe G = (S, A) est construit de la manière suivante. Pour chaque clause Cr = ( lr1∨ lr2 ∨ lr3) de f, on place un triplé de sommets vr1, vr2 et vr3 dans S. On place une arête entre deux sommets vri et vsj si les deux conditions suivantes sont satisfaites :
- vri et vsj sont dans des triplets différents, autrement dit si r est différent de s ;
- Leurs littéraux correspondants sont cohérents, autrement dit lri n’est pas la négation de lsj.
Ce graphe peut se calculer facilement à partir de f en temps polynomial. À titre d’exemple de cette construction, si l’on se donne f = (x1 ∨ ¬x2 ∨ ¬x3) ∧ (x2 ∨ ¬x1 ∨ x3) ∧ (x1 ∨ x2 ∨ x3) alors G est le graphe représenté à la figure suivante.
Graphe de la formule
f= (x1∨ ¬x2∨ ¬x3) ∧ (¬x1∨x2∨x3) ∧ (x1∨x2∨x3)
Voici mon astuce : Si tu observes bien le schéma tu verras qu’un élément n’est pas relie à son complément et les éléments de même clause ne sont pas relie entre eux attention à ce détaille. (Source PandaCodeur.com)
Montrons que ce passage de f à G est une réduction.
D’abord, supposons que f est une assignation satisfaisante. Alors, chaque clause Cr contient au moins un littéral lri ayant la valeur 1, et chaque littéral de ce type correspond à un sommet vri. En prenant l’un de ces littéraux ayant la valeur vraie dans chaque clause, on obtient un ensemble S de k sommets. Nous affirmons que S est une clique. Pour deux sommets quelconques vri, vsj ∈ S, où r ≠ s, l’assignation satisfaisante associe la valeur 1 aux deux littéraux lri et lsj correspondants, et les littéraux ne peuvent donc pas être compléments. Donc, d’après la construction de G, l’arête (vri, vsj) appartient à A. Le graphe précédent issu de la formule 3-CNF f = C1 ∧ C2 ∧ C3, où C1 = (x1 ∨ ¬x2 ∨ ¬x3), C2 = (¬x1 ∨ x2 ∨ x3) et C3 = (x1 ∨ x2 ∨ x3), lors de la réduction de 3-CNF-SAT à CLIQUE. L’assignation < x1 = 0 ou 1, x2 = 0, x3 = 1 > est satisfaisante. Cette assignation vérifie C1 avec ¬x2 et vérifie C2 et C3 avec x3, ce qui correspond à la clique dont les sommets sont en clair.
Supposons maintenant que G contienne une clique de taille k. Comme les littéraux d'une même clause ne sont pas reliés, cette clique contient un littéral exactement dans chaque clause. Montrons alors qu'il existe une assignation qui rend tous ces littéraux vrais. Chaque littéral de cette clique est égal à xi ou à ¬xi. Pour que ce littéral soit vrai, on impose la valeur 1 ou 0 à la variable correspondante xi. Comme tous les littéraux de la clique sont reliés par une arête, ils ne sont pas contradictoires deux à deux. Ceci signifie que deux littéraux quelconques de la clique concernent deux variables distinctes xi et xj avec i ≠ j ou alors ils concernent la même variable xi mais ils imposent la même valeur à la variable xi. On obtient alors une assignation cohérente des variables apparaissant dans la clique. En affectant n'importe quelle valeur à chacune des autres variables, on obtient une affectation qui donne la valeur 1 à la formule f.
En conclusion : 3-SAT ≤P CLIQUE.
4) Réponse : La programmation dynamique permet de résoudre des problèmes respectant deux critères : le critère d’optimalité et le critère de chevauchement de sous-structures.
5) Classe non-sérielle et classe monadique
La classe non-sérielle est constituée des problèmes de programmation dynamique pour lesquels la solution d’un sous-problème à un niveau N donné dépend des solutions des sous-problèmes de plusieurs niveaux précédents (inférieurs à N).
La classe monadique est constituée des problèmes de programmation dynamique pour lesquels le nombre de termes récursifs est égal à un. Exemple : Le problème de LCS appartient à la classe monadique. En effet, dans l’équation fonctionnelle qui décrit sa solution, la fonction de composition ne contient qu’un seul terme récursif. Dans toutes les alternatives du membre droit de cette équation, l’évaluation du sous-problème L(i,j) ne dépend que d’un seul sous-problème (terme récursif) à la fois : soit L(i−1,j−1)+1, soit L(i,j−1), soit L(i−1,j).