Cómo demostrar que la mochila continua con elementos de opción múltiple es un problema NP-difícil

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.

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.

Será útil tener una formalización del “problema de la mochila continua con elementos de opción múltiple”. Tenemos una colección de elementos 1, 2, …, n con pesos [matemática] w_i> 0 [/ matemática] y valores [matemática ] v_i> 0 [/ matemáticas]. Los elementos se dividen en conjuntos de opción múltiple [matemática] C_k [/ matemática] con como máximo un elemento utilizable de cada conjunto de elección. Una solución es [matemática] x_i \ en [0, 1] [/ matemática] tal que

[matemáticas] \ sum x_i w_i \ leq W [/ matemáticas]

[matemáticas] \ sum x_i v_i \ geq V [/ matemáticas]

Si [matemática] x_i> 0 [/ matemática] para alguna [matemática] i \ en C_k [/ matemática], entonces [matemática] x_j = 0 [/ matemática] para [matemática] j \ en C_k – \ {i \} [/mates]

Necesitamos mostrar cómo transformar otra instancia de problema NP-hard en este formulario. Una instancia del problema de PARTICIÓN es un conjunto de enteros positivos, con el objetivo de dividir en dos conjuntos con sumas iguales. Nos gustaría codificar la decisión de qué partición obtiene qué número entero, como una opción en el problema de la mochila.

Llamemos a los números en el problema de PARTICIÓN [math] y_i [/ ​​math], y observe que una partición exitosa deja ambos conjuntos con sum [math] \ frac {1} {2} \ sum y_i [/ ​​math], que nosotros ‘ lo usaré como nuestro [math] W [/ math].

Para cada [math] y_i [/ ​​math], construyamos un conjunto de opciones [math] C_i [/ ​​math] de dos elementos [math] \ {x_ {2i}, x_ {2i + 1} \} [/ math] donde

[matemáticas] w_ {2i} = 0 [/ matemáticas]

[matemáticas] v_ {2i} = L [/ matemáticas]

[matemáticas] w_ {2i + 1} = y_i [/ ​​matemáticas]

[matemáticas] v_ {2i + 1} = y_i + L [/ matemáticas]

y [math] L [/ math] es un número suficientemente grande. Entonces queremos establecer [math] W = \ frac {1} {2} \ sum y_i [/ ​​math] como se describió anteriormente, y [math] V = W + nL [/ math], donde [math] n [/ matemática] es el tamaño de entrada del problema de PARTICIÓN.

Intuitivamente, esto dice que podemos alcanzar nuestra meta solo eligiendo un conjunto de [math] y_i [/ ​​math] que sume la mitad de la suma de la entrada original, produciendo así dos particiones iguales. Si tenemos un conjunto de entrada que consta de todos los [math] x_i [/ ​​math] 0 o 1, entonces es fácil ver que podemos leer la solución de partición: [math] x_ {2i} = 1 [/ math ] significa incluir [matemática] y_i [/ ​​matemática] en la partición A, [matemática] x_ {2i + 1} = 1 [/ matemática] significa incluir [matemática] y_i [/ ​​matemática] en la partición B. Pero es posible que el la solución dará como resultado algún no entero [matemático] x_i [/ ​​matemático], o no usará ninguna de las opciones dentro de uno de nuestros conjuntos de opciones?

Nuestro límite inferior [math] V [/ math] también es el máximo alcanzable ya que solo obtenemos el valor máximo [math] y_i + L [/ math] de cualquier conjunto de opciones y no podemos elegir más de [math] W [/ math] valor de cualquier combinación de [math] y_i [/ ​​math] ‘s. Eso significa que nunca encontraremos una solución que no use al menos la “libre” [matemática] x_ {2i} [/ matemática] con peso cero y valor positivo.

¿Qué pasa con una [matemática] x_ {2i + 1} [/ matemática] fraccional? Podemos mostrar que, en general, las soluciones óptimas para la mochila continua con problemas de elección solo tienen un valor fraccional (o al menos pueden transformarse en tal caso). Si dos [math] x [/ math] tienen valores fraccionarios , ya sea:

  • tienen proporciones iguales de valor a peso, por lo que podemos reducir una mientras aumentamos la otra sin violar los límites W y V. Esto puede continuar hasta que una de las variables llegue a 0 o 1, reduciendo el recuento fraccional en uno.
  • o uno es “más denso” que el otro, por lo que podemos mejorar la solución aumentando esa a expensas de la otra (nuevamente acotada por el golpe más valioso 1 o el golpe menos valioso 0.)

Entonces, en el problema transformado, a lo sumo, una [matemática] x_ {2i + 1} [/ matemática] tiene un valor fraccional, llámela [matemática] x_k [/ matemática]. Eso significa [matemática] x_k (y_i + L)> L [/ matemática], ya que de lo contrario simplemente tomaríamos la opción de peso cero. Pero como [math] W [/ math] es un número entero y todos los demás [math] x_i [/ ​​math] son ​​1 o 0, [math] x_k y_i [/ ​​math] también es un número entero. Si reescribimos como [math] x_k y_i> (1 – x_k) L [/ math] entonces la Propiedad Archimedean dice que siempre podemos encontrar una L lo suficientemente grande como para falsificar la desigualdad. Eso significa que no existe tal [math] x_k [/ math].

(Veo que la respuesta de Michal Forisek usa el mismo widget para un problema de elección diferente).

Para cruzar nuestras i y puntear nuestras t, debemos tener en cuenta que la reducción es solo polinomialmente más grande y solo requiere tiempo polinómico para calcular.