8 Intratabilidad
8 Intratabilidad
Desde un punto de vista práctico, se suele calificar las soluciones de complejidad exponencial como
"malas" y las soluciones de complejidad polinomial como "buenas". Más aun, se llega a afirmar que
"si no se tiene una solución buena para un problema dado, no se tiene todavía una solución".
Sin embargo, resulta que los problemas para los que no se tienen soluciones "buenas" no son casos
patológicos, ni mucho menos difíciles de encontrar, sino más bien problemas naturales y que se
presentan con relativa frecuencia. Por tal razón es importante conocer ese tipo de problemas, tanto
desde el punto de vista teórico, como sus implicaciones desde el punto de vista práctico.
En este capítulo se pretende establecer un conocimiento formal de problemas típicos para los cuales
no se han logrado encontrar soluciones "buenas", de manera que se tome conciencia de su
dificultad, así como de diferentes maneras de buscar soluciones.
Las precisiones adicionales a las definiciones originales tienen que ver con la forma en que se
plantean los problemas, se expresan sus soluciones, o en que algún modelo de máquina manipula
sus datos. No obstante, aunque el suponerlas se puede pensar que se tiene una visión restringida de
los conceptos involucrados, no parece difícil traducir a sus términos cualquier otra forma concreta
de modelar los problemas a la que aquí se plantea, dentro de condiciones de análisis razonables. Así
mismo, los modelos de máquinas no son esencialmente restringidos al pensar que los datos que se
manipulan son de la forma específica que se desea.
2 Análisis de algoritmos
8.1.1 Problemas
Llamando B = {0,1}, se supondrá que PX = B*, y que r∈B*. Esto quiere decir que toda cadena
finita de 0's y 1's representa una pregunta posible, así como que todas las respuestas se codifican
también con cadenas binarias.
Un algoritmo A soluciona un problema X si, para cualquier p∈PX, si A recibe como entrada p,
produce como resultado un r, tal que 〈p,r〉∈X.
En ocasiones es suficiente contemplar soluciones aproximadas para los problemas. Para esto es
necesario definir una noción de vecindad o aproximación en el espacio de los posibles resultados,
digamos, d: B* x B* → R. Para un ε>0, el algoritmo A ε−soluciona el problema X (i.e., lo soluciona
aproximadamente, con precisión ε) si, para cualquier p∈PX, cuando A recibe como entrada p,
produce como resultado un r', tal que existe un r para el que <p,r>∈X, con d(r,r')≤ε.
1 Con la definición actual, toda pregunta tiene una respuesta, puesto que un problema es una relación total sobre B*.
Sin embargo, es claro que algunas de las preguntas pueden representar planteos absurdos del problema, para los que la
respuesta debe entenderse como una codificación del hecho de que no haya solución adecuada.
I Intratabilidad 3
ocasionalmente, el saber solucionar un problema de decisión puede llevar a saber solucionar ciertos
problemas más generales.
Hay una correspondencia natural entre los lenguajes los problemas de decisión, que queda
establecida en la siguiente definición:
Definición A
i. Para un lenguaje L, el problema de decisión correspondiente es
XL = {〈p,sí〉| p∈L } ∪ {〈p,no〉| p∉L }
[]
Con la presente definición de problema, parece natural definir |p|, el tamaño de una pregunta p,
como el número de símbolos que la conforman. Los modelos de máquinas considerados en 1.4
pueden restringirse, sin pérdida de generalidad, a manipular cadenas binarias.
Estos problemas tienen una característica en común: No se han encontrado aún algoritmos
polinomiales para resolverlos, pero tampoco se ha podido probar que no los haya.
Por poseer esa característica, a dichos problemas se les clasifica como "difíciles" o, utilizando un
término que se introduce un poco más adelante, NP-completos.
Lo anterior no quiere decir que no existan instancias fáciles de esos problemas. Por ejemplo, si a los
datos de CG se añade que G es bipartito, la solución del problema es muy sencilla: si k≥2, G se
puede colorear con k colores. De igual manera sucede con BP, si se sabe que todos los enteros de S
son iguales.
¿Qué es lo difícil de esos problemas? Para responder esta pregunta se puede formular otra: ¿Sería
posible diseñar un algoritmo para resolver uno de esos problemas -por ejemplo, CG- de tal manera
que se pueda expedir una garantía de funcionamiento como: "el programador garantiza que, si un
grafo G de n vértices y un entero positivo k son dados como datos, el programa responderá
correctamente si el grafo G puede ser coloreado con k colores o menos y, además, lo hará en menos
de 3476n25 ms" ?
En realidad, la dificultad del problema está en la imposibilidad de ofrecer una garantía como la
mostrada y no en la obtención de una solución. En otras palabras, es posible dar algoritmos cuya
respuesta al problema sea siempre la correcta, pero que el tiempo usado para darla sea exponencial.
También se pueden dar algoritmos que dan una respuesta aproximada en tiempo polinomial, cuya
confiabilidad no sería total2.
Es importante aclarar que "tiempo polinomial" significa que la complejidad del algoritmo es
O(p(x)), donde x es la medida de los datos del problema y p(x) es un polinomio en x, es decir,
que su grado es constante con respecto a x. Por ejemplo, si para resolver CG se encuentra un
algoritmo de orden O(n346), o O((nk)346), se dirá que CG se resuelve en tiempo polinomial; pero
si el algoritmo es de orden O(nk), no se puede afirmar lo mismo.
La representación de los datos puede influir en la estimación del tamaño de la entrada. Por ejemplo,
para el problema CQ, el grafo G se puede representar con listas de adyacencias, matrices booleanas,
etc. La entrada es una cadena binaria que denota la representación en cuestión. Así, si se elige
representar los grafos con matrices binarias, la descripción de un grafo de n vértices consta, por lo
menos, de n2 bits. Como la entrada de CQ también incluye el número k, y éste se representa en
binario, una pregunta para CQ mide m = O(n2 + log k).
2 Por ejemplo, cuando el algoritmo da una respuesta afirmativa, con seguridad G se puede colorear con k colores, pero
si la respuesta es negativa no se tiene la certeza de que no se pueda colorear.
I Intratabilidad 5
Continuando con CQ, si k>n la respuesta es, trivialmente, no. Es decir, el problema es complicado
sólo si k≤n. En este caso, es claro que m = O(n2). El algoritmo intuitivo sugiere probar cada uno de
los posibles (nk) subconjuntos de k vértices. Cuando k = n2, es fácil ver que hay más de 2n/2
subconjuntos posibles, de modo que debe efectuarse un número de pruebas del orden de 2 m/2. En
otras palabras, la complejidad temporal de este algoritmo es exponencial en el tamaño de la entrada.
Por otra parte, no se conoce un algoritmo que sea esencialmente mejor que el intuitivo, una de las
características que distinguen -por ahora- los problemas NP-completos.
Por ejemplo, si en el planteo de AVo se define m = <max u,v: u,v ciudades: dist(u,v)>,
cualquier tour deberá medir, a lo sumo, nm. Supóngase un algoritmo av(G,dist,d), que decida
AV con el grafo completo G, etiquetado con distancias dist, y la cota d. Entonces, el siguiente
algoritmo resuelve el problema AVo:
funct avo (G,dist):nat
{Pre: m = <max u,v: u,v ciudades: dist(u,v)> }
{Pos: avo = "longitud de un tour mínimo" }
var d: nat
min, max:= 0,nm;
do max-min≥1 → d:= (max + min)/2;
if av(G,dist,d) then max:= d
else min:= d+1
fi
6 Análisis de algoritmos
od;
avo:= d
Este algoritmo efectúa una búsqueda binaria en el rango 0..nm, de manera que tendrá como
complejidad
TAVo(G,dist) ≤ O(〈max d: 0≤d≤nm: Tav(G,dist,d)〉 log nm)
Ahora, la entrada de AVo consta de n2 números, que denotan las distancias entre ciudades, más un
número adicional que denota el tamaño de la cota d. Sea q el tamaño de la codificación binaria de
las n2 distancias. Sea r el tamaño de una entrada para AV. Puesto que d≤nm y m es la distancia más
grande entre ciudades:
r ≤ q + log d ≤ q + log n + log m ≤ 3q
Por otra parte, cuando se sabe resolver problemas de optimización, es usual preguntar,
adicionalmente, cómo se consigue el valor óptimo calculado. Para el caso del agente viajero, se
puede plantear el problema:
(AVb) : Dadas n ciudades en un plano, encontrar un tour (camino cerrado que no repite nodos)
que visite las n ciudades, de longitud mínima.
rof
Es fácil constatar que avb tiene complejidad polinomial, si av también es polinomial. Por lo tanto,
AVb es polinomial si AV también lo es.
En 1.3.3 se habló de clases de complejidad para algoritmos. Estas nociones se pueden extender para
definir clases de complejidad de problemas. Así, para un problema X, cuyo orden de complejidad es
O(f), se dirá que éste es
• Constante : si f = O(1)
• Logarítmica : si f = O(log n)
• Polilogarítmica : si f = O(logk n), para una constante k>0
• Lineal : si f = O(n)
• Polinomial : si existe una constante k>0, tal que f = O(nk)
• Exponencial : si existe una constante k>0, tal que f = O(2nk).
Los calificativos anteriores se pueden anteceder de la frase "por lo menos ", si se remplaza O(…)
por Ω(…) en las definiciones.
Estas nociones dependen, además, del modelo de máquina que se utilice para ejecutar los
algoritmos. Los ejemplos más importantes se refieren a los casos en que el recurso considerado es
el tiempo y, en segundo término, el espacio. El modelo de máquina que se supone es usualmente
determinístico y secuencial (v.gr., MTD, RAM), aunque, precisamente la noción de problema NP se
puede entender también con respecto a máquinas secuenciales no determinísticas (v.gr., MTND).
8.2.1 La clase P
A la clase P pertenecen los problemas de decisión que tienen una solución sobre una MTD, cuyo
tiempo de ejecución es de orden polinomial.
8 Análisis de algoritmos
El problema PL es, históricamente, quizás el más importante de los problemas clasificados como
polinomiales. Durante mucho tiempo se pensó que era un problema no polinomial que,
curiosamente tiene en el algoritmo simplex (el método de solución más utilizado para PL) una
solución exponencial, pero práctica en la mayoría de los casos.
8.2.2 Reducciones
Para mostrar que un problema está en una clase, basta mostrar que hay un algoritmo que satisfaga
lo requerido en la definición de la clase (modelo de máquina, cotas de recursos). En cambio, para
mostrar que un problema no pertenece a una clase, se usan, comúnmente, métodos indirectos. Hay
una técnica fundamental que, curiosamente, sirve tanto para llevar a cabo ambos tipos de prueba: la
reducción.
La idea básica tras de una reducción es el uso de subrutinas. En términos de máquinas de Turing,
las subrutinas corresponden a oráculos que saben responder preguntas específicas. Supóngase que
un problema X se puede resolver en tiempo polinomial en una MTO (máquina de Turing con
oráculo) que usa un oráculo que soluciona un problema Y. Si Y es soluble en una MTD en tiempo
polinomial, entonces X también debe ser soluble en una MTD en tiempo polinomial.
Definición A
Si X, Y son problemas, una (Turing- ) reducción de X a Y es una MTO que resuelve X, usando un
oráculo para Y. En este caso, X es reducible a Y (mediante la reducción).
X
MTD
[]
Se supone que la consulta al oráculo consume recursos O(1), v.gr., en tiempo y en espacio.
Definición B
[]
Las reducciones son herramientas útiles para la clasificación de problemas cuando se agrupan en
clases que también obedecen cotas para los recursos utilizables. Por ejemplo, RP, la clase de las
reducciones polinomiales , son las que obedecen cotas de tiempo polinomiales. En términos de la
definición, la MTO resuelve X en tiempo polinomial, suponiendo que el oráculo es consultado en
O(1). Esto no quiere decir que X sea polinomial, porque para ello se necesita que Y sea solucionable
polinomialmente en una MTD.
Para una clase de reducciones R y dos problemas X, Y, la notación X≤RY se usa para significar que
hay una reducción en R, de X a Y. Por conformar las reducciones polinomiales quizás la clase de
reducciones más importante, se usará la notación X≤Y para significar que X reduce polinomialmente
a Y.
Las siguientes definiciones técnicas son importantes para trabajar con clases de reducciones:
Definición C
10 Análisis de algoritmos
8.2.3 Completitud
Las reducciones pueden servir para probar que un problema Y no pertenece a una clase C. Para esto,
basta mostrar una reducción de una clase de reducciones que sea C-compatible, que muestre a un
problema X, para el que se sabe que X∉C, como reducible a Y. Así, si valiera que Y∈C, la definición
de compatibilidad llevaría a concluir que X∈C, lo que sería contradictorio.
La argumentación anterior se vuelve más importante si se conocen ciertos problemas que actúan
como representantes de las clases, en el siguiente sentido:
Definición A
[]
Un problema R-completo para C es un representante típico de los problemas más difíciles de C. Por
ejemplo, se puede probar que PL es un problema completo para P bajo reducciones que son
calculables usando espacio logarítmico adicional (reducciones log-space ).
Para una clase de problemas y una clase de reducciones dadas, hay una dificultad significativa en
encontrar problemas completos bajo las reducciones. Pero una vez que se encuentra uno, la
demostración de que otros también lo son es más sencilla, si además se tiene que el conjunto de
reducciones es transitivo:
Lema B
Sean C una clase de problemas, R una clase transitiva de reducciones, X un problema R-completo
para C.
X≤RY ∧ Y∈C ⇒ Y es R-completo para C
I Intratabilidad 11
Demostración:
Sea Z∈C. Como X es R-completo para C, entonces X es R-difícil para C, de modo que Z≤RX. Por
transitividad, debe valer que Z≤RY, i.e., Y es R-difícil para C.
[]
8.2.4 La clase NP
A la clase NP pertenecen los problemas de decisión (o bien, los lenguajes reconocibles) que tienen
una solución (o bien, un algoritmo de reconocimiento) sobre una MTND, cuyo tiempo de ejecución
es de orden polinomial.
Una MTND es igual a una MTD, con la posibilidad suplementaria de tomar más de una decisión -
mover una cabeza o escribir algo- a partir de una misma configuración de sus componentes. El
número de selecciones factibles es, no obstante, finito. La decisión se toma de manera no-
determinística, i.e., arbitrariamente. Si una MTND se enfrenta en dos ocasiones a una misma
configuración, la secuencia de operaciones efectuadas puede diferir de una a otra ejecución.
Las MTNDs se utilizan sólo para resolver problemas de decisión, de suerte que la cinta de respuesta
puede limitarse a una celda. Si la cinta de respuesta contiene un "sí", debe entenderse que hay una
forma de calcular la respuesta "adivinando" las decisiones correctas en las selecciones no-
determinísticas. Si la respuesta es "no", significa que no hay ninguna posible computación que
termine en una respuesta positiva.
Una computación de una MTND puede visualizarse como un árbol de ramificación finita, cuyos
nodos son configuraciones o estados de computación y cuyos arcos representan las decisiones
arbitrarias que pueden tomarse en cada configuración. Cuando la computación termina, el árbol es
finito y, sin pérdida de generalidad, se puede suponer que todas las hojas tienen la misma altura.
Como tiempo se considera la altura de este árbol, lo que equivale a estimar el tiempo por el de la
posible ejecución más corta, si la respuesta es afirmativa, o el de la más larga, si la respuesta es
negativa.
Una máquina de Turing de adivinación y verificación (MTAV) es como una máquina de Turing
determinística en cuanto a las cintas y al repertorio de instrucciones que puede ejecutar, pero su
control se divide en dos componentes: una componente de adivinación y una de verificación. Ante
una entrada dada x, la componente de adivinación actúa como una MTO y "adivina" un dato c, que
se denominará un certificado; el par <x,c> sirve de entrada a la componente de verificación, que
actúa como una MTD que resuelve un problema de decisión. Así, la componente de verificación
puede terminar con una respuesta afirmativa, o bien con una respuesta negativa, o, eventualmente,
no parar.
12 Análisis de algoritmos
Una MTAV resuelve un problema X si, para cualquier pregunta x∈PX, <x,sí>∈X si y sólo si existe
un certificado c que, después de ser producido por la componente de adivinación, lleva a que la
componente de verificación se detenga con sí cuando se le da como entrada <x,c>.
Una MTAV resuelve un problema X en tiempo O(f) si, para cada x∈PX, la componente de
verificación tarda O(f(|x|)) en llevar a cabo su ejecución. Nótese que esto impone una cota sobre
el tamaño del certificado, porque el tiempo para examinarlo -junto con la entrada- está acotado. Un
caso especial importante se da cuando la MTAV resuelve un problema en orden polinomial;
entonces el tamaño del certificado para un x está acotado por un polinomio fijo p(|x|).
Lema A
Los lenguajes reconocidos en tiempo polinomial por MTNDs son exactamente los mismos
reconocidos en tiempo polinomial por MTAVs.
Demostración:
Ejercicio.
[]
El lema anterior, junto con la definición A de 8.1.1, permite concluir que los problemas de decisión
solucionables con MTNDs en tiempo polinomial también lo son con MTAV en tiempo polinomial.
Es decir, los problemas de la clase NP son exactamente los mismos que se pueden resolver con
MTAVs en tiempo polinomial.
AV: Dadas n ciudades en un plano y un número natural d, decidir si existe un tour (camino cerrado
que no repite nodos) que visite las n ciudades, cuya longitud sea menor o igual a d. Las
distancias se miden en números enteros.
El certificado es un tour para el que se debe verificar si tiene longitud menor o igual a d.
CG: Dados un grafo G(V,E) y un entero positivo k, decidir si G es k-coloreable, i.e, si se puede
colorear con k o menos colores.
El certificado es una asignación c:V → {1,2,_,k}, para la que se debe verificar si es una
coloración (i.e., cada color corresponde a un número en {1,2,…,k}; no debe haber vértices
vecinos del mismo color).
CQ: Dado un grafo G, con n vértices, y un número natural k, decidir si existe un subgrafo completo
de G, con k vértices.
El certificado es un conjunto de k vértices, para el que se debe verificar que corresponde a un
grafo completo.
BP: Dados un conjunto finito S de enteros positivos, un entero k (capacidad de una caja) y un
entero n (número de cajas), decidir si se pueden empacar los enteros de S en a lo sumo n cajas,
cada una de capacidad k, de manera que la suma de los enteros empacados en cada caja no
sobrepase la capacidad de la misma.
El certificado es una partición de los enteros de S en, a lo sumo n conjuntos. Se debe verificar
si cada conjunto suma menos de k.
El siguiente problema reviste especial importancia dentro de los problemas NP. Antes de enunciarlo,
conviene introducir algo de terminología:
Dado un conjunto de n símbolos sentenciales (i.e., símbolos que representan proposiciones lógicas)
{u1, …,un}, el conjunto de los literales que se pueden construir a partir de ellos es L = {u1, ¬u1, …,
un, ¬un}. Una cláusula es un subconjunto de L, y su interpretación en lógica corresponde a la
disyunción de sus elementos. Un conjunto de cláusulas se interpreta como la conjunción de las
cláusulas que lo componen. Un conjunto de cláusulas es satisfacible si existe una valuación o
asignación de verdad para los símbolos sentenciales que hace que la fórmula lógica correspondiente
sea verdadera.
El certificado es una asignación de verdad para los símbolos sentenciales. La verificación es,
trivialmente, polinomial. Así, SAT∈NP
8.2.4.3 NP-completitud
Un problema NP-completo es un problema difícil por excelencia, dentro de los de su clase, puesto
que todos los demás se pueden refrasear en él, de manera polinomial. Así, los problemas en NP se
pueden resolver polinomialmente -en forma determinística- si y sólo si existe un algoritmo
polinomial -determinístico- para resolver algún problema NP-completo.
El siguiente resultado es quizás la herramienta más importante para mostrar que un problema es
NP-completo:
Lema A
[]
Naturalmente, para poder utilizar este lema, es necesario contar con algún problema NP-completo.
El Teorema de Cook (cf. 8.1.3) proporciona como resultado un problema NP-completo, con lo cual
se cuenta con una piedra angular para el desarrollo posterior de la teoría.
Trivialmente, P ⊆ NP, porque las MTD son casos especiales de MTND. Por el momento es un
problema abierto el determinar si NP ⊆ P, aunque la evidencia experimental parece indicar que esto
es improbable.
De hecho, el mejor resultado general que se tiene, para comparar las dos clases de problemas es el
siguiente:
Teorema A
Si X∈NP, entonces existe un polinomio p tal, que X puede ser resuelto determinísticamente en
tiempo O(2p(n)).
Demostración:
Sea M una MTAV que resuelve X en, a lo sumo, tiempo polinomial q(n). Para una entrada x, con
|x|=n, que tenga como resultado sí, debe existir un certificado c, con |c|≤q(n). De este modo, la
componente de verificación puede llegar a la respuesta, para la entrada <x,c>, utilizando no más de
q(n) pasos. El número de posibles certificados es, a lo sumo, 2q(n). Una MTD que efectúe la
I Intratabilidad 15
verificación para cada uno de los posibles certificados, consumirá, en el peor caso -ensayar todos
los certificados- q(n)2q(n) pasos. Para un polinomio apropiado p, es claro que q(n)2q(n) =
O(2p(n)).
[]
Si el teorema anterior es lo mejor que se puede esperar, los problemas NP-completos son
exponenciales, cuando se tratan en máquinas determinísticas.
En 1971, S.A. Cook mostró que SAT es NP-completo. Este fue el primer resultado que proporcionó
un problema NP-completo y fue de gran utilidad, mediante el Lema 8.2.4.3.A, para encontrar
muchos otros problemas NP-completos.
SAT es NP-completo
Demostración (esbozo):
Ya se vio que SAT está en NP. Para probar que SAT es NP-difícil, la demostración debe ser a bajo
nivel, es decir, apoyarse directamente en las definiciones de máquinas de Turing y mostrar las
reducciones polinomiales correspondientes.
Sea L un lenguaje reconocible por una MTAV ML, en tiempo polinomial p(n). Así, la componente
de adivinación de ML produce un certificado c(x) para cada pregunta x, con |x|=n, y la componente
de verificación decide determinísticamente la pregunta <x,c(x)> en tiempo inferior o igual a p(n).
Se pretende asociar, a cada x∈B*, un conjunto de cláusulas f(x), que se construya en tiempo
polinomial, tal que f(x) sea satisfacible si y sólo si x∈L. Como fórmula de la lógica, f(x) describe
el funcionamiento de la máquina ML, v.gr., "en cada momento de la computación, ML está en
exactamente un estado", "en cada momento de la computación, hay exactamente un carácter del
alfabeto en la cabeza lectora", etc. En especial, una de las afirmaciones contenidas en f(x) es: "en
la etapa p(|x|), ML se encuentra en un estado de aceptación".
Así, si se logra probar que f(x) es satisfacible, querrá decir que x∈L, y que hay una manera de
mostrarlo en tiempo p(|x|). La afirmación recíproca es, así mismo, verdadera.
Una vez que se dispone de un problema NP-completo, el Lema 8.2.4.3.A es la herramienta más útil
para encontrar otros problemas NP-completos. Ya en 1971, Cook mostró el siguiente resultado:
16 Análisis de algoritmos
Teorema B
3-SAT es NP-completo
Demostración:
i. 3-SAT es una variante de SAT. Como éste está en NP, también lo está 3-SAT.
una cláusula de n literales, n>3. Considérese la siguiente fórmula, cuyas cláusulas tienen, a lo
sumo, tres literales:
α = (x1 ∨ ¬y1) ∧ (y1 ∨ x2 ∨ ¬y2)
∧ (y2 ∨ x3 ∨ ¬y3)
…
∧ (yn-1 ∨ xn ∨ ¬yn) ∧ yn
Defínase la valuación
â: {x1, …, xn, y1, …, yn} → B
de la siguiente forma:
â(xi) = a(xi) , para 1≤i≤n
â(yi) = 0 , para i≤1<i0
â(yi) = 1 , para i0≤i≤n.
En otras palabras, cada una de las cláusulas de longitud n>3 de una fórmula pueden refrasearse
en una fórmula en forma clausal, cuyas cláusulas tiene, a lo sumo, tres literales. La
transformación es, evidentemente, polinomial.
[]
4 Obsérvese que la definición incluye la posibilidad de que i0 sea ∞, si es el caso que el rango de la minimización
indicada sea vacío.
I Intratabilidad 17
El anterior teorema sorprende, porque a priori se podría creer que las preguntas para 3-SAT son
esencialmente más sencillas que las de SAT. En realidad, el resultado afirma que no se gana mucho
en restringirse a usar sólo cláusulas con, a lo sumo, tres literales. El ejemplo en cuestión ilustra el
hecho de que la situación es más complicada de lo que en principio se pudiera pensar: no es difícil
mostrar que 1-SAT y 2-SAT están en P.
El resultado puede utilizarse ahora, para encontrar otros problemas NP-completos. En general, entre
más problemas NP-completos se conozcan, se tendrán más posibilidades para reducir los candidatos
a NP-completitud a un problema NP-completo.
Teorema C
CQ es NP-completo
Demostración:
i. CQ es NP.
Los nodos de G son los literales de α. Entre dos de estos literales hay un arco si y sólo si
pertenecen a diferentes cláusulas y no corresponden a la misma variable con signos diferentes.
Por ejemplo, para
α = (x1 ∨ x2 ∨ ¬x3) ∧ (¬x2 ∨ x3) ∧ (¬x1 ∨ x2)
11 12 13
21 22 23
31 32 33
En el ejemplo, puesto que α tiene tres cláusulas, debe buscarse un triángulo en el grafo. Por
ejemplo, los nodos correspondientes a <1,2>, <2,2> y <3,1> conforman un triángulo. Si a los
literales correspondientes se les hace corresponder 1 como valor de verdad, la fórmula toda es
satisfecha por una asignación que, al menos, afirme esto. Es decir:
x2 = 1, x3 = 1, ¬x1 = 1 (x1 = 0).
[]
Como los teoremas B y C, se puede continuar mostrando más y más resultados. Hay catálogos de
problemas NP-completos, organizados por temas (grafos, lógica, aritmética, pasatiempos, etc.) y
técnicas más o menos estándar para mostrar estos resultados [Gar79]. Una pequeña muestra de
algunos resultados conocidos (.→. : "es reducible a"):
SAT
PE 3-SAT
CQ
RV
CHD
CHnD
AV
PE (Programación entera) : Dados una matriz C y un vector d cuyos elementos son números
enteros. Decidir si hay un vector b, de 0's y 1's, para el que Cb ≤ d.
CHD (Camino Hamiltoniano dirigido) : Dado un grafo dirigido G, decidir si hay un camino cerrado
que pase por todos lo vértices exactamente una vez.
CHnD (Camino Hamiltoniano no dirigido) : Dado un grafo no dirigido G, decidir si hay un camino
cerrado que pase por todos lo vértices exactamente una vez.
I Intratabilidad 19
EJERCICIOS
xi ⇒ … ⇒ ¬xi ⇒ … ⇒ xi.
3 Pruebe que los lenguajes reconocidos en tiempo polinomial por MTNDs son los mismos
reconocidos en tiempo polinomial por MTAVs.
4 Pruebe que:
a CHD ≤ CHnD
b CHnD ≤ AV
5 a Pruebe que PT ≤ KS
b Se ha dado una solución de KS con programación dinámica, de complejidad O(nB).
Por qué no es ésta una prueba de que P = NP ?