Subconjunto Suma: reducir caso especial a general

20

Wikipedia afirma que el problema de la suma de subconjuntos es encontrar un subconjunto de un conjunto múltiple de números enteros, cuya suma es cero. Además, afirma que es equivalente a encontrar un subconjunto con la suma de para cualquier dado .ss

Entonces, como son equivalentes, debe haber una reducción en ambos lados. El de a cero es trivial estableciendo . Pero no tuve suerte al encontrar una reducción de cero a , es decir, dado un conjunto de enteros , construir un conjunto de enteros contenga un subconjunto con suma (para cualquier ), si y solo si hay un subconjunto de con suma ceross=0sABssA

¿Me puede dar algunos consejos?

ipsec
fuente

Respuestas:

11

En realidad ya tienes una reducción de especial a general. Al establecer , básicamente está utilizando el algoritmo general para resolver el problema especial.s=0

Por el contrario (es decir, una reducción de general a especial):

Supongamos que está dado un conjunto y un número y hay que determinar si existe algún subconjunto de que resume a .S={x1,,xn}KSK

Ahora desea resolver este problema, dado un algoritmo para el caso en el que puede determinar si algún subconjunto suma .0

Ahora si , tenemos una reducción fácil: .xi>0S={x1,x2,,xn,K}

S tiene un subconjunto de suma si y sólo si tiene un subconjunto de suma .0SK

El problema ocurre cuando podemos tener para algunas de las .xi0i

Podemos suponer que (¿por qué?).K>0

Supongamos que la suma de la positiva es y el negativo es . P x i NxiPxiN

Ahora construya un nuevo conjunto tal queS={y1,y2,yn}

M = P + | N | + Kyi=xi+M donde .M=P+|N|+K

Cada .yi>0

Ahora ejecute el algoritmo de suma de subconjuntos cero en los conjuntos

S{(K+M)}

S{(K+2M)}

S{(K+3M)}

S{(K+nM)}

Es fácil mostrar que si tiene un subconjunto de suma , entonces al menos uno de los conjuntos anteriores tiene un subconjunto de suma cero.KSK

Te dejaré la prueba de la otra dirección.

Aryabhata
fuente
Muchas gracias. Me pregunto, ¿hay una reducción que transforme una instancia de suma de subconjuntos 0 en una instancia (en lugar de ) de suma de subconjuntos K? n
ipsec
@ipsec: ¿Quiere decir transformar una instancia de K-subset-sum en 0-subset-sum? Quizás tomar la unión de los conjuntos anteriores funcionará. n
Aryabhata
Bueno, en realidad estaba pensando dos veces si obtuve la dirección correcta ahora. Cuando quiero mostrar que K-subset-sum es NP-hard para cada K dado el hecho, que 0-subset-sum es NP-hard, puedo usar una reducción de 0-subset-sum a K-subset-sum , para lo cual necesitaría una transformación de poli-tiempo de cualquier instancia 0 a una instancia K. Pero ahora no estoy seguro de que esto sea realmente lo que he preguntado en mi pregunta.
ipsec
@ipsec: cuando dice set , ha mostrado la dureza NP de la suma de subconjuntos dada la dureza NP de la suma de subconjuntos cero: el problema general es al menos tan difícil como el problema especial. Tenga en cuenta que, en términos de reducción, usted dice que ha reducido la suma de subconjuntos cero a -subconjunto-suma. Además, tenga en cuenta que es una entrada . Cuando hablas de "cada dada ", ¿qué quieres decir exactamente? La respuesta anterior muestra que el caso especial (suma de subconjunto cero) es tan difícil (en sentido de dureza NP) como el caso general ( suma de subconjunto , donde es una entrada). K K K K k ks=0KKKKkk
Aryabhata
No importa. Lo que originalmente me preguntaba es, si sabemos que la suma de 0 subconjuntos es NP-hard, ¿podemos deducir que, por ejemplo, la suma de 1 subconjunto también lo es? Wikipedia lo dice, pero estaba buscando una reducción adecuada. Sin embargo, ahora veo que mi redacción estaba totalmente desordenada y, de hecho, estaba preguntando lo contrario. De todos modos, me diste suficiente información para reducir de cualquier instancia de suma de subconjuntos K a una instancia de suma de subconjuntos L para cualquier entero K y L, por lo que mi problema aún está resuelto.
ipsec
0

La respuesta de Aryabhata se puede solucionar haciendo uso del hecho de que podemos multiplicar todos los números por una c grande , y luego agregar algo pequeño a cada uno para actuar como una "etiqueta de presencia", y luego proporcionar algunos números adicionales que permitirán nosotros llegar a cero si pudiéramos llegar a cK sin ellos. Específicamente, usaremos c=2(n+1) y 1 como la etiqueta de presencia.

Dada una instancia (S={x1,,xn},K) del problema general con el valor objetivo K , crearemos una instancia del problema específico (con valor objetivo 0) que contenga:

  • Y={y1,,yn} , dondeyi=2(n+1)xi+1 .
  • El número z=2K(n+1)n .
  • n1 copias del número 1, que se denominarán números "pull-up".

Asumiré como Aryabhatta hace que K es positivo. (Como han pasado 6 años, responderé su ejercicio para el lector: la razón por la que podemos hacer esto es que si intercambiamos los signos de todos los números en una instancia del problema general, incluido K , entonces terminamos con un nueva instancia de problema equivalente. Eso significa que un algoritmo para resolver instancias positivas de K suficiente para resolver cualquier problema: para resolver una instancia con K negativa , podríamos realizar este intercambio de signos, ejecutar ese algoritmo y reenviar su respuesta como la respuesta a la pregunta original y, por supuesto, si K=0 ¡entonces no necesitamos realizar ninguna transformación del caso general en el caso especial!)

Primero, demostremos que una respuesta SÍ a la instancia dada del problema general implica una respuesta SÍ a la instancia construida del problema especial. Aquí podemos asumir que alguna solución {xj1,,xjm} para el problema general existe: es decir, esta colección no vacía de m números sumas a K . Entonces, si tomamos los valores y correspondientes {yj1,,yjm} en nuestra solución a la instancia construida, sumarán 2K(n+1)+m . Entonces podemos elegir incluir2K(n+1)n en la solución, dejándonos con una suma demn . Dado que1mn , esto está en el rango[n+1,0] , que podemos extraer con éxito hasta 0 al incluir algún subconjunto de los números desplegables.

Ahora demostremos que una respuesta SÍ a la instancia construida implica una respuesta SÍ a la instancia dada original. Aquí es donde la multiplicación por 2(n+1) vuelve importante: es lo que nos permite estar seguros de que los números adicionales que incluimos no pueden "hacer demasiado".

Aquí podemos suponer que existe alguna solución {yj1,,yjm} para la instancia construida: es decir, esta colección no vacía de números m se suma a 0. Según los requisitos del problema, esta solución contiene en menos un elemento Además, debe contener al menos un elemento de Y , ya que sin esto es imposible alcanzar un total de 0: si solo hay números desplegables, entonces la suma está necesariamente en el rango [1,n1] ( tenga en cuenta que en este caso al menos unoel número desplegable debe estar presente, y todos ellos son estrictamente positivos, por lo que la suma no puede ser 0); mientras que si la solución consiste solo en z y algunos números desplegables, entonces el total es necesariamente negativo porque z=2K(n+1)nn lo máximo que los números desplegables pueden aumentar la suma by es n1 .

zY2(n+1)nYn1Yn+n1=2n12(n+1)z2(n+1)Y2(n+1)2(n+1)z=2K(n+1)n

z

(2K(n+1)n)+i=1m(2(n+1)xji+1)+pull-ups=0

y podemos reorganizar los términos:

2K(n+1)+i=1m(2(n+1)xji)(n+i=1m1+pull-ups)=0

2K(n+1)+i=1m(2(n+1)xji)(n+m+pull-ups)=0

2(n+1)(K+i=1mxji)(n+m+pull-ups)=0

2(n+1)2(n+1)

(n+m+pull-ups)=0

Esto se puede sustituir directamente de nuevo en la ecuación anterior para obtener

2(n+1)(K+i=1mxji)=0

2(n+1)

K+i=1mxji=0

que da una solución a la instancia original del problema general.

j_random_hacker
fuente