Calculadora Knapsack 0/1 (Problema de la Mochila)
Calculadora problema de la mochila 0/1, fraccional y bounded: programacion dinámica, greedy, comparacion eficiencia valor/peso y reconstruccion de la solución.
Reportar un error de cálculo
Ayúdanos a mejorar. Describe qué no cuadra en el cálculo.
Resultado
| Voce | Valore |
|---|
Mostrar detalles completos
Compartir resultado
Aviso: este cálculo tiene valor puramente indicativo. Para decisiones importantes, consulta a un profesional cualificado.
El problema de la mochila
El problema de la mochila (knapsack) es uno de los 21 problemas NP-completos originales de Karp (1972) y piedra angular de la optimización combinatoria. Dada una colección de objetos con peso y valor, y una mochila de capacidad W, determinar el subconjunto que maximiza el valor total sin exceder la capacidad. Variantes principales: 0/1 (objeto entero o excluido), fraccional (fracciones permitidas), bounded (copias limitadas).
Formulación matemática
Maximizar Sigma v_i * x_i sujeto a Sigma w_i * x_i <= W. Con x_i en {0,1} para 0/1, x_i en [0,1] para fraccional, x_i en {0,1,...,q_i} para bounded. La versión de decisión es NP-completa; la optimización es NP-hard. Existen algoritmos pseudo-polinomiales O(nW) via programación dinámica.
Programación dinámica
El algoritmo clasico construye dp[i][w] = valor máximo con los primeros i objetos y capacidad w. Recurrencia: dp[i][w] = max(dp[i-1][w], dp[i-1][w-w_i] + v_i) si w_i <= w. Caso base dp[0][w] = 0. La solución óptima es dp[n][W]; los objetos se recuperan por backtracking. Complejidad O(nW) tiempo, reducible a O(W) espacio.
Las cuatro modalidades
- Resolver 0/1: programación dinámica con reconstrucción.
- Fraccional: greedy ordenando por v/w decreciente.
- Bounded: descomposición binaria reduciendo a 0/1.
- Comparación eficiencia: rapports valor/peso.
Greedy falla en 0/1
Ordenar por v/w decreciente resuelve el fraccional pero puede ser arbitrariamente subóptimo para 0/1. Ejemplo: W=10, objetos [(6,60), (5,50), (5,50)]. Greedy elige el primero (ratio 10) dejando W=4 sin usar: valor 60. El óptimo toma los ultimos dos: valor 100.
Aproximación FPTAS
Existe un esquema de aproximación totalmente polinomico (FPTAS) para knapsack 0/1: para todo epsilon>0, algoritmo en O(n^3/epsilon) que devuelve solución >= (1-epsilon) * OPT. Se obtiene escalando valores por v_max*epsilon/n y aplicando DP sobre valores.
Ejemplo clasico
W=10, objetos (2,3), (3,4), (4,5), (5,6). DP da dp[4][10] = 13 seleccionando objetos 1, 2, 4 (pesos 2+3+5=10, valores 3+4+6=13).
Aplicaciones
- Asignación de presupuesto: selección de proyectos con ROI máximo.
- Cutting stock: optimización de corte en textil, papel, metal.
- Optimización de portafolio: selección de activos con limite de capital.
- Carga de contenedores: logistica maritima y aerea.
- Asignación de recursos en cloud: VM placement con limites RAM/CPU.
Historia del problema de la mochila
El problema de la mochila (en inglés knapsack) toma su nombre de la situación intuitiva de quien debe llenar una mochila de capacidad limitada eligiendo, entre muchos objetos, los de valor total máximo. Formalizado en la investigación operativa a mediados del siglo XX, se convirtió en uno de los problemas más estudiados de la informática teórica. En 1972 Richard Karp lo incluyó en su célebre lista de 21 problemas NP-completos, sellando su dificultad intrínseca. El problema tuvo también un papel histórico en criptografía: en 1978 Ralph Merkle y Martin Hellman propusieron uno de los primeros criptosistemas de clave pública basados en la mochila (el Merkle-Hellman knapsack). La idea era usar la dificultad del problema como garantía de seguridad, pero el sistema fue espectacularmente roto por Adi Shamir en 1982, que aprovechó su estructura particular. Desde entonces la mochila sigue siendo un banco de pruebas fundamental para algoritmos exactos, heurísticos y de aproximación.
Por qué el algoritmo es pseudo-polinomial
La programación dinámica resuelve la mochila 0/1 en tiempo O(n·W), donde n es el número de objetos y W la capacidad. A primera vista parece eficiente, pero hay un detalle sutil: W es un valor numérico, no el tamaño de la entrada. Para representar la capacidad W bastan unos log₂(W) bits, así que el tiempo O(n·W) es exponencial en la longitud de los datos de entrada. Esto es lo que se entiende por algoritmo pseudo-polinomial: polinomial en el valor de los números, pero exponencial en el número de cifras. Por eso la mochila es NP-hard en sentido débil: si las capacidades y pesos son pequeños, la DP es rapidísima, pero con números enormes (cientos de cifras) se vuelve impracticable. Un algoritmo realmente polinomial en el tamaño de la entrada no se conoce, y su existencia equivaldría a demostrar P = NP.
Actualizado a julio de 2026
Comentarios (0)
Accede para dejar un comentario.
Sin comentarios aún. ¡Sé el primero!