Algorithmique I
Année 2008-2009
A. Benoit, B. Depardon
C. Mouilleron, C. Rezvoy
TD no10
N P-Complétude et Approximation
1N P-complétude de 2-Partition
On définit le problème de décision 2-Partition ainsi : soit S={a1, . . . , an}des entiers,
existe-t-il IStel que PiIai=Pi6∈Iai?
Question 1.1 Montrer que 2-Partition est NP-complet.
Remarque : on pourra utiliser le problème NP-complet SUBSET-SUM vu dans le TD précédent :
Instance : un ensemble fini Sd’entiers positifs et un entier objectif t.
Question : existe-t-il un sous-ensemble S0Stel que PxS0x=t?
Solution : 2-Partition est trivialement dans NP : on vérifie en temps linéaire qu’un certificat
nous donne bien PiIai=Pi6∈Iai.
On fait une réduction à partir de SUBSET-SUM. Soit une instance de SUBSET-SUM : on
anentiers S={a1, . . . , an}, et un objectif t. On construit une instance de 2-Partition de la
façon suivante :
si tPn
i=1 ai<2t: on pose an+1 = 2tPn
i=1 ai, et on construit un ensemble S0=
S{an+1}pour 2-Partition. On a donc Pn+1
i=1 ai= 2t. Si on a une solution I1à SUBSET-
SUM telle que PiI1ai=t, alors on a une solution pour 2-Partition en prenant PiI1ai=
PiS0\I1ai=t. Inversement si 2-Partition a une solution, alors nécessairement an+1 I
ou an+1 S0\I, et il suffit de prendre le sous ensemble de S0qui ne contient pas an+1.
si 2tPn
i=1 ai: on pose an+1 =Pn
i=1 ai2t, et on construit l’ensemble S0comme précé-
demment. On a donc Pn+1
i=1 ai= 2 Pn
i=1 ai2t. Comme précédemment on a l’équivalence
des solutions avec PiI1ai=PiS0\I1ai=Pn
i=1 ait, et donc nécessairement on a soit
dans I1soit dans S0\I1:Pn
i=1 ai2t+PiJai, et donc l’ensemble Jpermet d’avoir
PiJai=tla solution à SUBSET-SUM.
Donc 2-Partition est NP-complet.
2 3-Partition à la 2-Partition
Étant donnés nentiers S{a1, a2, . . . , an}, peut-on trouver trois sous-ensembles I1,I2et I3
partitionnant [1..n]et tels que PiI1ai=PiI2ai=PiI3ai?
Question 2.1 Montrer que 3-Partition à la 2-Partition est NP-complet.
Solution : 3-partition appartient à NP : étant donné un certificat on vérifie en temps linéaire
que PiI1ai=PiI2ai=PiI3ai.
On va faire une réduction à partir de. . . 2-Partition (étonnant non ?). Pour construire
une instance de 3-Partition on prend donc une instance de 2-Partition avec nentiers S=
{a1, . . . , an}, avec P=Pn
i=1 aiet tels que i, aiP/2(sinon il n’y a pas de solution), et on
1
rajoute un nouvel entier an+1 =P/2. Si 2-Partition a une solution Iavec l’ensemble initial
S, alors il suffit de prendre comme solution pour 3-Partition : PiIai=Pi6∈Iai=an+1, soit
I1=I,I2=S\Iet I3=an+1.
Réciproquement, si 3-Partition a un solution, alors nécessairement on a I1ou I2ou I3qui
est égal à I0an+1, avec PiI0ai= 0, et il suffit de prendre les sous-ensembles restant comme
solution de 2-Partition.
Donc 3-Partition est NP-complet.
Question 2.2 S’agit-il de NP-complétude au sens faible ou au sens fort ?
Solution : Au sens faible. Prendre l’algo du cours pour 2-Partition et l’adapter pour 3-Partition.
3 Approximabilité de SUBSET-SUM
Dans TD le précédent, on s’est intéressé au problème de décision SUBSET-SUM consistant à
savoir s’il existe un sous-ensemble d’entiers de Sdont la somme vaut exactement t. Le problème
d’optimisation qui lui est associé prend aussi en entrée un ensemble d’entiers strictement positifs
Set un entier t, il consiste à trouver un sous-ensemble de Sdont la somme est la plus grande
possible sans dépasser t(cette somme qui doit donc approcher le plus possible tsera appelée
somme optimale).
On suppose que S={x1, x2, . . . , xn}et que les ensembles sont manipulés sous forme de listes
triées par ordre croissant. Pour une liste d’entiers Let un entier x, on note L+xla liste d’entiers
obtenue en ajoutant xà chaque entier de L. Pour les listes Let L0, on note Fusion(L, L0)la
liste contenant l’union des éléments des deux listes.
Premier algorithme
début
n← |S|;
L0← {0};
pour ide 1ànfaire
LiFusion(Li1, Li1+xi);
Supprimer de Litout élément supérieur à t;
fin
retourner le plus grand élément de Ln;
fin Algorithme 1 : Somme(S, t)
Question 3.1 Quelle est la distance entre la valeur retournée par cet algorithme et la somme
optimale ?
Solution : On a un ensemble S={x1, . . . , xn}d’entiers strictement positifs ainsi qu’un entier
t. On cherche une somme partielle d’éléments de Smaximale et inférieure à t. On appellera
somme optimale ce nombre.
2
Dans le premier algorithme, Lireprésente l’ensemble des sommes partielles des éléments
de {x1, . . . , xi}inférieures à t.Lnreprésente donc l’ensemble des sommes partielles de Sinfé-
rieures à t. Par conséquent, max(Ln)renvoie exactement la somme optimale de S. De plus, cet
algorithme a testé toutes les sommes partielles inférieures à t.
La différence entre le résultat trouvé et la somme optimale est 0.
Question 3.2 Quelle est la complexité de cet algorithme dans le cas général ? Et si pour un
entier k1fixé, on ne considère que les entrées telles que t=O(|S|k), quelle est la complexité
de cet algorithme ?
Solution :
Dans le pire des cas, on teste toutes les sommes partielles de Ssoit une complexité en
O(2n): il existe des entrées telles que |Li|= 2i, prendre par exemple S={1,2,22,...,2i,...,2n1}
et tgrand (2n). Or comme la fusion à chaque étape est en O(|Li1|), la complexité totale
est exponentielle en n.
Si t=O(|S|k) = O(nk)pour kun entier fixé, alors |Li|=O(|S|k). Au pas ide la boucle,
la fusion et la suppression se font en O(|Li|). Comme il y a npas dans la boucle, la
complexité totale est O(|S|k+1).
Deuxième algorithme Cet algorithme prend en entrée un paramètre en plus, où est un
réel vérifiant 0<  < 1.
début
n← |S|;
L0← {0};
pour ide 1ànfaire
LiFusion(Li1, Li1+xi);
LiSeuiller(Li, /2n);
Supprimer de Litout élément supérieur à t;
fin
retourner le plus grand élément de Ln;
fin Algorithme 2 : Somme-avec-seuillage(S, t, )
L’opération Seuiller décrite ci-dessous réduit une liste L=< y0, y1, . . . , ym>(supposée
triée par ordre croissant) avec le seuil δ:
3
début
m← |L|;
L0< y0>;
dernier y0;
pour ide 1àmfaire
si yi>(1 + δ)dernier alors
Insérer yià la fin de L0;
dernier yi;
fin
fin
retourner L0;
fin Algorithme 3 : Seuiller(L, δ)
Question 3.3 Évaluer le nombre d’éléments dans Lià la fin de la boucle. En déduire la
complexité totale de l’algorithme. Pour donner la qualité de l’approximation fournie par cet
algorithme, borner le ratio valeur retournée/somme optimale.
Solution : Considérons une liste l = {y0, . . . , ym}d’entiers triés par ordre croissant et δ > 0.
L’opération de seuillage va consister à dire : soit y’ le dernier élément gardé de l (on garde y0
au départ) si yi> y0(1 + δ)alors on va garder yi. En gros, on enlève les éléments qui sont trop
proches d’autres éléments.
L’algorithme proposé va fonctionner de la même façon que le précédent sauf qu’il va seuiller
à chaque pas de la boucle Lipar rapport à /2n. On a alors Ln={y0, . . . , ym}. On va essayer
de majorer m. On sait que :
tym(1 + /2n)m1y0(1 + /2n)m1
D’où : mln t/ ln(1 + /2n) + 1 2nlog(t)
log(2) + 1, car (m1) log(1 + /2n)log(t)et donc
(m1)/2nlog(2) log(t)(car on a l’inégalité xlog(2) log(1 + x)quand 0x1).
mest donc polynomial en ln t, en 1/ et en n, donc polynomial en la taille des données.
L’algorithme est en O(mn), donc polynomial en la taille des données. Complexité totale : O(n×
2nlog(t)
log(2) + 1) = O(n2log(t)
).
Il faut maintenant vérifier qu’on a bien trouvé une (1 + )Approximation en montrant que :
max{Ln} ≥ (1 + )Opt(somme optimale)
On note Pil’ensemble des sommes partielles de {x1, . . . , xi}inférieures à t.
Invariant : xPi,yLi, x/(1 + δ)iyx
Par récurrence :
i= 0 : OK
On suppose que c’est vrai pour (i1) et on le montre pour i: Soit xPi
Pi=Pi1(Pi1+xi)
x=x0+eavec x0Pi1, e = 0 ou e =xi
x0Pi1donc y0, x0/(1 + δ)iy0x0
Si y’ + e est conservé par le seuillage :
4
(x0+e)/(1 + δ)ix0/(1 + δ)i1+ey0+ex0+e=x
Si y’ + e n’est pas conservé par le seuillage :
y00 Li, y00 y0+xiy00 (1 + δ)
(y0+e)/(1 + δ)y00 y0+ex0+ex
(x0/(1 + δ)i1+e)/(1 + δ)y00
(x0+e)/(1 + δ)iy00
C’est l’encadrement recherché.
Grâce à l’invariant, on obtient : Algo Opt/(1 + /2n)nOpt(1 + )
On a donc une (1 + )approximation de Subset-sum polynomiale en la taille des données
et polynomiale en 1/.
4 Encore des problèmes N P-complets
4.1 2-Partition-Approx
Question 4.1 Etant donnés nentiers a1, a2, . . . , an, peut-on trouver un sous-ensemble I[1..n]
tel que |PiIaiPi/Iai| ≤ 1Solution : NP : trivial.
Instance I1 de départ : a1, ...ande 2-partition.
Instance I2 créée : (1664a1, ...1664an).
Equivalence : S’il existe I avec PiIai=Pi[1,n]\Iai, alors |PiIaiPi[1,n]\Iai|= 0 1
Réciproquement, s’il existe I avec |PiI1664aiPi[1,n]\I1664ai| ≤ 1, alors on a |PiIai
Pi[1,n]\Iai| ≤ 1/1664. Or on travaille dans les entiers, ainsi on aboutit à PiIai=Pi[1,n]\Iai.
4.2 2-Partition avec même cardinal
Question 4.2 Soient n= 2pun entier pair, et nentiers strictement positifs a1, a2, . . . , an.
Existe-t-il une partition de {1,2,...n}en deux ensembles Iet I0de même cardinal pet tels que
PiIai=PiI0ai?Solution : NP : trivial.
Instance I1 de départ : a1, ...ande 2-partition.
Instance I2 créée : (a1+ 1, ...an+ 1,1, ...1) de cardinal 2n.
Equivalence : Si PiIai=Pi[1,n]\Iaialors PiI(ai+1)+(n|I|) = Pi[1,n]\I(ai+1)+|I|.
Réciproquement, une solution est de la forme PiI(ai+1)+(n|I|) = Pi[1,n]\I(ai+1)+|I|.
En effet il faut avoir n termes à droite et à gauche donc il faut rajouter un (n− |I|)à gauche,
et |I| ≤ nsinon au n’aurait jamais l’égalité, car tous les aisont positifs. Ainsi on a bien
PiIai=Pi[1,n]\Iai
5
1 / 7 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !