IP (Integer programming) est NP-complet ? Certificat : un vecteur Verification :
3-partition NP-complet
Instance une séquence d’entiers Question : il existe sous sequences de tel que et
NP ? Certificat : une permutation (les positions des entiers à prendre dans la séquence) Vérification : Polynomial (on construit du sous-ensemble à partir de la permutation)
NP-hard ?
k = si k n’est pas pair retourner faux ajouter à S l’entier retourner 3P(S)
4-partition
Même chose avec
Dans l’examen : 3-partition partition
Balck box programming
Hypothèse que
: Réduction de Karp : réduction de Cook-Turing
A decision problem is Cook-Turing reducible to if there is a polytime algo solving whenever there is a poly-time algo solving .
A language is self-reducible if there is a Cook-Turing reduction from the serach problem for to the decision problem for .
Blackbox algo:
- input = instance d’un pb de recherche
- output = un algo poly pour le probleme de recherche
Exemple : CliqueMax L’oracle nous donne algocliquedec(G, k) → oui ou non (avec une complexité O(1)) On cherche un algo algoclique(G) qui retourne une clique de taille max.
TailleMax → algo poly
k = TailleMax(G) pour x X : si algocliquedec(G|x): alors G = G|x retourner G
Donc cliquemax est self-reducible
Pareil pour HAM en retirant les arrètes
- SAT est self-reducible
- partition
- SACADOS
- Color
- sous-graphe
SAT self-reducible
SATdec → oui/non Exemple: Idée : est-ce qu’il y a une solution avec Algo: si ! SATdec(): retourner faux v[] pour i = 1 a n: si SATdec(): = v[i] = 0 sinon: = v[i] = 1 retourner v
SACADOS self-reducible
sacadosdec(X, w, u, B, k) Idée : on cherche le k max. on fixe les variables existe t il une solution avec .
Algo: k = 1 tant que sacadosdec(X, w, u, B, k): k = k+1
Mais cet algo est exponentielle donc on peut utiliser la dichotomie
pour x X: si sacadosdec(X, w, u, B, k): X = X \ (x) W = W \ (x) U = U \ (x) retourner X
Partition
partitiondec(S) → oui/non Idée : Est-ce que deux entiers seront ensemble dans la même partition ?
Exemple : <2, 3, 4, 3, 6, 7, 5> <5, 4, 3, 6, 7, 5> // Le 2 et 3 seront donc ensemble <9, 3, 6, 7, 5> <15, 3, 7, 5> <22, 3, 5>
s1 = <2, 3, 4, 6> s2 = <3, 7, 5>
Algo : si ! partitiondec(S): retourner faux s1 = {x0}, s2 = {} pour i = 2 a n: si partitiondec(S \ {xi}): s1 = s1 {xi} sinon: s2 = s2 {xi} retourner (s1, s2)
Color
colordec(G, k) → oui/non on a k min en O(n) Idée : Est-ce que deux sommets n’auront pas la même couleur ? Comment : on demande a l’oracle si on peut colorier le graphe avec une arete en plus entre les 2 sommets ?