Para referencia y notación, primero una definición formal del problema.
- Tenemos una colección de conjuntos disjuntos [math] U_1, \ dots, U_m [/ math]
- Cada elemento [math] u \ in \ bigcup U_i [/ math] tiene un tamaño [math] s (u) [/ math] y un valor [math] v (u) [/ math]; Todos los tamaños y valores son enteros no negativos.
- De cada [math] U_i [/ math] solo podemos seleccionar una parte fraccionaria (en cualquier lugar entre 0 y 1, inclusive) de un solo elemento. El tamaño y el valor se escalan linealmente.
- Se proporciona un umbral [math] s_ {max} [/ math] en el tamaño total de los elementos seleccionados.
- Maximiza su valor total.
En la versión de decisión de este problema, se le dan [math] s_ {max} [/ math] y [math] v_ {min} [/ math] y se le pregunta si hay una selección que tenga un tamaño total [math] \ leq s_ {max} [/ math] y el valor total [math] \ geq v_ {min} [/ math].
Mostraremos que el problema de decisión es NP-duro al reducir una mochila ordinaria 0-1 a este problema. Recuerde que en KNAPSACK tenemos una sola colección de elementos [math] n [/ math], cada uno con su tamaño y valor entero no negativo, y estamos buscando un subconjunto de esos elementos con tamaño [math] \ leq s_ {max} [/ math] y valor máximo.
- ¿Cuál es un ejemplo de un árbol binario roscado?
- ¿Cómo funciona un algoritmo de 'aprendizaje de representación'?
- ¿Cómo verificamos la corrección de un algoritmo?
- ¿Cuál es el algoritmo utilizado para mostrar el orden de amigos que se muestra en toda la lista de amigos en Facebook?
- ¿De dónde provienen los datos de entrenamiento para analizar las consultas en inglés en un árbol para Facebook GraphSearch?
Para reducir KNAPSACK a nuestro problema, haga lo siguiente:
Para cada elemento (tamaño [math] s_i [/ math], valor [math] v_i [/ math]) en la instancia de mochila 0–1 tendremos un conjunto con dos elementos en la instancia de nuestro problema: uno es (tamaño [matemática] s_i [/ matemática], valor [matemática] X + v_i [/ matemática]), la otra es (tamaño [matemática] 0 [/ matemática], valor [matemática] X [/ matemática]). Aquí, [math] X [/ math] es una constante entera positiva que es lo suficientemente grande. [matemáticas] X [/ matemáticas] es el mismo para todos los elementos. Queremos maximizar el valor total, dado que el tamaño total de las piezas seleccionadas no excede [math] s_ {max} [/ math] (que es el mismo umbral que en la instancia de mochila).
Ahora podemos demostrar que 1. nuestra instancia del problema continuo tiene una solución óptima en la que cada fracción es 0 o 1, y que 2. el valor de esa solución nos da la solución óptima de la instancia original de la mochila.
La parte 2 es bastante obvia. Supongamos que tenemos una solución óptima de nuestro problema continuo en el que cada fracción es 0 o 1. Obviamente, tomamos exactamente un elemento completo de cada conjunto: si no tomamos el primero, siempre podemos tomar el segundo, no hay inconveniente en hacerlo. El valor total será [math] nX [/ math] más la suma de los valores de los “elementos del primer tipo” que tomamos. Todas estas soluciones corresponden a soluciones válidas de la instancia original de la mochila, por lo que la mejor de estas soluciones también resuelve la mochila original.
Parte 1: Primero, podemos encontrar una solución óptima en la que, como máximo, una fracción sea distinta de 0 y 1. Esto se puede hacer mejorando repetidamente una solución en la que hay más fracciones. Entonces, podemos ver que la última fracción restante (si la hay) debe tener un pequeño denominador (como máximo igual a [math] \ max s_i [/ math]) y si tomamos una X lo suficientemente grande, siempre será es mejor tomar todo el segundo elemento en un par en lugar de una fracción del primer elemento en un par.