Problema de mochila: ¿NP completo a pesar de la solución de programación dinámica?

52

Los problemas de la mochila se resuelven fácilmente mediante programación dinámica. La programación dinámica se ejecuta en tiempo polinomial; Por eso lo hacemos, ¿verdad?

Sin embargo, he leído que en realidad es un problema NP-completo, lo que significaría que resolver el problema en un problema polinómico es probablemente imposible.

¿Dónde está mi error?

Strin
fuente
55
Tenga en cuenta que DP es polinomio en el "tamaño de la tabla". La tabla es exponencialmente grande para la mochila (ver la respuesta de Kaveh).
Raphael

Respuestas:

41

El problema de la mochila es cuando los números se dan como números binarios . En este caso, la programación dinámica tomará exponencialmente muchos pasos (en el tamaño de la entrada, es decir, el número de bits en la entrada) para terminar .NP-complete

Por otro lado, si los números en la entrada se dan en unario, la programación dinámica funcionará en tiempo polinómico (en el tamaño de la entrada).

Este tipo de problemas se llama débilmenteNP-complete .

: Otro buen ejemplo para comprender la importancia de la codificación utilizada para dar la entrada es considerar los algoritmos habituales para ver si un número es primo que va desde hasta y verificar si alguno de ellos divide . Esto es polinomial en pero no necesariamente en el tamaño de entrada. Si se da en binario, el tamaño de entrada es y el algoritmo se ejecuta en el tiempo que es exponencial en el tamaño de entrada. Y la complejidad computacional habitual de un problema es el tamaño de la entrada.2nnnnlgnO(n)=O(2lgn/2)

Este tipo de algoritmo, es decir, polinomio en el mayor número que es parte de la entrada, pero exponencial en la longitud de entrada se llama pseudo-polinomio .

Kaveh
fuente
Pero piense en los objetos que se colocarán en la mochila. Los objetos deben ser ingresados ​​y dicha entrada debe ser polinómica con el número de objetos. Si los objetos son suficientes, la entrada es polinómica con el tamaño del problema. Entonces, ¿por qué no puedo decir que el problema de la mochila es un problema P en términos del tamaño de la tabla? ¿Me equivoco?
Strin
@Strin, no, una pequeña cantidad de objetos puede ser suficiente para sentir una mochila grande, por ejemplo, si el tamaño de la mochila es , un objeto de tamaño es suficiente. El tamaño de la entrada es aproximadamente , mucho más pequeño que . (Supongo que estamos hablando de 0-1 Mochila.)m 2 lg m mmm2lgmm
Kaveh
¿Puedes dividir la entrada en entradas más pequeñas cuya codificación binaria tenga un tamaño que finalice el algoritmo en tiempo polinómico y luego combine las soluciones?
Char
@Kaveh "El tamaño de la entrada es de aproximadamente 2 lg m" No entiendo de dónde sacas esa parte. La relación entre m(tamaño del paquete) y n(número de artículos) es totalmente desconocida, ¿verdad? Y re "cuando los números se dan como números binarios" ... pero ¿no podrías decir eso para nada? Con la mayoría de los algoritmos, hablamos del tamaño de entrada en la base 10. ¿Por qué hablar de binario aquí? Y si codifica en binario, octal, decimal, etc., el actualnúmero de veces que itera a través de su bucle de algoritmo principal depende directamente de ambos ny W.
The111
1
@ The111, creo que es mejor si publica eso como una nueva pregunta y publicaré una respuesta. Creo que su pregunta es más fundamental y sus comentarios no están muy relacionados con esta pregunta.
Kaveh
33

La principal confusión radica en la diferencia entre " tamaño " y " valor ".

" Tiempo polinomial " implica polinomio wrt el tamaño de la entrada.

" Tiempo pseudopolinomial " implica polinomio wrt el valor de la entrada. Se puede mostrar (a continuación) que esto es equivalente a ser exponencial wrt el tamaño de la entrada.


En otras palabras: deje que represente el tamaño de la entrada y represente el valor de la entrada. N v a lNsizeNval

Tiempo polinómico: parax NO(Nsizex)xN

Pseudopolía. Tiempo: parax NO(Nvalx)xN

Ahora, el problema de la mochila tiene una solución pseudopolinómica, no polinómica , porque la solución de programación dinámica proporciona un tiempo de ejecución dependiente de un valor , es decir, , donde es un valor que representa la capacidad máxima.WO(nW)W

Ahora, un valor se puede convertir a un tamaño representándolo en términos de # de dígitos que se necesitan para representarlo. te dice cuántos dígitos son necesarios para representar usando la base . Esto se puede resolver para para dar:N v a l b N v a lNsize=Logb(Nval)NvalbNval

Nval=bNsize

Conectar esto a la definición de tiempo pseudopolinomial muestra que es exponencial wrt :Nsize

O(bxNsize)b,xN

bcorso
fuente
77
¡Creé una cuenta aquí solo para decir muchas gracias! Solo después de su ejemplo, finalmente lo entendí.
Inoryy
2
Su respuesta supera a todos, bravo!
Muhammad Razib
1
Para agregar a esta gran respuesta, podemos decir que si cambiamos el W de 100 a 101, el tamaño del problema no aumenta, el tamaño aumenta si agregamos otro bit a W, lo que lo hace el doble de grande, por lo que la tabla sería tener el doble de filas y, por lo tanto, al aumentar el tamaño en uno, el tiempo del problema se duplica, por eso es exponencial.
Amén
@ bcorso Supongamos que se le da un valor N. ¿Y tenía que encontrar la suma de números del 1 al N y utilizó el método for loop, que sería un algoritmo de tiempo pseudopolinomial?
DollarAkshay
8

P=NP

Sin embargo, existen diferentes variantes (p. Ej., 0-1 Mochila y otras ) que pueden tener o no soluciones de tiempo polinómico o buenas aproximaciones. Pero esto no es lo mismo que el problema general de la mochila. Además, puede haber algoritmos eficientes que funcionen para instancias específicas (familias de) , pero estos algoritmos tardarán más en otras instancias.

Sonó.
fuente