Requisito previo: NP-Completitud , Problema de suma de subconjuntos
Problema de suma de subconjuntos: dados N enteros no negativos a 1 …a N y una suma objetivo K , la tarea es decidir si hay un subconjunto que tiene una suma igual a K .
Explicación: una instancia del problema es una entrada especificada para el problema. Una instancia del problema de la suma de subconjuntos es un conjunto S = {a 1 , …, a N } y un número entero K . Dado que un problema NP-completo es un problema que está tanto en NP como en NP-difícil , la prueba de la afirmación de que un problema es NP-Completo consta de dos partes:
- El problema en sí está en la clase NP.
- Todos los demás problemas en la clase NP pueden ser reducibles en tiempo polinomial a eso. (B es reducible en tiempo polinomial a C se denota como B ≤ P C )
Si solo se cumple la segunda condición , el problema se llama NP-Hard .
Pero no es posible reducir cada problema NP a otro problema NP para mostrar su NP-Completitud todo el tiempo. Es por eso que si queremos mostrar que un problema es NP-Completo, solo mostramos que el problema está en NP y cualquier problema NP-Completo es reducible a eso, entonces hemos terminado, es decir, si B es NP-Completo y B≤P C para C en NP, entonces C es NP-Completo. Por lo tanto, podemos verificar que el problema de la suma de subconjuntos es NP-Completo usando las siguientes dos proposiciones:
La suma del subconjunto está en NP:
si algún problema está en NP, entonces, dado un certificado, que es una solución al problema y una instancia del problema (un conjunto S de entero a 1 … a N y un entero K ) seremos capaz de identificar (si la solución es correcta o no) certificado en tiempo polinomial. Esto se puede hacer verificando que la suma de los números enteros en el subconjunto S’ sea igual a K .
Subset Sum es NP-Hard:
Para demostrar que Subset Sum es NP-Hard, realice una reducción de un problema NP-Hard conocido a este problema.
Realice una reducción a partir de la cual el problema de cobertura de vértices se reduzca al problema de suma de subconjuntos . Supongamos un gráfico G(V, E) donde V = {1, 2, …, N}. Ahora, para cada vértice i, a i =i . Para cada arista (i, j) definimos un componente llamado b ij .
Representaremos los números enteros en un formato de array, donde cada fila se expresa en la representación de base 4 del valor entero correspondiente de |E|+1 dígitos.
La array tiene las siguientes propiedades:
- La primera columna contiene un valor entero 1 para ai y 0 para bij .
- Cada una de las columnas E que comienzan en el lado derecho de la array representa un dígito para cada borde. La columna (i, j)=1 para a i , a j y b ij , en caso contrario, es igual a 0.
- Definimos una constante k’ tal que,
Ahora bien, se cumplen las siguientes proposiciones:
- Consideremos un subconjunto de vértices y aristas a (V’, E’) respectivamente, tal que
b ij puede contener como máximo 1 en cada columna. Además, el parámetro k’ tiene un 2 en todos los dígitos menos significativos hasta |E|. Nunca podemos tener un equipaje de mano en estos dígitos. Ahora, estos dígitos suman como máximo tres 1 en cada columna. Esto implica que para cada arista (i, j), V’ debe contener i o j. Por lo tanto, V’ se convierte en una cubierta de vértices.
- Supongamos que hay una cubierta de vértice de tamaño k, elegiremos números enteros ai tales que i esté en V’ y todos los b ij tales que i o j estén en V’. Al sumar todos estos enteros en representación de base 4 (que elegimos de la array), obtenemos suma de enteros =k’. Por lo tanto, los enteros elegidos forman el subconjunto de enteros con suma = k’. Por lo tanto, la suma del subconjunto se cumple.
Consideremos el siguiente ejemplo,
Dada una cubierta de vértice V = {1, 3} y k = 2
Ahora, un 1 = 1, un 2 = 2, un 3 = 3, un 4 = 4
La array se puede construir de la siguiente manera:
=>
=>
=>
Ahora, para probar el valor de k’, elijamos a i tal que i esté en V’, elijamos a 1 y a 3 y b ij tal que i o j esté en V’, es decir, elijamos b ij tal que i o j están en V’, es decir, elegimos b 12 , b 14 , b 23 y b 34 de la array . En representación base 4, tenemos los siguientes valores:
a 1 = 321, a 3 = 276, a 12 = 64, a 23 = 16, a 14 = 1, a 34 = 4
Estos valores se calculan utilizando la array. Al sumar estos valores, obtenemos,
k’ = 321 + 276 + 64 + 16 + 1 + 4 = 682.
Por lo tanto, el valor de k’ se puede calcular y verificar.
Problema de suma de subconjuntos
Publicación traducida automáticamente
Artículo escrito por yashchuahan y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA