Problème de sac à dos - NP-complet malgré une solution de programmation dynamique?


52

Les problèmes de sac à dos sont facilement résolus par une programmation dynamique. La programmation dynamique s'exécute en temps polynomial; c'est pourquoi nous le faisons, non?

J'ai lu qu'il s'agit en réalité d'un problème NP-complet, ce qui voudrait dire que résoudre le problème en problème polynomial est probablement impossible.

Où est mon erreur?


5
Gardez à l'esprit que DP est polynomial dans la "taille de la table". Le tableau est exponentiellement grand pour Knapsack (voir la réponse de Kaveh).
Raphaël

Réponses:


41

Knapsack problème est NP-complete lorsque les nombres sont donnés à titre binaires des nombres. Dans ce cas, la programmation dynamique prendra de manière exponentielle de nombreuses étapes (taille de l’entrée, c’est-à-dire le nombre de bits de l’entrée) pour terminer .

Par contre, si les nombres de l’entrée sont donnés de manière unaire, la programmation dynamique fonctionnera en temps polynomial (à la taille de l’entrée).

Ce type de problèmes s’appelle faiblement NP-complete .

: Un autre bon exemple pour comprendre l'importance du codage utilisé pour l'entrée est de considérer les algorithmes habituels pour voir si un nombre premier va de2 àn et vérifiez si l'un d'eux divisen. Ceci est polynomial dansnmais pas nécessairement dans la taille d'entrée. Sinest donné en binaire, la taille de l'entrée estlgnet l'algorithme s'exécute dans le tempsO(n)=O(2lgn/2)ce qui est exponentiel dans la taille d'entrée. Et la complexité de calcul habituelle d'un problème est liée à la taille de l'entrée.

Ce type d’algorithme, c’est-à-dire polynomial dans le plus grand nombre qui fait partie de l’entrée, mais exponentiel dans la longueur en entrée, est appelé pseudo-polynôme .


Mais pensez aux objets à mettre dans le sac à dos. Les objets doivent être entrés et cette entrée doit être polynomiale avec le nombre d'objets. Si les objets sont assez nombreux, l'entrée est polynomiale avec la taille du problème. Alors pourquoi ne puis-je pas dire que le problème de Knapsack est un problème de P en termes de taille de la table? Ai-je tort?
Strin

@ Strin, non, un petit nombre d'objets peut être suffisant pour sentir un gros sac à dos. Par exemple, si la taille du sac à dos est , un objet de taille m suffit. La taille de l'entrée est d'environ 2 mg m , beaucoup plus petit que m . (Je suppose que nous parlons de 0-1 Knapsack.)mm2lgmm
Kaveh

Pouvez-vous décomposer l’entrée en entrées plus petites dont le codage binaire a une taille qui termine l’algorithme en temps polynomial puis combinez les solutions?
Char

@Kaveh "La taille de l'entrée est d'environ 2 lg m" Je ne comprends pas d'où provient cette partie. La relation entre m(taille du paquet) et n(nombre d'éléments) est totalement inconnue, non? Et re "quand les nombres sont donnés sous forme de nombres binaires" ... mais ne pouvez-vous pas le dire pour quoi que ce soit? Avec la plupart des algorithmes, nous parlons de taille d’entrée en base 10. Pourquoi parler de binaire ici? Et que vous encodiez en binaire, octal, décimal, etc., le actualnombre d'itérations que vous parcourez dans votre boucle principale de l'algorithme dépend directement de la net de la W.
Le11

1
@ The111, je pense que c'est mieux si vous postez cela comme une nouvelle question et je posterai une réponse. Je pense que votre question est plus fondamentale et il y a des commentaires qui ne sont pas très liés à cette question.
Kaveh

33

La principale confusion réside dans la différence entre " taille " et " valeur ".

" Temps polynomial " implique un polynôme par rapport à la taille de l'entrée.

" Temps pseudopolynomial " implique un polynôme par rapport à la valeur de l'entrée. On peut montrer (ci-dessous) que cela équivaut à être exponentiel par rapport à la taille de l'entrée.


NsizeNval

O(Nsizex)xN

O(Nvalx)xN

O(nW)W

Nsize=Logb(Nval)NvalbNval

Nval=bNsize

Nsize

O(bxNsize)b,xN


7
Créé un compte ici juste pour dire merci beaucoup! Ce n'est qu'après votre exemple que je l'ai enfin compris.
Inoryy

2
Votre réponse bat tout le monde, bravo!
Muhammad Razib

1
Pour ajouter à cette grande réponse que nous pouvons dire que si nous changeons le W 100-101 la taille du problème ne soit pas augmenté, la taille est augmentée si l' on ajoute un autre peu à W ce qui le rend deux fois plus grande, de sorte que la table serait deux fois plus de lignes et donc, si vous augmentez la taille d'une unité, le temps de problème est doublé, c'est pourquoi il est exponentiel.
Amen

@bcorso Supposons que vous receviez une valeur N. Et que vous deviez trouver la somme des nombres de 1 à N et que vous utilisiez la méthode de la boucle for, ce serait un algorithme pseudopolynomial Time?
DollarAkshay

8

P=NP

Il existe cependant différentes variantes (par exemple, 0-1 Knapsack et autres ) qui peuvent ou non avoir des solutions polynomiales ou de bonnes approximations. Mais ce n'est pas la même chose que le problème général de Knapsack. En outre, il peut exister des algorithmes efficaces fonctionnant pour des instances spécifiques (familles d' instances ) , mais ces algorithmes prendront plus de temps sur d'autres instances.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.