Está en la página 1de 64

TRABAJO FIN DE GRADO

Título

El problema del viajante. Métodos de resolución y un


enfoque hacia la Teoría de la Computación

Autor/es

Salvador Peñalva García

Director/es

Francisco Javier Pérez Lázaro

Facultad

Facultad de Ciencias, Estudios Agroalimentarios e Informática


Titulación

Grado en Matemáticas

Departamento

Curso Académico

2014-2015
El problema del viajante. Métodos de resolución y un enfoque hacia la Teoría
de la Computación, trabajo fin de grado
de Salvador Peñalva García, dirigido por Francisco Javier Pérez Lázaro (publicado por la
Universidad de La Rioja), se difunde bajo una Licencia
Creative Commons Reconocimiento-NoComercial-SinObraDerivada 3.0 Unported.
Permisos que vayan más allá de lo cubierto por esta licencia pueden solicitarse a los
titulares del copyright.

© El autor
© Universidad de La Rioja, Servicio de Publicaciones, 2015
publicaciones.unirioja.es
E-mail: publicaciones@unirioja.es
Facultad de Ciencias, Estudios Agroalimentarios e Informática

TRABAJO FIN DE GRADO


Grado en Matemáticas

El Problema del Viajante:


Métodos de resolución y un enfoque hacia la Teoría de la
Computación.

Alumno:

Salvador Peñalva García

Tutores:

Francisco Javier Pérez Lázaro

Logroño, Julio,2015
Agradecimientos

En primer lugar quiero mostrar mi agradecimiento al apoyo incondicional de mi familia, en


especial a mis padres, hermano y abuela pues siempre he sabido que puedo contar con ellos ante
cualquier circunstancia. Quiero también agradecer el enorme esfuerzo y de dedicación que mi
tutor Fco. Javier Pérez Lázaro ha brindado a este trabajo y su paciencia infinita y por último
me gustarı́a agradecer el apoyo de mis amigos y compañeros que nunca han dudado en echarme
una mano cuando lo necesitaba.
i

Resumen
En este trabajo nos dedicaremos al estudio del problema del viajante de comercio (TSP
por sus siglas en inglés). Este problema trata de determinar el camino que un comerciante que
quiere visitar n ciudades debe seguir para que la distancia recorrida sea mı́nima, sabiendo que
tiene que empezar y terminar en la misma ciudad.
Tras hacer un breve recorrido histórico sobre este problema y presentar dos formulaciones
matemáticas del mismo, vamos a mostrar dos métodos de resolución exactos: uno basado en
los métodos de ramificación y acotación y el otro en los planos de cortes. Este último método
desarrollado por Dantzig, Fulkerson y Johnson en 1954, supuso un salto en la historia del
problema del viajante pues fue el primero capaz de resolver un ejemplo con un número alto
de ciudades y además fue precursor del método general de los planos de corte desarrollado
por Gomory para los problemas de programación lineal entera. Posteriormente mostramos tres
heurı́sticas, entre las que se encuentra la de Christofides, para obtener soluciones cercanas al
resultado óptimo de manera eficiente.
En el último capı́tulo, hacemos un enfoque del problema del viajante en la teorı́a de la
complejidad. Para ello usamos máquinas de Turing para describir los conjuntos de problemas
de decisión P y NP y demostramos el teorema de Cook quien probó que el problema de satis-
fabilidad es NP -Completo. Con este resultado seremos capaces de ver que el problema de los
ciclos hamiltonianos es también NP -Completo, hecho imprescindible para poder concluir que
el problema del viajante es NP -duro, es decir, que todo problema en NP se transforma en un
tiempo polinómico en el problema del viajante.

Abstract
In this work, we study the Travelling Salesman Problem (TSP ). The aim of this problem, is
to find the tour that a salesman, who wants to visit n cities, should follow in order to minimize
the total distance and return to the starting point.
After showing the development of this problem throughout history and explaining two dif-
ferent formulations for the TSP, we will show two exact resolution methods: the first one is
based on Branch and Bound method and the other uses cutting planes. The latter, developed
by Dantzig, Fulkerson and Johnson in 1945, represented a big breakthrough for the problem
because it succeeded in solving an example with a large number of cities. It was also a reference
to Gomory to introduce his cutting plane method to solve linear integer problems. Later, we
show three heuristic methods, among which is Christofides heuristic. These algorithms expect
to obtain close results to the optimum solution in a short period of time.
In the last chapter, we can see the TSP from the complexity theory perspective. We use
Turing Machines to describe decision problem groups P and NP and we prove Cook’s Theorem
which supports that Satisfiability Problem is NP -Complete. This will lead to the fact that
Hamiltonian circuit problem is also NP -Complete and will be essential to show that Travelling
Salesman Problem is NP -Hard, i.e., each NP problem transforms in polynomial time into the
TSP.
ii
Índice general

1. Introducción 1
1.1. El problema del viajante en la historia . . . . . . . . . . . . . . . . . . . . . . . . 1
1.2. Aplicaciones del TSP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

2. TSP: modelo y métodos de resolución 9


2.1. Definición y modelo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.2. Ejemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.2.1. Otras variantes del VRP . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.3. Métodos de resolución de programación entera . . . . . . . . . . . . . . . . . . . 13

3. Métodos de resolución exactos 15


3.1. Método de ramificación y acotación . . . . . . . . . . . . . . . . . . . . . . . . . . 15
3.2. Método de los planos de corte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20

4. Heurı́sticas para el TSP 29


4.1. Algoritmo codicioso o del vecino más próximo . . . . . . . . . . . . . . . . . . . . 29
4.2. Algoritmo del Árbol de expansión mı́nimo . . . . . . . . . . . . . . . . . . . . . . 29
4.3. Algoritmo de Christofides . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32

5. TSP es NP-Duro 35
5.1. Máquinas de Turing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
5.1.1. Descripción de una máquina de Turing . . . . . . . . . . . . . . . . . . . . 37
5.2. Clases P y NP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
5.2.1. Transformaciones polinómicas y Completitud NP . . . . . . . . . . . . . . 41
5.3. El teorema de Cook . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
5.3.1. 3-Satisfactibilidad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
5.4. NP -Duro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52

iii
iv ÍNDICE GENERAL
Capı́tulo 1

Introducción: Los problemas de


rutas y el TSP

1.1. El problema del viajante en la historia


Este trabajo trata sobre el estudio del problema del viajante de comercio, en el que un
comerciante quiere visitar n ciudades empezando y terminando en la misma ciudad y debe
determinar el recorrido a seguir para que la distancia total recorrida sea mı́nima. Este tipo de
problema se engloba dentro de los denominados problemas de rutas.
Un problema de rutas es todo aquel problema de optimización donde se debe encontrar
una ruta óptima para satisfacer las demandas de un conjunto de clientes. La relevancia que
tiene el estudio de estos problemas es, en gran medida, debido a la gran utilidad que tienen en
situaciones reales, principalmente en la logı́stica y distribución de mercancı́as. En España por
ejemplo, el sector del transporte supuso entre los años 2005 y 2009 un 4, 2 % del Valor Añadido
Bruto nacional y continuó su crecimiento situándose en el año 2011 en torno al 4, 8 % [3]. Es
por esto que una distribución eficiente de las mercancı́as, influye en prácticamente cualquier
actividad económica. A esto debemos añadir que en los últimos años el transporte por carretera
ha superado con una enorme ventaja a cualquier otro tipo de transporte; concretamente, según
un informe de la CEOE [3], en el año 2009 el 57 % del VAB del sector transporte correspondió al
transporte terrestre, y en el año 2012 se contabilizaron en España 205.738 empresas en este
sector. Por lo tanto, una aplicación correcta de los problemas de rutas puede suponer una
mejora económica en las cuentas de cualquiera de estas empresas, y por lo tanto, también tiene
un impacto positivo en cualquier otro negocio que necesite del transporte de mercancı́as.
Existen muchos problemas de rutas en función de las restricciones adicionales que impon-
gamos (número de comerciantes, capacidad de los vehı́culos...) y hay que diferenciarlos de los
problemas de buscar el camino óptimo, ya que en los de rutas, establecemos un conjunto de ar-
cos o nodos que debemos visitar, y cuando buscamos el camino óptimo, sólo tratamos de llegar a
un destino desde un origen de la forma más eficiente, sin importar los nodos y arcos intermedios.

Dentro de los problemas de rutas, hay dos variantes: los problemas de rutas sobre nodos,
y los problemas de rutas sobre arcos. En el primer caso, la ruta óptima debe visitar todos los
nodos establecidos y en el segundo caso, se deben recorrer todos los arcos del grafo determinado
por el problema. Podemos ver una clasificación de los problemas de rutas en la Figura 1.1.

1
2 CAPÍTULO 1. INTRODUCCIÓN
4 Capı́tulo 1: Problemas de rutas

Restricciones
Demanda Nombre habitual del problema Otras restricciones
de capacidad
Viajante de Comercio
NO
TSP
Nodos
Problema de rutas de vehículos
SÍ Recogida/distribución
VRP

Una componente conexa


Ventanas de tiempo
(Problema del Cartero Chino CPP)
NO
Varias componentes conexas
Arcos Otras
(Problema del Cartero rural RPP)

Problema de rutas con capacidades



CARP

Cuadro 1.1: Clasificación Problemas de Ruta


Figura 1.1: Clasificación de los Problemas de Rutas
Como se puede observar en el cuadro, existen dos grandes tipos de problemas
Los problemas de rutas
de rutas según sobre arcos
los clientes tienen susobre
se encuentren origenlosennodos
el siglo XV III,
o sobre cuando
los arcos. En los
el habitan-
tes de Köningsberg debatieron si existı́a alguna ruta que cruzara una y sólo una vez cada uno
primero de los casos, la ruta óptima a determinar debe visitar todos los nodos,
de los siete puentes de la Figura 1.2 y volviera otra vez al punto de origen. Euler demostró pos-
teriormentemientras que,no
que esto enera
el segundo,
posible. se deben recorrer todos los arcos del grafo que define
el problema. En otras palabras, en los problemas sobre los nodos se entiende que
cada cliente está representado por un nodo mientras que en los problemas sobre
los arcos se entiende que los arcos son calles que deben ser visitadas.

Los problemas de rutas sobre nodos tienen su origen en el siglo XIX cuando
el irlandés W.R. Hamilton y el británico T. Kirkman inventaron el denominado
“Icosian Game”. Este juego consistı́a en encontrar una ruta entre los 20 puntos del
juego usando sólo los caminos permitidos y regresando al nodo origen (una imagen
del juego original comercializado años más tarde puede encontrarse en la Figura
1.1). Obviamente, este juego no se centraba en la búsqueda del camino óptimo,
sino en la búsqueda deFigura
un camino
1.2: que visitase
Puentes de todos los nodos una única vez (años
Köningsberg
más tarde, este tipo de caminos o ciclos recibirı́an el nombre de Hamiltonianos
en honor
El problema a W.R.seHamilton).
anterior refiere a la búsqueda de caminos pero no a la ruta más óptima. En
ese sentido, el
La historia de los dos del
llamado Problema Cartero
grandes Chino de
problemas (CP P, Chinese
rutas Postman
sobre nodos Problem) busca
(el problema
un camino de distancia mı́nima que recorra todos los arcos de un grafo al menos una vez. Un
del viajante de comercio y los problemas de rutas de vehı́culos) está ı́ntimamente
método de resolución del CP P consiste en añadir arcos de coste mı́nimo hasta conseguir un
relacionada.
grafo euleriano 1 De problema
. Otro hecho, históricamente
de arcos es se el ha entendido
llamado el VRPdel
Problema como una gene-
Cartero Rural (RP P,
ralización
Rural Postman del TSP,encomo
Problem), se se
el que verá más un
busca adelante.
caminoEstos dos problemas
de mı́nima distanciaserán
que los
recorra sólo
alguno detemas
los arcos del grafo.
centrales de este primer capı́tulo del trabajo, por lo que información más
detallada sobre su historia, tipos y métodos de resolución puede encontrarse en
Aunque los problemas de rutas por arcos son sin duda un campo muy amplio e interesante,
sucesivas secciones.
en este trabajo nos vamos a centrar en los problemas de rutas por nodos, en particular en el
problema del viajante de comercio (TSP, Travelling Salesman Problem). Como veremos más
adelante, el TSP se entiende históricamente como un caso particular del problema de rutas de
1 Los grafos eulerianos, cuyo nombre se debe al matemático Leonhard Euler, son grafos que contienen ciclos

eulerianos, es decir que contienen al menos un ciclo que pasa por todas las aristas una sola vez.
1.1. EL PROBLEMA DEL VIAJANTE EN LA HISTORIA 3

vehı́culos (V RP , Vehicle Routing Problem), en el que se trata de averiguar las rutas óptimas
de una flota de transporte para dar servicio a unos clientes.
Vamos a ver una definición del problema del viajante (T SP ):
Un viajante quiere visitar n ciudades, pasando una y sólo una vez por cada una
de ellas, empezando por una ciudad origen en la que terminará el recorrido. Su-
pongamos que conoce la distancia entre cada par de ciudades. ¿Cuál es el recorrido
que debe seguir, para que la distancia total que recorra sea mı́nima?

Para explicar este problema, vamos a necesitar una serie de conceptos básicos que mostra-
remos a continuación.
Definición 1.1.1. Un grafo, es un par G = (V, A) donde V es un conjunto finito de elementos
llamados vértices y A es un conjunto de pares de vértices al los que llamaremos aristas o arcos.
Un ciclo, es una sucesión de vértices u1 , u2 , . . . , up ∈ V tales que u1 , u2 , . . . , up−1 son distin-
tos, up = u1 y (ui , ui+1 ) ∈ A. Si el ciclo contiene a todos los vértices de V , entonces se llama
ciclo hamiltoniano2 .
En realidad, el TSP se puede representar como un grafo con pesos en sus aristas y su reso-
lución se centra en encontrar un ciclo hamiltoniano de mı́nimo peso, entendiendo por peso a la
suma de los pesos de cada una de las aristas que pertenecen al ciclo.

Previo al análisis de Hamilton, eminencias en el campo de las matemáticas como Euler y


Vandermonde estudiaron casos concretos de búsqueda de ciclos de este estilo en grafos, aunque
fue el reverendo T.P. Kirkman junto con el propio Hamilton el primero en considerar ciclos
hamiltonianos como tal, cuando inventaron el juego Icosean (Figura 1.3), en el que trataron de
encontrar una ruta entre los 20 puntos del juego usando sólo una serie de caminos y regresando
al nodo original.

Figura 1.3: Juego Icosean

El primer impreso que menciona al problema del viajante es del año 1832, y se titula: “El
viajante de comercio: cómo debe ser y qué debe hacer para conseguir comisiones y triunfar
en el negocio. Por un viajante de comercio veterano” [21]. Impreso en Alemania, trata de la
importancia de elegir un camino óptimo en una ruta de negocios aunque no menciona ningún
modelo matemático. Por otro lado, no se sabe a ciencia cierta quien fue el precursor del nombre
Travelling Salesman Problem (TSP), aunque en una entrevista que le hicieron a Merril Flood
(1984) [8], afirmó haberlo escuchado de A. W. Tucker, quien supuestamente lo habı́a oı́do
anteriormente de la boca de Hassler Whitney, de la Universidad de Princeton en el año 1931.
Fue durante esta época de los años 30, cuando se comenzó a trabajar propiamente sobre el
problema del viajante. Merril Flood, de la universidad de Harvard, quien se interesó en este
2 En honor al matemático irlandés Sir William Rowan Hamilton.
4 CAPÍTULO 1. INTRODUCCIÓN

problema cuando le propusieron encontrar la ruta óptima que debı́a seguir un autobús escolar,
tuvo un papel muy importante en la tarea de divulgación de este problema. Al mismo tiempo,
en Viena, Karl Menger enunció lo que se conocı́a como el problema del mensajero, que trataba
de encontrar el camino más corto que uniera un conjunto de puntos. Fue el propio Menguer [20]
quien intuyó, seguramente sin ser totalmente consciente, una importante propiedad del TSP :
este problema es NP-Duro, como demostraremos en un capı́tulo posterior. Además propuso lo
que más tarde llamarı́an el algoritmo del vecino más próximo.

Sin duda alguna fue entre los años 50 y 60 cuando este problema ganó la mayor popula-
ridad entre los cı́rculos cientı́ficos, dando lugar a cantidad de trabajos, debido en gran parte
a su estrecha relación con los dos problemas de optimización combinatoria conocidos hasta el
momento: el problema de asignación y el del transporte.

El problema de asignación, trata de asignar n puestos de trabajo a n trabajadores. Cada uno


tiene una puntuación en el desempeño de cada uno de los puestos y el objetivo es maximizar la
suma de los desempeños. El problema del transporte, trata de repartir m recursos a n clientes de
manera óptima, y es un caso más general del problema de asignación. Para el año 1947, Dantzig
habı́a desarrollado ya el método del simplex para resolver los problemas de programación lineal,
y hacia 1953, existı́an adaptaciones del mismo para casos especiales del problema de transporte
y del de asignación (en 1955, Harold Kuhn desarrollo el método húngaro para resolver problemas
de asignación [15] basándose en los trabajos de D.König y J.Egerváry).

Durante estos años, destacamos el estudio realizado por Danztig, Fulkerson y Johnson,
quienes publicaron en el año 1954 en la revista Journal of the Operation Research Society
of America, el artı́culo “Soluciones de un problema del viajante de gran tamaño”[6]. En él,
calificaron el TSP como un problema de programación lineal entera y además resolvieron una
instancia del problema del viajante de 49 ciudades (una por cada estado de Estados Unidos),
lo que supuso un gran avance, pues consiguieron resolver un problema con un número alto de
ciudades y además utilizaron un nuevo e innovador método que utilizaba las recientes técnicas
de programación lineal, junto con la idea de que si encontraban un tour cercano al óptimo,
era cuestión de añadir un número no muy grande de restricciones adicionales a este tour para
conseguir llegar al óptimo.

Este método que se conoce como método de los planos de cortes evolucionarı́a posteriormente
hasta el método de Gomory [11] y posteriormente darı́a lugar al actual método de ramificación
y acotación, que es uno de las formas más utilizadas de resolver problemas de programación
lineal entera. El método de ramificación y acotación resuelve el problema mediante un método
de programación lineal y cuando una de las variables de la solución obtenida x no es entera,
se subdivide el problema en dos subproblemas en las que se añade en cada uno una nueva
restricción en la que esa variable toma el valor entero más cercano a x menor que x y mayor
que x, respectivamente.

Tras este artı́culo de Dantzig et al. [6], fueron apareciendo nuevos algoritmos aplicables cada
vez a un número mayor de ciudades, como el de M.Held y R.Karp [13], basado en programación
dinámica y de orden n2 2n y ya partir de los años 80, utilizaron variantes de los métodos de
planos de cortes y ramificación y acotación para encontrar soluciones exactas para instancias
con hasta 2392 ciudades. En la Figura 1.4 , podemos observar la evolución de este problema
desde 1954 hasta la década de los 90 y en la Figura 1.5 una gráfica que muestra la evolución
del TSP en la historia.
riormente).

En lı́nea con el artı́culo de Dantzig et al., muchos autores comenzaron a desa-


rrollar otros algoritmos que fuesen aplicables a problemas con un número cada
vez más grande de ciudades. Gracias a esto y al gran desarrollo de la informática
en las últimas décadas, ha habido grandes avances en la resolución de los TSP.
En el CuadroDEL
1.2. APLICACIONES 1.2 pueden
TSP observarse los problemas más destacables que fueron 5
resueltos desde 1954 hasta 1990.

1954 G. Dantzig, R. Fulkerson, S. Johnson 49 ciudades


1971 M. Held, R.M. Karp 57 ciudades
1971 M. Held, R.M. Karp 64 ciudades
1975 P.M. Camerini, L. Fratta, F. Maffioli 67 ciudades
10 1975 P. Miliotis 80Problemas
Capı́tulo 1: ciudades de rutas
1977 M. Grötschel 120 ciudades
1980 H. Crowder and M. W. Padberg 318 ciudades

En 1990 se comenzó a desarrollar un programa informático532


1987 M. Padberg and G. Rinaldi ciudades
llamado Concorde
1987 M. Grötschel and O. Holland 666 ciudades
consistente en más de 130000 lı́neas de código en C que ha permitido resolver
1987 M. Padberg and G. Rinaldi 1002 ciudades
problemas de hasta 85900 ciudades
1987 en el
M. Padberg andaño 2006. Matemáticos
G. Rinaldi 2392yciudades
otros profesio-
nales trabajan cada dı́a en la mejora de este programa compuesto por las mejores
técnicas disponiblesCuadro
hasta 1.2:
el momento.
Hitos en la Enresolución
la Figuradel1.3TSP
se puede observar la
progresiónFigura 1.4: Evolución
en el número de ciudadesdelhasta
TSPelaañolo largo
2006. de la historia

100.000
90.000
80.000
70.000
60.000
50.000
40.000
30.000
20.000
10.000
-

Figura 1.3: Progresos en la historia del TSP


Figura 1.5: Evolución del TSP a lo largo de la historia

Aplicaciones
En la década de los 90, W. Cook junto con otros compañeros desarrollaron el programa
informático llamado Concorde
La mayor parte de(www.math.uwaterloo.ca/tsp/concorde.html), conmo-
las mejoras en TSP durante los primeros años estaban el que en 2006
consiguierontivadas por aplicaciones directas del mismo. Entre otros, Flood [21] trabajó sobre la solución
resolver una instancia de 85900 ciudades. En la Figura 1.6, podemos ver
óptima a una instancia del TSP de 532 vértices, en la que se han utilizado 302 cortes.
rutas de autobuses escolares y Morton y Land [43] aplicaron el TSP a la plani-
ficación de rutas de una empresa de lavanderı́a. Hasta el dı́a de hoy, el TSP se
1.2. Aplicaciones
ha aplicado sobre una del TSPde problemas que van desde rutas de vende-
gran variedad
dores hasta la genética. A continuación, se comentan brevemente algunas de las
La mayor parte de los avances en la historia del TSP han sido motivadas por aplicaciones
aplicaciones más importantes del problema del viajante:
del mismo en casos cotidianos. Hoy en dı́a, hay multitud de campos en los que el problema del
viajante de comercio juega un papel importante a la hora de tomar decisiones de eficiencia. A
Logı́stica.-
continuación veremos variosLas aplicaciones
ejemplos más directas y más abundantes del TSP se
de ello:
centran en el campo de la logı́stica. El flujo de personas, mercancı́as y
Logı́stica: vehı́culos
las aplicaciones
en tornomás directas
a una serie dedeciudades
este problema
o clientessesecentran en el campo de la
adapta perfecta-
logı́stica. La elección de un recorrido eficiente a la hora de transportar mercancı́as, pasa-
mente a la filosofı́a del TSP, como ya demostraron los primeros estudiosos
jeros y vehı́culos en torno a una serie de ciudades puede suponer un ahorro significativo de
del problema.
recursos. Varios ejemplos Entre
en loslasque
múltiples aplicaciones
se utiliza logı́sticas
la resolución del problema
de este problema del
son: selección
de rutas deviajante, destacamos:
vendedores o turistas para determinar un camino con el que poder visitar los
6 CAPÍTULO 1. INTRODUCCIÓN

Figura 1.6: Grafo y recorrido óptimo de una instancia con 532 ciudades usando Concorde

lugares que deseen y volver al punto de origen, planificación de rutas escolares o reparto
de correo (aunque se ajuste más a un problema de rutas sobre arcos, existen casos como
cuando las casas están alejadas, en los que el TSP puede ser útil).

Industria: Aunque no es tan común su uso en este campo como en la logı́stica, la aplicación
del TSP ha reducido significativamente costes en determinados ámbitos relacionados con
la industria:

• Secuenciación de tareas: supongamos que una máquina tiene que realizar una serie
de tareas en el mı́nimo tiempo posible sin que el orden de las mismas sea importante.
Si tij , es el tiempo que cuesta preparar a la máquina para realizar la tarea j cuando
acaba de terminar la tarea i, podemos aplicar el TSP estableciendo como nodos cada
una de las tareas.
• Producción de circuitos electrónicos: El TSP se utiliza para buscar el orden óptimo
en que perforar las placas que albergarán estos circuitos (se supone cada nodo del
problema, una posición donde se debe perforar y como costes la distancia entre
cada una de estas posiciones. La ciudad de origen será el lugar donde se mantiene
la perforadora mientras se cambian las placas). Esta aplicación del problema del
viajante, lleva años siendo estudiada (Lin y Kernighan en 1973 ya trataron este
tema [18]) y según estudios de IBM y Siemens permiten mejoras de hasta el 10 %
en rendimiento. Al mismo tiempo, también se trata como instancia del problema de
viajante de comercio el orden en los que posteriormente se conectarán microchips
entre si en dispositivos digitales, tratando siempre de minimizar la cantidad de cable.

Además de estas aplicaciones más comunes, usos del TSP abarcan multitud de materias diver-
sas, como por ejemplo: consumo de combustibles en el espacio para alcanzar cuerpos celestes,
conexiones entre aeropuertos, conexiones entre cadenas de ADN, o incluso la programación de
1.2. APLICACIONES DEL TSP 7

los robots en los almacenes de Amazon que se encargan de distribuir los paquetes que ordenan
los clientes (www.academia.edu/2471485/), etc.
Tras esta introducción histórica del problema, podemos dividir el trabajo en dos grandes
apartados:

En el Capı́tulo 2, nos centramos en dar dos formulaciones matemáticas del problema para
posteriormente, en el Capı́tulo 3 explicar dos métodos exactos, uno basado en ramificación y
acotación y otro basado en planos de corte. Ambos son variantes de los conocidos métodos de
programación entera aplicadas al caso del viajante de comercio. La elección de estos métodos
se debe a su estrecha relación con el desarrollo histórico del problema y con el avance de los
métodos de resolución de problemas generales de programación lineal entera. Además en el si-
guiente capı́tulo mostramos diferentes heurı́sticas utilizadas para encontrar de manera eficiente
soluciones aproximadas del problema del viajante.

La segunda parte de la memoria que se corresponde al Capı́tulo 5 está desarrollado para


introducir al lector en la Teorı́a de la Computación y definir mediante máquinas de Turing
los dos grandes grupos de problemas en los que podemos clasificar algunos problemas de deci-
sión en función de su complejidad: P (Determinı́sticos Polinómicos) y NP (No Determinı́sticos
Polinómicos).
En este mismo capı́tulo demostramos también varios resultados, entre ellos el teorema de
Cook, el cual nos permite establecer una equivalencia entre muchos problemas de decisión que
llamaremos NP -Completos. Diremos que un problema P es NP -completo, si cualquier problema
de NP puede transformarse en P mediante un proceso de complejidad a lo sumo polinómica.
Por tanto, si encontráramos un método de complejidad polinómica para resolver P, podrı́amos
resolver todos los problemas de NP de forma polinómica realizando esta transformación.

Todas estas nociones, están completamente enfocadas en demostrar que el problema del
viajante de comercio, del que no se conoce ningún algoritmo de resolución que se ejecute en
tiempo polinómico, es un problema de optimización que pertenece a un grupo de problemas
denominado NP -Duro.
8 CAPÍTULO 1. INTRODUCCIÓN
Capı́tulo 2

TSP: modelo y métodos de


resolución

2.1. Definición y modelo


Una vez hemos profundizado en la historia del problema del viajero, continuamos nuestro
trabajo, mostrando dos de las formulaciones del TSP más comunes:
Sea G = (V, A) un grafo completo. Los vértices i = 2, . . . , n se corresponden con las ciudades
a visitar y el vértice 1, con la ciudad de origen y destino. A cada arco (i, j), se le asocia un
valor no negativo cij , que representa el coste de viajar del nodo i al j. Si G es un grafo dirigido,
la matriz de costes C es asimétrica, sin embargo si cij = cji para todo (i, j) ∈ A entonces la
matriz de costes será simétrica, y el problema recibirá el nombre de TSP simétrico (ST SP ).
En este caso, el conjunto A se sustituye por el conjunto E de arcos no dirigidos i, j con i < j.
Vamos a definir un conjunto de variables de decisión xij ∈ {0, 1} para cada (i, j) ∈ A, tal
que xij = 1 si el arco (i, j) forma parte de la solución, xij = 0 en caso contrario.
Encontramos ya entonces la función objetivo:
X
mı́n cij xij ,
i6=j

sujeto a las siguientes condiciones:


X
xij = 1 ∀i ∈ V,
j∈δ − (i)

X
xij = 1 ∀i ∈ V,
j∈δ + (i)

donde
δ − (i) = {a = (j, i) ∈ A},
δ + (i) = {a = (i, j) ∈ A}.
La primera restricción nos dice, que a cada vértice, sólo puede llegar un arco y la segunda
determina que de cada vértice, sólo puede salir un arco. Estas restricciones, son necesarias pero
no suficientes, pues podrı́a dar lugar a subcircuitos dentro del grafo, como vemos en la Figura
2.1.

9
10 CAPÍTULO 2. TSP: MODELO Y MÉTODOS DE RESOLUCIÓN

Figura 2.1: Ejemplo de subcircuitos en TSP

En este caso, las variables son x12 = x23 = x34 = x45 = x56 = x67 = 1, luego se cumplen
las restricciones arriba mencionadas, es decir, a cada vértice sólo entran y salen como mucho
un arco, pero sin embargo no es un camino válido para el TSP.
Necesitamos por lo tanto añadir alguna restricción más al problema. En el ejemplo anterior,
vemos que para el subconjunto {1, 2, 3}, hay tres arcos que unen los nodos entre sı́. Si limitamos
el número de arcos a dos en todos estos subconjuntos, entonces evitarı́amos subcircuitos dentro
del grafo. Para modelizar estas situaciones, es necesario definir un nuevo conjunto:

∀W ( V, A(W ) = {a = (i, j) ∈ A|i, j ∈ W }.


Ası́, las restricciones de ruptura de subcircuito son las siguientes:
X
xij ≤ |W | − 1 ∀W ⊆ V, 2 ≤ |W | ≤ n/2,
(i,j)∈A(W )

equivalente a X
xij ≥ 1 ∀W ⊆ V, 2 ≤ |W | ≤ n/2.
i∈W,j ∈W
/

Estas restricciones indican, que para cada subconjunto de vértices, al menos uno de los arcos
llega a un nodo que no se encuentra en ese subconjunto.
Otra forma de evitar los subcircuitos, es añadiendo un conjunto nuevo de variables enteras.
Para definirlas, vamos a considerar un tour s1 = 1, s2 , . . . , sn . Sea ti para cada i = 1, . . . , n el
momento del tour en el que la ciudad i es visitada, es decir, para t1 = 1, ts2 = 2, . . . , tsn = n.
Podemos pensar entonces cada tj como la inversa de sj , en el que tj = ti + 1 si xij = 1.
De esta idea observamos que todo tj cumple:
(
ti + 1 − n si xij = 0,
tj ≥
ti + 1 si xij = 1.

Esta restricción, puede ser escrita como:

tj ≥ ti + 1 − n(1 − xij ), i ≥ 2, j ≥ 2, i 6= j. (2.1)

Estas restricciones se derivan de condiciones, que un camino que sea solución debe cumplir.
Veamos ahora, que no sólo se cumple esto, sino que si existen subcircuitos, entonces estas
restricciones no se cumplen.
Suponemos que tenemos un camino que consiste de al menos dos subcircuitos y comprobemos
que no se cumple las restricciones (2.1). Consideremos un subcircuito que no contiene a la ciudad
1, sea r el número de etapas en este subcircuito (r ≥ 2). Ahora, sumamos todas las restricciones
2.1. DEFINICIÓN Y MODELO 11

de la forma (2.1) que incluyen arcos de este subcircuito. En el lado izquierdo obtenemos la suma
de las tj del circuito, y en el lado derecho, obtenemos la suma de ti + 1 tales que (i, j) sea arista
del subcircuito, como es un ciclo de r arcos, obtendremos la misma suma de vértices tj más r
y simplificando obtenemos:

0≥r
que es absurdo. Luego si se cumplen las restricciones de (2.1) no puede haber subcircuitos1 .
Veamos cuantas restricciones son necesarias en total para modelar el TSP en los dos modelos
dados: con el primer modelo, necesitamos al menos 2n−1 − n − 1 como ruptura de subcircuitos
y 2n para las primeras restricciones de llegada y salida, luego en total 2n−1 + n − 1 y en total
habrá n(n − 1) variables binarias (hemos quitado las variables xii ). En el segundo modelo,
podemos encontrar n2 variables (las n(n − 1) de antes junto con las n variables adicionales) y
2n + (n − 1)(n − 2) restricciones en total.
Existen casos en los que una de las formulaciones sea más recomendable que la otra, no
obstante, la formulación de ruptura de subcircuitos, suele predominar sobre el modelo con las
nuevas variables ti .

Veamos ahora el caso del ST SP . La función objetivo a minimizar es:


X
mı́n cij xij ,
i≤j

con las restricciones: X


xij = 2 ∀i ∈ V,
j∈δ(i)
X
xij ≤ |W | − 1 W ⊆ V, 3 ≤ |W | ≤ n/2,
(i,j)∈E(W )

donde
xij ∈ {0, 1} ∀(i, j) ∈ E,
siendo
δ(i) = {e ∈ E|e = (i, j) ó e = (j, i))},
E(W ) = {(i, j) ∈ E|i, j ∈ W },
δ(S) = {e = (i, j) ∈ E|(i ∈ S, j ∈
/ S) ó (i ∈
/ S, j ∈ S)}.
Como en el caso asimétrico, la segunda restricción puede sustituirse por:
X
xij ≥ 2.
(i,j)∈δ(W )

1 Si hacemos esto en el ejemplo de la Figura 2.1, con el subcircuito {4, 5, 6}, entonces la desigualdad obtenida

serı́a la suma de las tres restricciones



t5 ≥ t4 + 1
 arco 4-5
t6 ≥ t5 + 1 arco 5-6

t4 ≥ t5 + 1 arco 6-4

es decir, nos quedarı́a


t5 + t6 + t4 ≥ t4 + t5 + t6 + 3 ⇒ 0 ≥ 3#
.
12 CAPÍTULO 2. TSP: MODELO Y MÉTODOS DE RESOLUCIÓN

2.2. Ejemplo
Sea un conjunto de 5 ciudades, cuyas distancias entre ellas vienen descritas en la tabla de
la Figura 2.2. Vamos a dar el modelo a resolver para obtener un tour óptimo del T SP .

Desde/Hasta Alicante Barcelona Madrid Sojuela Teruel


Alicante 522 424,6 682 332
Barcelona 594,4 628,7 492 377
Madrid 424,1 628,7 319 302
Sojuela 680 491 321 355
Teruel 319 376 305 356

Figura 2.2: Distancias entre las ciudades

Vamos a representar cada ciudad con la inicial de su nombre. Ası́ por ejemplo, xAB repre-
senta a la arista entre Alicante y Barcelona. Notar que xij tomara el valor 1, si esta arista
pertenece al tour óptimo, 0 en otro caso.

Ası́ la función a minimizar es:

mı́n Z = 522xAB +424, 6xAM +682xAS +332xAT +594, 4xBA +628, 7xBM +492xBS +377xBT +

+424, 1xM A +682, 2xM B +319xM S +302xM T +680xSA +491xSB +321xSM +355xST +319xT A +

+376xT B + 305xT M + 356xT S

y está sujeta a las siguientes restricciones que dividiremos en tres grupos: restricciones de
llegada, restricciones de salida y ruptura de subcircuitos.
Restricciones de llegada:



 xBA + xM A + xSA + xT A = 1
xAB + xM B + xSB + xT B = 1



xAM + xBM + xSM + xT M = 1

xAS + xBS + xM S + xT S = 1





x + x + x
AT BT M T + xST = 1

Restricciones de salida:



 xAB + xAM + xAS + xAT = 1
xBA + xBM + xBS + xBT = 1



xM A + xM B + xM S + xM T = 1

xSA + xSB + xSM + xST = 1





x + x + x
TA TB T M + xT S = 1

Restricciones de ruptura de subcircuitos: en un caso general, tendrı́amos que escribir


tantas restricciones de rupturas de subcircuitos como posibles subconjuntos de vértices existan.
En este ejemplo, como sólo hay 5 ciudades, nos vale con escribir sólo rupturas de subcircuitos de
tamaño 2, pues si cogemos un tour que incluya todos los vértices, la única forma de encontrarse
2.3. MÉTODOS DE RESOLUCIÓN DE PROGRAMACIÓN ENTERA 13

subcircuitos es obtener uno con dos vértices y otro de tres vértices. Por ello obtenemos sólo 10
ecuaciones (4 + 3 + 2 + 1 = 10):

xAB + xBA ≤1 xBS + xSB ≤1


xAM + xM A ≤1 xBT + xT B ≤1
xAS + xSA ≤1 xM S + xSM ≤1
xAT + xT A ≤1 xM T + xT M ≤1
xBM + xM B ≤1 xST + xT S ≤1

2.2.1. Otras variantes del VRP


En el T SP , suponemos que hay un único vehı́culo con capacidad suficiente para visitar una
vez a cada cliente. Añadiendo otras condiciones, podemos extender el T SP a otros problemas
de rutas como los que nombraremos a continuación:
Problema de rutas de vehı́culos con capacidades idénticas (CVRP, Capacitated Vehicle
Routing Problem): encontramos varios vehı́culos con la misma capacidad que parten de
un nodo central (almacén). A cada uno, se le asigna una ruta de manera que en ningún
momento, la carga de cada vehı́culo exceda su capacidad y que la distancia recorrida por
todos los vehı́culos sea mı́nima.
Problema con recogidas (VRPB, Vehicle Routing Problem with Backhauls): Los vehı́culos
no sólo se van vaciando a lo largo del recorrido, sino que pueden existir clientes, para los
que tengamos que hacer recogidas. En este caso, aparecen también nuevos problemas de
llenado/vaciado del vehı́culo.
Problemas de vehı́culos con ventanas horarias (VRPTW, Vehicle Routing Problem with
Time Windows): cada cliente tiene asociado una ventana horaria en la que puede ser
visitado. Aparecen enormes problemas de cálculos y de factibilidad de rutas.
Problemas con múltiples almacenes (VRPMD, Vehicle Routing Problem with Multiple
Depots): En este caso hay varios almacenes y cada ruta puede partir y terminar en un
almacén.
Todas estas variantes del problema del viajante pueden formularse añadiendo restricciones
y variables nuevas al modelo original del TSP. Explicarlas en este trabajo supondrı́a invertir
mucho espacio, recurso del que no disponemos.

2.3. Métodos de resolución de programación entera


Aunque hemos visto que el problema del viajante responde a un modelo de programación
entera, las técnicas generales para encontrar soluciones exactas (como ramificación y acotación
o los planos de corte) son en general muy poco eficientes si no se les añaden ideas concretas
para resolver cada problema. Sin duda, una de las maneras más eficientes y utilizadas para
problemas binarios, como es el TSP, son los métodos de enumeración implı́cita, como el método
aditivo de Balas. Sin embargo, la complejidad del TSP y el gran abanico de posibles soluciones
factibles y de caminos que tenemos que analizar y descartar para llegar a una solución óptima,
hace que casos simples del problema del viajante como el ejemplo que hemos modelado antes,
sean poco eficientes de resolver mediante los métodos de enumeración implı́cita.
En consecuencia, la búsqueda de soluciones del T SP se limita a tres estrategias: intentar
buscar casos particulares del problema que sı́ permitan utilizar algoritmos polinómicos [12, §11],
14 CAPÍTULO 2. TSP: MODELO Y MÉTODOS DE RESOLUCIÓN

utilizar algoritmos especı́ficos para los casos generales que nos proporcionen soluciones exactas
(basados en ramificación y acotación, planos de cortes, programación dinámica, etc.) o centrarse
en la búsqueda de soluciones rápidas y aceptar la posibilidad de que pueda no ser la óptima
(métodos heurı́sticos).
En los dos capı́tulos siguientes, analizaremos varios de los métodos de resolución exactos
para el T P S ası́ como varias heurı́sticas.
Capı́tulo 3

Métodos de resolución exactos

A lo largo de la historia, se han ido desarrollando muchos métodos exactos y variantes de


los mismos capaces de dar soluciones exactas a instancias grandes del T SP en relativamente
poco tiempo. Muchas de ellas están basadas como veremos a continuación en los métodos de
ramificación y acotación o en los de planos de corte que son métodos de programación lineal
entera.
Otro de los grandes avances que en este trabajo no desarrollaremos, fue el desarrollo por
Held y Karp [13] de un método basado en la programación dinámica la cual habı́a sido definida
años antes por Bellman [1]. La idea de este método radica en que en un circuito óptimo, tras
haber recorrido un conjunto de ciudades, el recorrido que queda entre el resto de ciudades debe
ser también óptimo.
A continuación mostraremos dos métodos concretos para resolver instancias del problema
del viajante.

3.1. Método de ramificación y acotación


La mayor parte de los problemas de programación lineal entera, se resuelven mediante el
método de ramificación y acotación (Branch and Bound en inglés) ya que para muchos pro-
blemas de optimización es la manera más eficiente conocida para encontrar soluciones óptimas
exactas. Esta técnica permite simular la enumeración de todas las posibles soluciones, sin tener
que considerarlas una a una. El método general de ramificación y acotación fue propuesto por
Land and Doig en el año 1960 [16] y aplicado por primera vez en el T SP por Little, Murty,
Sweeney, y Karel en 1963 [17].
Como bien indica su nombre, para aplicar este método sobre un problema de optimización
(pensaremos en uno de minimización sin pérdida de generalidad), tendremos que realizar dos
pasos:

Ramificar (Branch): Cada conjunto de soluciones del problema, puede ser subdividido en
al menos dos subconjuntos no vacı́os.

Acotar(Brand ): tras cada ramificación, iremos obteniendo cotas inferiores del coste de
cada solución que pertenezca a cualquiera de sus ramas.

El método de ramificación y acotación siempre encuentra una solución óptima, pero la efi-
ciencia y la dificultad de implementación del método depende mucho del problema que estemos
tratando y también depende del proceso de elección del siguiente subproblema que debemos

15
16 CAPÍTULO 3. MÉTODOS DE RESOLUCIÓN EXACTOS

ramificar cuando tenemos varias posibilidades (muchas veces es necesaria una buena heurı́sti-
ca para realizar este proceso). En el caso peor, tendrı́amos que enumerar todas las posibles
soluciones.
Definición 3.1.1. Sea PE un problema de programación lineal entero, se llama relajación
de PE, al mismo problema cuando omitimos las restricciones de que sus variables deben ser
enteras.
Siempre se cumple que el valor óptimo para la relajación de un problema de maximización
(minimización), es mayor (menor) al valor óptimo para el problema entero correspondiente.
Observar que si tenemos un problema PE entero y de la solución de su relajación se obtiene
un resultado con todas las variables enteras, entonces esta solución también lo será de PE.
En el caso particular del TSP, este método ha sido aplicado con diferentes criterios de ramifi-
cación. A continuación explicaré uno de ellos. El problema raı́z comienza con el modelo relajado
del T SP , refiriéndonos con este nombre al modelo completo pero sin incluir las restricciones de
ruptura de subcircuito:
X
mı́n cij xij .
i6=j

sujeto a las siguientes condiciones:


X
xij = 1 ∀i ∈ V,
j∈δ − (i)
X
xij = 1 ∀i ∈ V,
j∈δ + (i)

donde
δ − (i) = {a = (j, i) ∈ A},
δ + (i) = {a = (i, j) ∈ A},
con xij ∈ {0, 1}.

Este problema en realidad lo podemos interpretar como un problema de asignación con


matriz los pesos de cada uno de los arcos. Se puede resolver por tanto con un método de
resolución de problemas de asignación como es el conocido y sencillo método Húngaro. Podemos
encontrar una explicación del mismo en el libro de Winston [22, p. 395-397].
Una vez resolvemos este problema relajado, la solución puede tener subcircuitos. En el caso
de no encontrar ningún subcircuito, esta será la solución óptima. En otro caso, tendremos que
ramificar el problema en diferentes subproblemas de mayor coste para eliminar los subcircuitos
y encontrar una solución óptima. Para ello, se elige un subcircuito de k arcos de la solución que
tengamos y se definen k ramas, cada una con las restricciones del problema anterior más la que
asigna a cada una de las variables asociadas a los k arcos el valor 0. Por ejemplo, si obtenemos
el subcircuito x12 = x21 = 1, dividiremos el problema en dos ramas, una con x12 = 0 y la otra
con x21 = 0.
Cada una de estas ramas definirá otro problema de asignación que resolveremos de la misma
manera que antes. Notar, que una vez hemos ramificado en varios subproblemas, si en ninguno
de ellos hemos llegado a la solución factible tenemos que decidir por cuál de ellos vamos a seguir
ramificando. El criterio que seguiremos consiste en ramificar siempre el subproblema cuyo coste
total sea menor de entre todas las posibles continuaciones (no tiene por qué ser un subproblema
de la última rama que hemos ramificado).
3.1. MÉTODO DE RAMIFICACIÓN Y ACOTACIÓN 17

Cada vez que en alguna ramificación obtengamos un circuito completo, esa rama ya no debe
volver a ser ramificada pues será una solución factible. Además si en alguna de las ramas que
tenemos se obtiene una solución con un coste superior al de la solución factible con menor coste
encontrada hasta el momento, dicha rama no se ramificará tampoco, pues cualquier otra rama
derivada tendrá un coste superior y no podremos llegar a una solución óptima por ese camino.
Notar que tendremos que resolver cada uno de los subproblemas que aun tengamos en las
ramas sin ramificar hasta llegar a una solución con coste mayor que alguna de las soluciones
factibles encontradas anteriormente, o bien a una solución factible de coste menor o igual que
ésta. Veamos un ejemplo de como resolver un pequeño problema del viajante mediante el método
de ramificación y acotación.
Ejemplo 3.1.1. Sea una instancia del TSP formada por 7 ciudades, cuyas distancias entre
ellas xij vienen determinadas por la Figura 3.1:

Desde/Hasta C. 1 C. 2 C. 3 C. 4 C. 5 C. 6 C. 7
Ciudad 1 3 93 13 33 9 57
Ciudad 2 4 77 42 21 16 34
Ciudad 3 45 17 36 16 28 25
Ciudad 4 39 90 80 56 7 91
Ciudad 5 28 46 88 33 25 57
Ciudad 6 3 88 18 46 92 7
Ciudad 7 44 26 33 27 84 39

Figura 3.1: Subproblema 1

Vamos a resolver el problema de asignación correspondiente utilizando el método Húngaro.


Aunque podrı́amos resolverlo a mano sin mucha complicación, hemos decidido resolverlo con el
programa WINQSB para no desviarnos en la explicación. Introduciendo la matriz del problema
obtenemos la solución:
x12 = x21 , x35 = x54 = x46 = x67 = x73 = 1, Z = 103.
Como podemos observar, este recorrido contiene dos subcircuitos:
{1 − 2 − 1} y {3 − 5 − 4 − 6 − 7 − 3}.
representados en la Figura 3.2:

Figura 3.2: subcircuitos primer subproblema


18 CAPÍTULO 3. MÉTODOS DE RESOLUCIÓN EXACTOS

Por simplicidad, hemos decidido romper el subcircuito {1 − 2 − 1} en dos subproblemas:


Subproblema 2: restricciones del Subproblema 1 junto con x21 = 0.
Subproblema 3: restricciones del Subproblema 1 junto con x12 = 0.
Resolveremos primero el Subproblema 2 y dejaremos el Subproblema 3 para más tarde. Para
ello vamos a resolver el mismo problema de asignación, pero pondremos que la distancia del
recorrido de la Ciudad 2 a la Ciudad 1 es ∞ (o un número muy grande M ) para que el método
de asignación nunca escoja x21 .
El subproblema 2 quedarı́a por tanto como en la Figura 3.3:

De/Hasta C. 1 C. 2 C. 3 C. 4 C. 5 C. 6 C. 7
Ciudad 1 3 93 13 33 9 57
Ciudad 2 M 77 42 21 16 34
Ciudad 3 45 17 36 16 28 25
Ciudad 4 39 90 80 56 7 91
Ciudad 5 28 46 88 33 25 57
Ciudad 6 3 88 18 46 92 7
Ciudad 7 44 26 33 27 84 39

Figura 3.3: Subproblema 2

Al resolverlo, obtenemos la siguiente solución:


x12 = x25 = x54 = x46 = x61 = 1, x37 = x73 = 1, Z = 125.
De la misma manera resolvemos el problema 3, y continuaremos ramificando (si es necesario)
por el subproblema cuyo coste sea menor. Realizando de igual manera el cambio en la matriz
de costes que en paso anterior obtenemos:

x14 = x46 = x67 = x73 = x35 = x52 = x21 = 1, Z = 126.


Hemos obtenido una solución factible, pues no contiene subcircuitos, pero puede no ser la
óptima, ya que el subproblema 2, tenı́a un coste inferior que Z = 126, luego tenemos que seguir
ramificando este subproblema, o bien hasta llegar a una solución factible de coste menor o igual
que 126, o bien hasta que obtengamos ramas con coste mayor que este valor.
Seguimos por lo tanto ramificando el subproblema 2 cuya solución tiene dos subcircuitos:
{1 − 2 − 5 − 4 − 6 − 1} y {3 − 7 − 3}.
De nuevo decidimos romper es subcircuito corto, {3 − 7 − 3}, y nos vuelven a quedar otros dos
subproblemas:
Subproblema 4: restricciones del subproblema 2 junto con x37 = 0.
Subproblema 5: restricciones del subproblema 2 junto con x73 = 0.
Resolvemos ahora el subproblema 4, poniendo en la matriz de costos del subproblema dos,
la entrada c37 = M con M un número muy grande. La solución de este nuevo poblema
de asignación es:
x14 = x46 = x67 = x73 = x32 = x25 = x51 = 1, Z = 126.
3.1. MÉTODO DE RAMIFICACIÓN Y ACOTACIÓN 19

Esta solución, no tiene subcircuitos, luego es una solución factible y además tiene el mismo
valor objetivo que la solución factible que habı́amos encotrado anteriormente. Pero todavı́a
no podemos afirmar que Z = 126 sea el valor óptimo pues aún nos queda abierta la rama
del subproblema 5.

Solucionamos mediante el Software el problema de asignación del subproblema 5, obte-


niendo la solución:

x12 = x25 = x51 = 1, x37 = x74 = x46 = x63 , Z = 129.

Como el coste total de este caso es mayor que 126, ninguna solución continuación de este
subproblema podrá ser óptima.

Como podemos observar en la Figura 3.4, si ramificamos más cualquiera de las hojas exis-
tentes, el coste total será mayor que Z = 126, coste de una solución factible. Concluimos
por tanto, que ambos recorridos obtenidos en el subproblema 5 y en el subproblema 3, son
soluciones óptimas del TSP propuesto.

Figura 3.4: Árbol completo tras ramificación y acotación

En este ejemplo, hemos visto un algoritmo muy concreto para el problema del viajante
basado en el método de ramificación y acotación. Sin embargo, existen multitud de métodos
distintos e incluso más eficientes que, como éste, nos proporcionan una solución exacta del TSP
y cuya base también es el de ramificación y acotación. Por ejemplo, podemos encontrar uno en
la tesis de L. Stockdale [19, p. 39–54] o también en el libro de Korte y Vygen [14, p. 384–386].
20 CAPÍTULO 3. MÉTODOS DE RESOLUCIÓN EXACTOS

3.2. Método de los planos de corte

Durante los años 1958 y 1963, Gomory, desarrolló su método de los planos de corte para
resolver problemas enteros de carácter general, sin embargo, no fue el primero. Gomory [11] se
basó en la forma en la que Dantzig, Fulkerson y Johnson resolvieron una instancia especial del
TSP en el año 1954 [6].
Debemos destacar, que el algoritmo desarrollado por Gomory no se ejecuta en tiempo po-
linómico, es por eso que su forma original no es muy practica a la hora de afrontar problemas
de optimización complejos aunque en la práctica, la idea de los planos de corte se utiliza muy
frecuentemente de forma satisfactoria para resolver problemas concretos. En Winston [22, p.
545–548], podemos encontrar una descripción del algoritmo de Gomory original.

Definición 3.2.1. Un plano de corte es una restricción lineal válida en un problema de optimi-
zación, que se añade al modelo relajado del mismo, eliminando la solución óptima del problema
relajado, pero sin eliminar ninguna solución factible del problema original.

La idea de los planos de cortes para resolver un problema, es resolver un problema relajado
mediante una técnica de programación lineal (método del Simplex) e ir añadiendo planos de
corte hasta conseguir la solución del problema relajado que pertenezca a la región de factibilidad
S del problema original.
En el caso concreto del TSP, S es el conjunto de todos los circuitos que unen las n ciudades
y cada ruta, es un vector de dimensión n(n − 1) en el que cada componente, toma el valor 1 si
el arco correspondiente pertenece al circuito, 0 en caso contrario.
Igual que en el caso de ramificación y acotación, el problema relajado aquı́ serı́a el modelo
completo pero sin incluir las rupturas de subcircuitos. A continuación, nos encargamos de los
subcircuitos. Si ponemos las restricciones de ruptura de subtours en el problema original, nos
encontrarı́amos ante un coste computacional altı́simo e innecesario, por eso Dantzig, Fulkerson y
Johnson en su artı́culo [6], introdujeron la idea de ir añadiendo las rupturas de subcircuitos según
se vaya necesitando, es decir, cuando encontremos algún subcircuito lo romperemos añadiendo la
restricción de ruptura de ese subcircuito concreto tal y como hemos explicado en la formulación
del modelo en el Capı́tulo 2.
Modificaciones de estos algoritmos se han utilizado para resolver instancias del TSP con
más de 10000 ciudades. Por supuesto, muchas ideas sofisticadas que no describiremos son nece-
sarias para obtener una implementación eficiente, en particular buenas heurı́sticas para detectar
desigualdades violadas.

A continuación, veremos un ejemplo de resolución de un problema del viajante, usando el


método que Dantzig, Johnson y Fulkerson desarrollaron. En realidad no utilizan el método del
simplex directamente, sino que se basan en una modificación del mismo para resolver proble-
mas de transporte. Para entender su desarrollo, aunque no es imprescincible, es aconsejable
tener algunos conocimientos básicos programación lineal, en concreto bases, costes marginales
y algoritmo de transporte[22, §4.5 y §7.3].

Ejemplo 3.2.1. Mediante este método, vamos a resolver un ejercicio simétrico de 7 ciudades
cuyas distancias entre sı́ (dij ) vienen determinadas en la siguiente tabla.
3.2. MÉTODO DE LOS PLANOS DE CORTE 21

De/Hasta C. 1 C. 2 C. 3 C. 4 C. 5 C. 6 C. 7
Ciudad 1 68 57 65 144 137 110
Ciudad 2 68 50 70 95 116 131
Ciudad 3 57 50 30 88 80 85
Ciudad 4 65 70 30 105 72 57
Ciudad 5 144 95 88 105 80 130
Ciudad 6 137 116 80 72 80 68
Ciudad 7 110 131 85 57 130 68

Nuestro objetivo en un principio es solucionar el problema relajado (sin subcircuitos) que con-
siste en minimizar la función: X
D(x) = dij xij ,
i<j
sujeto a X
xij = 2, ∀i = 1, . . . , 7.
j6=i
Para ello, vamos a elegir un tour completo y sin subcircuitos al azar desde el que vamos a
partir para intentar llegar al óptimo. Trivialmente hemos elegido el tour 1−2−3−4−5−6−7−1.
Es decir, la primera solución básica del problema es la dada por:
x12 = x23 = x34 = x45 = x56 = x67 = x71 = 1.
El resto de valores de xij toman el valor 0.
Ahora, a cada vértice le vamos a asociar una variable πi que deberemos determinar. Obser-
var, que para cualquier πi se cumple:
X 7
X X  X 7
X
D(x) = dij xij − πi xij − 2 = xij (dij − πi − πj ) + 2 πi .
i<j i=1 j6=i i≤j i=1

Por simplificar, llamaremos δij = dij − πi − πj . En términos de programación lineal, corres-


ponden a los costes marginales.
El siguiente paso es determinar los valores de πi , para que los valores de δij correspondientes
a las variables básicas sean 0, es decir, para las variables básicas: δij = dij − πi − πj = 0, luego
dij = πi + πj . En el siguiente gráfico podemos ver gráficamente la primera solución básica y el
sistema de ecuaciones a resolver:
22 CAPÍTULO 3. MÉTODOS DE RESOLUCIÓN EXACTOS

Tenemos que resolver un sistema de 7 ecuaciones con 7 incógnitas. Una forma sencilla de
resolverlo, es empezando por la ecuación 68 = π1 + π2 ir sumando y restando alternativamente
el resto de ecuaciones para calcular π1 , con lo que obtenemos:

2π1 = 68 − 50 + 30 − 105 + 80 − 68 + 110 = 65 → π1 = 32,5.

π2 = 35,5, π3 = 14,5, π4 = 15,5, π5 = 89,5, π6 = 9,5, π7 = 77,5.

Ahora que ya tenemos los valores de πi , podemos calcular el resto de δij representados en
la tabla que está a continuación. Observar, que la ecuación a minimizar D(x) sólo puede ser
inferior a la actual, si introducimos a la solución básica con valor 1 una de las aristas que tenga
asociado un valor de δij ≤ 0.

dij 1 2 3 4 5 6 7 πi δij 1 2 3 4 5 6 7
1 68 57 65 144 137 110 32,5 1 0 + + + + 0
2 50 70 95 116 131 35,5 2 0 + -30 + +
3 30 88 80 85 14,5 3 0 -16 + -7
4 105 72 57 15,5 4 0 + -36
5 80 130 89,5 5 0 -37
6 88 -9,5 6 0
7 77,5 7
πi 32,5 35,5 14,5 15,5 89,5 -9,5 77,5

El valor más negativo es el asociado a la variable x57 . Entonces tenemos que introducir
x57 = θ en la base, con θ ≥ 0. Como sólo puede haber 7 aristas con valor 1, si introducimos
θ = 1 tenemos que restablecer el flujo como si de un problema de transporte se tratara, lo que
nos crea dos ciclos de orden 2: 1 − 2 − 1 y 3 − 4 − 3 y otro de orden 3: 5 − 6 − 7 − 5 como vemos
en las siguiente figuras:

Vamos a romper un subcircuito, hemos elegido al azar romper el de la arista x34 . Para ello,
añadimos la restricción x34 ≤ 1, o lo que es equivalente, x34 + y8 = 1, y8 ≥ 0. Al añadir una
restricción nueva, tenemos que introducir nueva variable a la base y nos conviene introducir x34
por lo visto anteriormente. Como si θ = 1 encontramos subcircuitos, entonces la nueva variable
de la base será x34 = θ = 0 y obtenemos el diagrama de flujos siguiente:
3.2. MÉTODO DE LOS PLANOS DE CORTE 23

Ahora D(x) lo podemos escribir como:


X 7
X X  X 7
X
D(x) = dij xij − πi xij − 2 − π8 (x34 − y8 − 1) = δij xij + 2 πi + π8 − π8 y8 ,
i<j i=1 j6=i i<j i=1

donde
δ34 = d34 − π3 − π4 − π8 , δij = dij − πi − πj para el resto de i, j con i < j.
En la figura próxima podemos ver la segunda solución básica y las ecuaciones al poner δij = 0
para las variables básicas:

Realizando el mismo procedimiento que en el anterior sistema con los vértices 5 − 6 − 7,


obtenemos 2π7 = 68 − 80 + 130. Los valores de πi que obtenemos, son entonces:
π1 = 51, π2 = 17, π3 = 33, π4 = 34, π5 = 71, π6 = 9, π7 = 59, π8 = −37.
Las nuevas variables δij son entonces las de la tabla:

dij 1 2 3 4 5 6 7 πi δij 1 2 3 4 5 6 7
1 68 57 65 144 137 110 51 1 0 -27 −20 + + 0
2 50 70 95 116 131 17 2 0 + + + +
3 30 88 80 85 33 3 0 −16 + -7
4 105 72 57 34 4 0 + -36
5 80 130 71 5 0 0
6 88 9 6 0
7 59 7
πi 51 17 33 34 71 9 59
24 CAPÍTULO 3. MÉTODOS DE RESOLUCIÓN EXACTOS

Como podemos ver, el valor más negativo corresponde a la variable x47 , luego metemos esta
variable a la base con valor x47 = θ. Como la variable tendrı́a que entrar con valor 1, si θ = 1
debemos restablecer los flujos y obtenemos el diagrama y los subcircuitos de la imagen que está a
continuación:

Debemos por tanto romper el subcircuito, añadiendo la restricción x56 ≤ 1 o lo que es


equivalente x56 + y9 = 1, y9 ≥ 0. y la nueva solución básica será la anterior junto con x47 = 0.
Obtenemos entonces una nueva expresión de D(x) con nuevas πi y δij :
X 7
X X 
D(x) = dij xij − πi xij − 2 − π8 (x34 − y8 − 1) − π9 (x56 + y9 − 1),
i<j i=1 j6=i

X 7
X
D(x) = δij xij + 2 πi + π8 + π9 − π8 y8 − π9 y9 ,
i<j i=1

donde
δ34 = d34 −π3 −π4 −π8 , δ56 = d56 −π5 −π6 −π9 , δij = dij −πi −πj para el resto de i, j con i < j.
En la siguiente figura podemos ver el nuevo diagrama de flujos al añadir x47 = 0 y las ecuaciones
que quedan al tomar δij = 0 en las variables pertenecientes a la solución básica.

Los nuevos valores de πi son:


π1 = 69, π2 = −1, π3 = 51, π4 = 16, π5 = 89, π6 = 27, π7 = 41, π8 = −37, π9 = −36.
Calculamos de nuevo los valores de δij representados en esta tabla:
3.2. MÉTODO DE LOS PLANOS DE CORTE 25

dij 1 2 3 4 5 6 7 πi δij 1 2 3 4 5 6 7
1 68 57 65 144 137 110 69 1 0 -63 −20 −19 + 0
2 50 70 95 116 131 -1 2 0 + + + +
3 30 88 80 85 51 3 0 −52 + -7
4 105 72 57 16 4 0 + 0
5 80 130 89 5 0 0
6 88 27 6 0
7 41 7
πi 69 -1 51 16 89 27 41

Sigue habiendo valores negativos, luego la distancia D(x) todavı́a puede ser menor. Hacemos
que entre a la base el elemento con δij más negativo luego metemos x13 = θ. Para θ = 1,
volvemos a obtener subcircuitos como podemos observar a continuación:

Añadimos al problema por tanto la restricción de ruptura del subcircuito pequeño:


x12 + x23 + x31 + y10 = 2, y10 ≥ 0. Como habı́a subtours para θ = 1 en la solución básica se
queda junto con las variables que ya tenı́amos x13 = θ = 0.
La función D(x) en este punto es:

X 7
X X 
dij xij − πi xij − 2 −π8 (x34 −y8 −1)−π9 (x56 +y9 −1)−π10 (x12 +x23 +x31 +y10 −2),
i<j i=1 j6=i

X 7
X
D(x) = δij xij + 2 πi + π8 + π9 + 2π10 − π8 y8 − π9 y9 − π10 y10 ,
i<j i=1

donde

δ34 = d34 −π3 −π4 −π8 , δ56 = d56 −π5 −π6 −π9 , δ13 = d13 −π1 −π3 −π10 , δ12 = d12 −π1 −π2 −π10 ,

δ23 = d23 − π2 − π3 − π10 , δij = dij − πi − πj para el resto de i, j con i < j.

Nos queda por tanto el diagrama de flujos y el sistema de ecuaciones siguiente:


26 CAPÍTULO 3. MÉTODOS DE RESOLUCIÓN EXACTOS

Tras resolver el sistema obtenemos los valores:

π1 = 69, π2 = 62, π3 = 51, π4 = 16, π5 = 89, π6 = 27, π7 = 41, π8 = −37, π9 = −36, π10 = −63.

y la tabla:

dij 1 2 3 4 5 6 7 πi δij 1 2 3 4 5 6 7
1 68 57 65 144 137 110 69 1 0 0 −20 −19 + 0
2 50 70 95 116 131 62 2 0 −8 −56 + +
3 30 88 80 85 51 3 0 −52 + -7
4 105 72 57 16 4 0 + 0
5 80 130 89 5 0 0
6 88 27 6 0
7 41 7
πi 69 62 51 16 89 27 69

Debemos meter por lo tanto x25 = θ y restablecemos flujos como vemos en la siguiente
figura. Esta vez para θ = 1 no nos quedan subcircuitos luego podemos meter a la base x25 = 1,
aunque para ello tendremos que quitar una de las variables que tenı́amos en la base anterior.
Nos vamos a deshacer de x45 pues al restablecer los flujos nos queda que su valor es 0.

Figura 3.5: Restablecer flujo y circuito de la quinta solución básica.

El circuito descrito por el diagrama de flujos con θ = 1 que nos queda: x13 = x34 = x47 =
x76 = x65 = x52 = x21 = 1, x23 = x17 = x57 = 0, es una solución factible del problema. Vamos
3.2. MÉTODO DE LOS PLANOS DE CORTE 27

a intentar mejorarla todavı́a más. Como no hemos añadido restricciones, D(x) no cambia con
respecto al caso anterior, pero las variables básicas si que han cambiado, lo que implica que
las ecuaciones a resolver asociadas a δij = 0 para las variables básicas han cambiado. En la
siguiente figura podemos observar como nos ha quedado el diagrama de flujos y el sistema de
ecuaciones:

Resolvemos el sistema y obtenemos los valores: π1 = 41, π2 = 34, π3 = 23, π4 = −12, π5 =


61, π6 = −1, π7 = 69, π8 = 19, π9 = 20, π10 = −7.
A continuación, los valores δij la podemos encontrar en la tabla:

dij 1 2 3 4 5 6 7 πi δij 1 2 3 4 5 6 7
1 68 57 65 144 137 110 41 1 0 + + + + 0
2 50 70 95 116 131 34 2 0 + 0 + +
3 30 88 80 85 23 3 0 + + -7
4 105 72 57 -12 4 + + 0
5 80 130 61 5 0 0
6 88 -1 6 0
7 69 7
πi 41 34 23 -12 61 -1 69

Sigue habiendo un valor negativo en la tabla. Añadimos pues a la solución básica la variable
x37 = θ. Si θ = 1, entonces el diagrama de restablecer el flujo nos queda como mostramos en la
próxima figura. Como hemos encontrado subcircuitos, se pone la restricción x12 + y11 = 1 para
eliminarlo y debe entrar x37 a la base con valor 0.
28 CAPÍTULO 3. MÉTODOS DE RESOLUCIÓN EXACTOS

Ahora la ecuación de D(x) tendrá un nuevo sumando tal y como ha pasado en los casos
anteriores:
X 7
X
D(x) = δij xij + 2 πi + π8 + π9 + 2π10 + π11 − π8 y8 − π9 y9 − π10 y10 − π11 y11 , (3.1)
i<j i=1

δ12 = π1 + π2 + π10 + π11 . El resto de δij no varı́an con respecto al caso anterior.
Resolvemos entonces el sistema que nos queda al igualar a 0 las δij correspondientes a las
variables básicas representado junto con el diagrama de flujos en la figura que mostramos a
continuación:

Calculamos los valores a πi :

π1 = 41, π2 = 34, π3 = 16, π4 = −12, π5 = 61, π6 = −1, π7 = 69, π8 = 26, π9 = 20, π10 = 0, π11 = −7.

Ahora damos los valores de δij para la sexta solución básica en la tabla:

dij 1 2 3 4 5 6 7 πi δij 1 2 3 4 5 6 7
1 68 57 65 144 137 110 41 1 0 + + + + 0
2 50 70 95 116 131 34 2 0 + 0 + +
3 30 88 80 85 16 3 0 + + -7
4 105 72 57 -12 4 + + 0
5 80 130 61 5 0 0
6 88 -1 6 0
7 69 7
πi 41 34 16 -12 61 -1 69

Todos los valores de δij son positivos, luego si en (3.1) introducimos alguna variable más
con valor 1, entonces la distancia aumentará. Las variables básicas que tenemos entonces son:

x13 = x34 = x47 = x76 = x65 = x52 = x21 = 1, x17 = x37 = x23 = x57 = 0.
El tour óptimo, está representado por las variables de esa solución con valor 1, y es exacta-
mente el de la Figura 3.5 y tiene coste D(x) = 455.
Capı́tulo 4

Heurı́sticas para el TSP

Como ya hemos explicado, un método heurı́stico es un algoritmo que trata de resolver


un problema de manera eficiente, aunque pueda suponer que no nos proporcione la solución
óptima. Hay muchas heurı́sticas que a lo largo de los años se han ido desarrollando para intentar
simplificar la resolución del TSP, como son la heurı́stica del vecino más proximo, la del árbol
de expansión mı́nimo, la de Chistophides o la de Lin y Kernighan. A continuación mostraremos
alguna de ellas.
Nota 4.0.1. Para toda heurı́stica que expliquemos, vamos a considerar que se cumple la de-
sigualdad triangular entre las distancias de los vértices. Esto no es un problema, ya que aunque
en cualquier grafo esto no tiene porque ser cierto, en los casos reales en los que apliquemos
heurı́sticas siempre se cumplirá.

4.1. Algoritmo codicioso o del vecino más próximo


Definición 4.1.1. Sea una instancia del TSP. Llamaremos tour parcial a un camino que visita
todas las ciudades a lo sumo una vez (un tour es un camino cerrado que visita todas las ciudades
exactamente una vez).
El algoritmo codicioso (conocido normalmente por su nombre en inglés como Greedy Algo-
rithm) se basa en la regla del vecino más cercano (Nearest Neighbor Rule, NNR) y realiza los
siguientes pasos para conseguir un tour partiendo de la ciudad v1 :
1. Comienza buscando la ciudad más cercana a v1 que no se encuentre en el tour y se agrega
al recorrido.
2. A partir de aquı́, se busca la siguiente ciudad más cercana a la última añadida al tour
parcial hasta que hayamos visitado todas las ciudades.
Una vez ha llegado a la última ciudad, vuelve a la ciudad de origen desde el último nodo.
La ventaja de este método es su simplicidad de entender e implementar, sin embargo, aunque
para instancias pequeñas del TSP pueda obtener buenas soluciones, muchas veces obtenemos
tours que difieren notablemente del camino óptimo.

4.2. Algoritmo del Árbol de expansión mı́nimo


Definición 4.2.1. Un árbol de expansión para un conjunto de n vértices, es una colección de
n − 1 ramas que unen todos ellos sin formar ciclos.

29
30 CAPÍTULO 4. HEURÍSTICAS PARA EL TSP

Tanto en esta heurı́stica como en la siguiente, cuando hablemos del T SP , siempre nos vamos
a referir al caso simétrico que cumpla la desigualdad triangular.
Existe una amplia variedad de algoritmos que en tiempo polinomial construyen un árbol
de expansión de mı́nima distancia, donde la distancia total es la suma de las distancias de
las ramas que lo forman. Observamos, que la solución óptima de este problema es una cota
inferior para el tamaño del tour óptimo del TSP pues si borramos cualquier arco del camino
óptimo obtenemos un árbol de expansión que tendrá una distancia igual o superior a la distancia
del árbol de expansión mı́nimo. Veamos un método simple para crear un árbol de expansión
mı́nimo, conocido como Algoritmo de Kruskal: Dado un grafo de n vértices G = (V, A) donde
cada arista tiene asociado un peso positivo, realizaremos los siguientes pasos:

1. Ordenamos de manera no decreciente, todos las aristas en función de su peso.

2. Elegimos la arista de menor peso, comprueba si se forma algún ciclo con el árbol formado
hasta el momento. Si no se crean ciclos, añádelo al árbol, en caso contrario descarta esa
arista.

3. Repite el paso 2 con la arista que sigue en función del orden establecido en el paso 1 hasta
que haya n − 1 aristas en el árbol

Observar que la longitud del árbol de expansión mı́nimo es menor que la del TSP, ya que si
quitamos una arista a cualquier tour, obtenemos un árbol de expansión.
Una vez hemos obtenido el árbol de expansión mı́nimo, vamos a utilizar el método depth
first search para visitar todas las ciudades y volver a la de origen. Este algoritmo consiste en
comenzando en una hoja del árbol, aplicar: si nos encontramos en un vértice y hay alguna
rama de las que se encuentren en él que todavı́a no ha sido recorrida, atravesarla para llegar
a un nuevo vértice. Si llegamos a un vértice en el que todas sus ramas han sido ya recorridas,
retroceder al vértice anterior. Tenemos que realizar este método, hasta volver otra vez al vértice
origen. Con este método se verifica que todos los vértices son visitados y cada una de las ramas
del árbol mı́nimo, se visita exactamente dos veces. Veamos un ejemplo del depth first search:
Sea la Figura 4.1(a) un árbol mı́nimo de una instancia de un TSP. Aplicamos el método
depth first search, y obtenemos la secuencia siguiente, representada en le Figura 4.1(b):

I→H→G→E→G→H→F →D→A→D→F →C→F →

→ B → F → H → I.

(a) (b)

Figura 4.1: árbol de expansión mı́nimo y depth first search


4.2. ALGORITMO DEL ÁRBOL DE EXPANSIÓN MÍNIMO 31

La distancia recorrida en este caso es dos veces la distancia del árbol mı́nimo, pero el
problema es que las ciudades se visitan más de una vez. Como hemos supuesto que la distancia
entre ciudades en el árbol mı́nimo cumple la desigualdad triangular, entonces podemos evitar
repeticiones de ciudades introduciendo “atajos”, es decir, realizamos el depth first search, pero
cada vez que retrocedamos a una ciudad que ya fue visitada, la salta y va directamente a la
próxima por la que no hayamos pasado. En el recorrido anterior reemplazarı́amos:


 E → G → H → F por E → F,

A → D → F → C por A → C,


 C → F → B por C → B,
B → F → H → I por B → I

y obtendrı́amos un tour, de recorrido igual o menor que la obtenida por el depth first serch, es
decir, estarı́a acotada superiormente por el doble del recorrido del spaning tree mı́nimo. En la
Figura 4.2 observamos el recorrido final.

Figura 4.2: Recorrido obtenido por el método del árbol de expansión mı́nimo

Veamos esta heurı́stica aplicada a un caso concreto del T SP .


Ejemplo 4.2.1. Sea una instancia del T SP simétrico y que cumple la desigualdad triangular
cuyos costes entre sus ciudades viene determinado en el Ejemplo 3.2.1.
Ahora vamos a calcular el árbol de expansión mı́nimo. Realizando el algoritmo de Kruskal,
obtenemos el árbol de la Figura 4.3 cuyo coste total es de 342 al que también como se ve en la
figura hemos aplicado el método de Depth First Serch y por tanto se han doblado sus aristas:

Figura 4.3: Árbol de expansión mı́nimo


32 CAPÍTULO 4. HEURÍSTICAS PARA EL TSP

Ahora vamos a utilizar la técnica de los atajos, comenzando desde el nodo 2. El primer atajo
correspondiente es romper el ciclo: 2 → 3 → 1 → 3. Para ello como se cumple la desigualdad
triangular, podemos saltar desde 1 directamente a 4: 2 → 3 → 1 → 4. Ocurre lo mismo una vez
llegamos al nodo 5 donde tendremos que usar un atajo para volver al nodo origen 2. Podemos
ver en la Figura 4.4 la solución que obtenemos al finalizar esta heurı́stica.

Figura 4.4: Circuito tras aplicar la heurı́stica del árbol de expansión mı́nimo

La distancia total recorrida mediante este circuito es de 472. Vemos que efectivamente es
inferior al doble del tamaño del árbol mı́nimo. Además, el resultado óptimo obtenido en el
Capı́tulo 3 es de 455 luego la solución obtenida mediante esta heurı́stica puede considerarse
buena.

4.3. Algoritmo de Christofides


Las ideas del algoritmo del árbol de expansión mı́nimo fueron extendidas por Christofides
[4] para lograr un resultado mejor para el problema del viajante simétrico. En ella se combinan
las nociones de grafo euleriano, tour euleriano y matching.
Un grafo euleriano, es un grafo conexo, en el que todo vértice tiene grado par, es decir es un
grafo que tiene un tour euleriano (ciclo que pasa por cada rama sólo una vez). Ya nos hemos
referido con anterioridad a este tipo de estructuras cuando hemos introducido el problema de
los puentes de Köningsberg y los problemas de rutas por arcos.
Todo empieza por darse cuenta de que si tenemos una instancia cualquiera del TSP, calcula-
mos su árbol mı́nimo y duplicamos sus ramas, obtendremos un grafo euleriano (ésta es la razón
por la que la heurı́stica del árbol de expansión mı́nimo funciona) que podemos convertir en un
camino del TSP usando “atajos” como hemos explicado en el método anterior. Esto sugiere
que, si queremos encontrar mejores recorridos del problema del viajante, tenemos que buscar
es una mejor forma de generar grafos eulerianos que conecten todas las ciudades.
Uno de los mejores métodos para realizar esto fue ideado por Christofides y se llama matching
de mı́nimo peso.
Dado un número par de ciudades, un matching es un conjunto de arcos, tal que cada ciudad
es extremo de exactamente uno sólo de estos arcos. El de mı́nimo peso, es aquel cuyo peso total
de las ramas sea mı́nimo. Esta clase de matching pueden encontrarse en tiempo O(n3 ).
4.3. ALGORITMO DE CHRISTOFIDES 33

El algoritmo de Christopides tiene las siguientes etapas, para un grafo G instancia del TSP :
1. Crear un árbol de expansión mı́nimo T de G.
2. Sea I el conjunto de vértices de grado impar del árbol T , encontrar un matching de
mı́nimo peso M en el grafo completo sobre los vértices de I.
3. Combinar las aristas de M y T para crear un grafo H. Este grafo tendrá todos sus vértices
de orden par, luego será un grafo euleriano.
4. Encontrar un tour euleriano de H.
5. Utilizar el método de los atajos (shortcutting) para evitar repetir nodos
Podemos ver un ejemplo paso a paso en la Figura 4.5

Figura 4.5: Ejecución del algoritmo de Cristophides

En [4] podemos encontrar una demostración realizada por el propio Christofides de que el
tour óptimo que encontramos usando esta heurı́stica debe ser inferior a 3/2 del coste óptimo y
también de que esta construcción tiene una complejidad de O(n3 ).
A continuación, mostramos el mismo ejemplo del T SP que hemos usado para la heurı́stica
del árbol de expansión mı́nimo pero usando la heurı́stica de Christofides.
Ejemplo 4.3.1. Sea la matriz de costes del Ejemplo 3.2.1. Entonces vamos a buscar un Mat-
ching de mı́nimo peso para los vértices de orden impar del árbol de expansión mı́nimo (imagen
de la izquierda de la Figura 4.3). Como podemos ver, los vértices de grado impar son: 1, 2, 3 y 5.
Vamos a necesitar por tanto dos aristas que los unan dos a dos, para encontrar el Matching
de mı́nimo peso. Encontramos que el mı́nimo se obtiene al añadir las aristas 1 − 3 y 2 − 5. A
continuación buscamos un tour Euleriano. En la Figura 4.6 podemos ver ambos resultados.

Figura 4.6: Matching


34 CAPÍTULO 4. HEURÍSTICAS PARA EL TSP

Curiosamente, si ahora aplicamos otra vez el método de los atajos, nos vuelve a quedar el
mismo resultado que con la heurı́stica del árbol mı́nimo (Figura 4.4). El coste de este circuito
era de 472, que como podemos ver es inferior a 3/2 ∗ 455.
En esta memoria, sólo tenemos espacio para ver estas tres heurı́sticas ya que hablar y explicar
la gran variedad de heurı́sticas existentes para el problema del viajante podrı́an ocuparnos
otra memoria completa. Si se tiene interés por conocer otras heurı́sticas de mayor complejidad
utilizadas para resolver instancias del TSP puede consultar la heurı́stica de Lin y Kernigan [18]
o las heurı́sticas de intercambio definidas por Flood [8] entre muchas otras.
Capı́tulo 5

TSP es NP-Duro

Habitualmente, cuando se habla del problema del viajante, siempre se hace referencia a su
dificultad de resolución, pero lo cierto es, que aunque todavı́a no tengamos un algoritmo que
resuelva toda instancia del TSP en un tiempo razonable, tampoco somos capaces de afirmar que
este algoritmo no exista. Lo que sı́ podemos afirmar, es que el TSP siempre tiene solución pues
podremos analizar todas las posibles alternativas y quedarnos con la mejor. El problema de este
método radica en que el número de ciclos a analizar aumenta de manera estrepitosa conforme
agrandamos el problema, ya que el número de posibles rutas a analizar en un problema con n
nodos asciende hasta (n − 1)!.

No fue hasta el año 1962, cuando M. Held y R. Karp [13] descubrieron el algoritmo basado
en programación dinámica mencionado en el Capı́tulo 3 y de orden n2 2n , que mejoró significati-
vamente la eficiencia a la hora de ejecutar un algoritmo sólido para resolver cualquier instancia
de tamaño n del problema del viajante. No obstante, si aumentamos relativamente el número
de ciudades, este algoritmo tampoco es capaz de calcular el óptimo. En estos años, a la par que
iban apareciendo estos problemas, surgió también la pregunta, ¿Cuándo consideramos que un
algoritmo es eficiente?. Fue el matemático J. Edmonds en 1965 [7] quien razonó una respuesta
cuando determinó un propiedad para conocer la eficiencia de un algoritmo, que consiste en de-
mostrar que el tiempo máximo para resolver un problema de tamaño n con este algoritmo debe
ser Knc con K, c constantes. Generalmente se habla de algoritmos O(nc ), englobados todos
ellos con el nombre de algoritmos de tiempo polinómico.

En este capı́tulo vamos a tratar la existencia o no de uno de estos algoritmos para el pro-
blema del viajante y la clasificación de este problema en función de su complejidad. Para ello,
veremos una de las cuestiones más estudiadas de la teorı́a de la complejidad, que consiste con-
cretamente en determinar si un determinado problema pertenece alguno de los dos grupos de
problemas P (Polinómico) y NP (No-determinı́stico Polinómico) en función de si conocemos un
algoritmo eficiente para el mismo o no (veremos con mayor detenimiento las definiciones de P y
NP a lo largo del capı́tulo). Este hecho que a simple vista puede no parecer tan complicado, ha
sido y todavı́a es, una de las grandes cuestiones de la computación y la teorı́a de la complejidad.
Todavı́a no se sabe si en realidad P y NP coinciden, argumento que ha creado mucha contro-
versia a matemáticos ampliamente reconocidos y que han trabajado en este campo, muchos de
los cuales se centraron en el problema del viajante pues es posiblemente el más representativo
de todos estos problemas.
Esta conjetura de descubrir si P =NP ha adquirido tal relevancia que el Instituto Clay
de Matemáticas ofrece un millón de dólares al creador de un algoritmo en P para resolver

35
36 CAPÍTULO 5. TSP ES NP-DURO

el problema del viajante, o al que por el contrario demuestre la no existencia del mismo
(www.claymath.org/millennium-problems/p-vs-np-problem).
Otro resultado muy importante relacionado con este tema que veremos procede de un artı́cu-
lo publicado por S.Cook en (1971) [5], en el que prueba que muchos problemas de decisión consi-
derados “difı́ciles o no eficientes”, son computacionalmente equivalentes. A estos problemas los
llamaremos NP -Completos y tienen la caracterı́stica de que cualquier problema de NP puede
transformarse en un proceso de tiempo polinómico en él. Ası́, cualquier método que resuelva
un problema NP -Completo, podrá resolver mediante esta transformación cualquier problema
de NP.
Cuando ya no sólo hablamos de problemas de decisión sino también de optimización, apa-
recerá la noción de NP -Duro y veremos que el TSP es uno de ellos.
La estructura que seguiremos es la siguiente (organización similar a la encontrada en los
libros de Garey y Johnson [10] y Korte y Vygen [14]). Primero usamos máquinas de Turing
para describir los conjuntos de problemas de decisión P y NP y daremos definiremos también
los problemas NP -Completos. A continuación, precedemos a demostrar el teorema de Cook
[5] que afirma que el problema de satisfabilidad es NP -Completo. Con este resultado seremos
capaces de probar que el problema 3-SAT y el problema de los ciclos hamiltonianos son también
NP -Completos, idea necesaria que utilizaremos para concluir que el problema del viajante es
NP -Duro, es decir, que todo problema en NP se transforma en un tiempo polinómico en el
problema del viajante.

5.1. Máquinas de Turing


En esta sección, vamos a ver un modelo de computación simple, la máquina de Turing. Todo
algoritmo en este trabajo descrito se puede escribir mediante un proceso de tiempo polinómico,
como una máquina de Turing; lo que nos va a permitir expandir los conceptos afirmados para
las maquinas de Turing a cualquiera de estos algoritmos.
Antes de definir propiamente una máquina de Turing, necesitamos una serie de conceptos
previos que presentamos a continuación:
Definición 5.1.1. Llamaremos alfabeto o abecedario a un conjunto A finito de al menos dos
elementos y que no contiene al sı́mbolo reservado t (que será utilizado para los espacios en
blanco).
En un alfabeto, cada elemento de An , n ∈ N ∪ {0} representa una cadena formada por n
elementos del alfabeto A.
Nota 5.1.1. A0 representa la cadena vacı́a.
Para cada alfabeto A, denotamos A∗ = An al conjunto de todas las posibles cadenas
S
n∈N∪{0}
finitas formadas por los elementos del alfabeto A.
Definición 5.1.2. A un subconjunto X ⊆ A∗ se le denomina lenguaje sobre A.
A cada uno de los elementos de un lenguaje X se le llama palabra.
Nota 5.1.2. Muchas veces, trabajamos con el alfabeto binario A = {0, 1} y el conjunto {0, 1}∗
de todas las posibles cadenas binarias.
Ejemplo 5.1.1. Un grafo G puede ser descrito mediante un lenguaje en el que cada vértice
sea una palabra del lenguaje, y cada arista entre vértices se exprese mediante parejas de los
vértices que une, por ejemplo: si tenemos dos vértices(V 1, V 2) y una arista entre ellos (V 1 −
V 2), podrı́amos describir el grafo como: [V 1V 2V 1 − V 2] donde el alfabeto tiene que tener los
elementos {V, 0, 1, . . . , 9, −}.
5.1. MÁQUINAS DE TURING 37

5.1.1. Descripción de una máquina de Turing


En esta sección nos centraremos en las máquinas de Turing de una cinta para un determinado
alfabeto A
Definición 5.1.3. Sea A un alfabeto, y A := A ∪ {t}. Una máquina de Turing de una cinta
en A se define por la función:

φ : {0, . . . , N } × A → {−1, . . . , N } × A × {−1, 0, 1} (5.1)

Para un cierto N ∈ N ∪ {0}.


Básicamente, una máquina de Turing está formada por una cinta de infinitas celdas en las
que podemos encontrar una secuencia de elementos de A. En está cinta se encuentra escrita la
cadena x ∈ A∗ que queremos computar la cual es completada por espacios en blanco t hacia la
izquierda y hacia la derecha para garantizar que la cinta es infinita. Además, existe una cabeza
lectora/escritora (pues es capaz de leer y escribir una de estas celdas por operación) y puede
moverse (avanzar o retroceder una celda, o quedarse en esa posición) y por último, un conjunto
de instrucciones denotadas por números del conjunto {−1, . . . , N }.
Gráficamente podemos verla ası́:

Figura 5.1: Ejemplo de cinta de Turing

Ası́ pues, analizando estos tres elementos, podemos describir el significado de las entradas
y salidas de la función (5.1), computando una cadena x ∈ A∗ , que se ejecutará cada vez que la
cabeza lectora lea una nueva celda.

φ : {0, . . . , N } × A → {−1, . . . , N } × A × {−1, 0, 1}

(I, a) 7−→ φ(I, a) = (I, a, b)


Cada Instrucción I ∈ {0, . . . , N } tiene un comportamiento en función del elemento a que
es el valor de la celda en la que esta posicionada la cabeza lectora. Este comportamiento tiene
tres sencillos pasos:
La primera salida: I es el número de la instrucción que se ejecutará en la siguiente compu-
tación.
La segunda implica sobrescribir por el elemento a, el elemento de la celda en la que se
encuentra la cabecera (si queremos dejar el mismo elemento, no tenemos más que escribir
este en la celda).
b ∈ {−1, 0, 1}, manda avanzar una casilla, no cambiar de posición o retroceder una celda
respectivamente a la cabeza lectora.
38 CAPÍTULO 5. TSP ES NP-DURO

La instrucción I = −1 es la llamada instrucción de parada que indica el final de la secuencia


de la computación.
En un principio, la secuencia comienza en la posición 1 de la cinta y ejecuta la instrucción
0, y consiste en computar la función φ hasta llegar a la instrucción de parada I = −1. La
salida de la máquina de Turing definida por la función φ con entrada la cadena x ∈ A se llama
Output(φ, x) y es la cadena que queda en la cinta, después de llegar a la instrucción de parada
empezando desde la posición 1, hasta encontrar el primer t.
Si esta secuencia es infinita, es decir nunca llega a la instrucción de parada, decimos que
time(φ, x) := ∞ y que Output(φ, x) es indefinida.
Nota 5.1.3. Muchas veces denotamos la computación de φ para una entrada x mediante φ(i) =
(n(i) , s(i) , π (i) )i=0,1,... donde:

n(i) es la instrucción a ejecutar en el paso i.

s(i) estado de la cinta en el paso i.

π (i) posición de la cabeza lectora en el paso i.

Vamos a ver un ejemplo concreto de una máquina de Turing:

Ejemplo 5.1.2. Vamos a realizar la operación que acepte por entrada un número natural n
codificado en binario y nos devuelva el número más 1 (n + 1).
Para ello, tenemos que partir de la siguiente idea: Si el número codificado termina en 0, en-
tonces ponemos en el bit menos significativo (el que está más a la derecha) un 1 y ya habrı́amos
terminado, pero si por el contrario encontramos un 1, entonces tendremos que poner 0 en ese
bit con la consecuencia de que obtenemos un acarreo. Tendremos que sumar este acarreo, al bit
inmediatamente anterior y seguiremos teniendo acarreo igual a 1 mientras que no lleguemos a
un bit que estaba a cero en la entrada original. Por ejemplo, si la entrada es 1011, el proceso
serı́a (denotamos al acarreo con la letra C, de Carry en inglés):

1011 → 1010 C = 1 → 1001 C = 1 → 1100 C = 0 → STOP.

Nos falta de considerar también el caso en el que la entrada sea todo 1 (es decir un número
de la forma 2n − 1, n ∈ Z+ ), pues entonces tendremos que poner todos los bits a cero excepto
el primero y añadir un bit extra a la derecha con valor 0, esto es el caso, por ejemplo de
Output(φ, 111) = 1000.
Para esto, vamos a necesitar 4 instrucciones y el lenguaje será el binario con el sı́mbolo del
blanco X = {0, 1, t}.
La función φ será por tanto la siguiente:

φ : {0, . . . , 3} × {0, 1, t} → {−1, . . . , 3} × {0, 1, t} × {−1, 0, 1}

y las instrucciones en función del elemento que encontremos serán:


Instrucción 0:

φ(0, 0) = (0, 0, 1) φ(0, 1) = (0, 1, 1) φ(0, t) = (1, t, −1).

Con la instrucción 0, avanzamos hasta el final del número, nos colocamos en el último bit y
pasamos a la instrucción 1.
Instrucción 1:

φ(1, 0) = (−1, 1, 0) φ(1, 1) = (1, 0, −1) φ(1, t) = (2, t, 1).


5.2. CLASES P Y NP 39

Aquı́ realizamos lo explicado anteriormente, si encontramos un 0, lo ponemos a 1 y hemos


terminado. Si encontramos un 1 tendremos que ponerlo a 0 y continuar el proceso con los
dı́gitos de su izquierda hasta o bien encontrar un 0, entonces paramos, o hasta que llegamos al
sı́mbolo t, lo que implica que todos los bits estaban a 1 y tenemos que realizar las instrucciones
2 y 3.
Instrucción 2: coloca un 1 en el primer bit (que es en el que se encuentra la cabeza lectora
si llega a esta instrucción y en el que sólo puede haber un 0, y cambia a la instrucción 3.

φ(2, 0) = (3, 1, 1).

Instrucción 3: avanza hasta el final de la cadena buscando t y cuando ha llegado a este sı́mbolo,
pone en esa posición un cero y termina):

φ(3, 0) = (3, 0, 1) φ(3, t) = (−1, 0, 0).

Algunos valores de φ no están incluidos, pues en ninguna ejecución llegaremos a ese caso.
Además, el tiempo de ejecución time(φ, x) ≤ 3 size(x) + 3, luego estamos ante una máquina de
Turing de tiempo polinómico.
Veamos un caso concreto de la computación de φ: para la entrada anterior x = 1011,
obtenemos la secuencia φ(i) = (n(i) , s(i) , π (i) )i=0,1,... :

i=0 φ(0) = (0, [. . . t 1011 t . . .], 1) i=4 φ(4) = (0, [. . . t 1011 t . . .], 5)
i=1 φ(1) = (0, [. . . t 1011 t . . .], 2) i=5 φ(5) = (1, [. . . t 1011 t . . .], 4)
i=2 φ(2) = (0, [. . . t 1011 t . . .], 3) i=6 φ(6) = (1, [. . . t 1010 t . . .], 3)
i=3 φ(3) = (0, [. . . t 1011 t . . .], 4) i=7 φ(7) = (1, [. . . t 1000 t . . .], 2)

El siguiente paso, ya hemos llegado a la instrucción −1:

i=8 φ(8) = (−1, [. . . t 1100 t . . .], 2).

Luego ya hemos terminado y nos queda en la cinta la solución, comenzando desde la posición
1 hasta el primer t: Output(Φ, x) = 1100.

Nota 5.1.4. Size(x) representa el número de elementos que tiene la palabra x ∈ X.

Definición 5.1.4. Sea A un alfabeto, X, Y ⊆ A∗ dos lenguajes, f : X → Y , una función. Sea


φ una máquina de Turing con alfabeto A, entonces, se dice que φ computa f si:

time(φ, x) < ∞ y Output(φ, x) = f (x) ∀x ∈ X.

Además si existe p polinomio tal que time(φ, x) < p(size(x)) ∀x ∈ X, entonces se dice que φ
es una máquina de Turing polinómica.

Nota 5.1.5. En el ejemplo anterior, podemos decir que φ computa la función f (n) = n+1, n ∈ N.

5.2. Clases P y NP
Vamos a utilizar lo visto con máquinas de Turing para definir conceptos de la teorı́a de
Completitud-NP para los llamados problemas de decisión.
40 CAPÍTULO 5. TSP ES NP-DURO

Definición 5.2.1. Sea X un lenguaje, Y ⊆ X, un problema de decisión es un algoritmo


(máquina de Turing) que computa la función:

f : X → [0, 1]

tal que
f (x) = 1 cuando x ∈ Y
f (x) = 0 cuando x ∈ X \ Y
Con esta función, podremos determinar qué elementos x ∈ X pertenecen al subconjunto
Y ⊆ X.
Nota 5.2.1. A los elementos y ∈ Y (Y de “Yes” en inglés) se les llama sı́-instancias.
Definición 5.2.2. La clase de todos los problema de decisión, para los que se conoce un
algoritmo que lo resuelve en tiempo polinómico, se denomina P.
Antes de definir formalmente un problema NP, vamos a ver de manera intuitiva un ejemplo.
Ejemplo 5.2.1. Consideramos el problema del viajante, en el que conocemos un conjunto de
ciudades, y las distancias entre cada una de ellas. Sea L ∈ R+ . ¿Existe algún recorrido que
pase por todas las ciudades, cuya longitud total sea inferior a L? No hay ningún algoritmo
que resuelva este problema en tiempo polinómico, sin embargo, si suponemos en una instancia
un recorrido concreto, sı́ que podrı́amos determinar mediante un algoritmo polinómico si este
camino es efectivamente un recorrido que pase por todas las ciudades y si la longitud total es
menor que L o no.
Definición 5.2.3. Un problema de decisión P = (X, Y ) pertenece a NP si existe un polinomio
p y otro problema de decisión P 0 = (X 0 , Y 0 ) en P donde,
bp(size(x))c
X 0 := {x#c | x ∈ X, c ∈ {0, 1} }
tal que

Y := {y ∈ X | ∃c ∈ {0, 1}bp(size(y))c con y#c ∈ Y 0 }


Aquı́, a la cadena c con y#c ∈ Y 0 se le llama certificado de y (ya que es un caso en el que
y ∈ Y , es decir, es una sı́-instancia del problema de decisión original).
Nota 5.2.2. Con y#c nos referimos a la concatenación de y, el sı́mbolo # y la cadena c.
Otra forma de definir NP, es en función de los llamados algoritmos no-determinı́sticos. Estos
algoritmos constan de dos etapas:
Etapa de conjetura: Dada una instancia (x), elegimos un certificado c (en el ejemplo
anterior, serı́a un cierto recorrido entre los vértices). Se supone, que la etapa de conjetura
es un algoritmo “mágico” que va explorando todas las posibles opciones, recorrido entre
los vértices en nuestro ejemplo, y que no consume recursos para ello.
Etapa de comprobación: Ejecutamos un algoritmo determinı́stico con entradas (x, c) que
compruebe si el certificado c verifica que x es una sı́-instancia devolviendo como salida 1
(en el ejemplo anterior, que pase por todas las ciudades y su longitud sea menor que la
cota dada).
Definición 5.2.4. Decimos que un algoritmo no determinı́stico resuelve un problema de
decisión P = (X, Y ) si ∀x ∈ X instancia, se cumple:
5.2. CLASES P Y NP 41

• Si x ∈ Y : existe un certificado c para el cual la etapa de comprobación con (x, c)


devolverá 1 (sı́).
• Si x ∈/ Y : no existe ningún certificado c para el cual la etapa de comprobación con
(x, c) devuelva 1.

Definición 5.2.5. Un algoritmo no-determinı́stico que resuelve un problema de decisión P =


(X, Y ) se dice que opera en tiempo polinómico si existe un polinomio p para el cual, ∀x ∈
Y , existe c certificado tal que la etapa de comprobación devuelve 1 en un tiempo inferior a
p(longitud(x)).
Nota 5.2.3. La clase NP es la clase de todos los problemas de decisión P = (X, Y ) que pueden
ser resueltos en tiempo polinómico mediante algoritmos no determinı́sticos.
Veamos dos ejemplos de problemas en NP.
Proposición 5.2.1. El problema de decidir si un grafo posee ciclos hamiltonianos o no, perte-
nece a NP.
Demostración. Sea G una sı́-instancia (es decir un grafo con un ciclo hamiltoniano), entonces
tomamos como certificado c uno de estos circuitos (Etapa de conjetura, consiste en encontrar
cada uno de los circuitos del grafo, suponiendo como hemos dicho antes, que no consume
recursos). El problema ahora se centra en comprobar (estado de comprobación) si un conjunto de
aristas es un circuito hamiltoniano del grafo dado, lo que se puede realizar en tiempo polinómico.

Proposición 5.2.2. P ⊆ NP
Demostración. Sea P ∈ P, si elegimos el polinomio p = 0, entonces c ∈ {0, 1}b0c , luego un
algoritmo no determinı́stico en la etapa de comprobación para P simplemente elimina el ultimo
signo (#) de la entrada x# y aplica el algoritmo determinı́stico de P.

5.2.1. Transformaciones polinómicas y Completitud NP


Si P 6= NP, entonces sea un problema P ∈ NP, nos interesa deducir, si además P ∈ P o si
P ∈ NP–P. Pero como no está demostrado que P 6= NP, nos centraremos en demostrar si P es
NP -Completo. Un problema Completo P cumple, como veremos a continuación, que cualquier
problema de NP se puede transformar polinómicamente en P, esto implica que si encontramos
un algoritmo de resolución polinómico para un problema NP -Completo, podrı́amos resolver
en tiempo polinómico cualquier problema de NP a través de su transformación y quedarı́a
demostrado que P =NP. O lo que es equivalente, un problema NP -Completo puede ser resuelto
en tiempo polinómico si y sólo si P =NP.
Los problemas NP -Completos se consideran los problemas en NP de mayor complejidad.
Profundicemos un poco más en la teorı́a de la NP -Completitud a través de los siguientes
resultados.
Definición 5.2.6. Sean P1 = (X1 , Y1 ), P2 = (X2 , Y2 ) dos problemas de decisión, una función

f : X1 → X2

se dice transformación polinómica, si cumple:


1. Existe un algoritmo determinı́stico de tiempo polinómico que computa f.
2. Para cada x ∈ X1 , x ∈ Y1 si y solamente si f (x) ∈ Y2 .
42 CAPÍTULO 5. TSP ES NP-DURO

Si existe una transformación polinómica de P1 a P2 , lo denotaremos como P1 ∝ P2 .

Es fácil de observar de la propia definición de transformación polinómica el siguiente lema:

Lema 5.2.1. Si P1 ∝ P2 se verifica: si P2 ∈ P, entonces P1 ∈ P.

Definición 5.2.7. Un problema de decisión P = (X, Y ) ∈ NP se dice NP -Completo si ∀P 0 ∈


NP, entonces P 0 ∝ P.

Lema 5.2.2. Si P1 , P2 ∈ NP, P1 es NP-Completo y P1 ∝ P2 , entonces P2 es NP-Completo.

Nota 5.2.4. Este lema previo, nos va a permitir probar que muchos problemas son NP -Completos,
mediante la búsqueda de transformaciones polinómicas.

5.3. El teorema de Cook


El primer problema NP Completo, fue el llamado problema de satisfactibilidad (SAT) que
describiremos a continuación.

Definición 5.3.1. Sea U = {u1 , u2 , . . . , um } conjunto de variables booleanas. Se llama corres-


pondencia de verdad para U, a una función T : U → {true, f alse}.
Si T (u) = true entonces decimos que u es verdad con respecto a T. En caso contrario,
decimos que u es falsa.
Sea u ∈ U , entonces u, u son literales de U . El literal u es cierto con respecto a T si y sólo
si, la variable u es cierta con respecto a T (es decir, T (u) = true) y u es cierto, si y sólo si
T (u) = f alse.
Una cláusula sobre U es un conjunto de literales de U tal que representa la disyunción de
los literales, es decir, es satisfecha por una correspondencia de verdad T si y sólo si, al menos
uno de sus miembros es cierto bajo T .

Definición 5.3.2. Una colección C de cláusulas sobre U es satisfactible si y sólo si existe


alguna correspondecia de verdad para U que satisface todas y cada una de las cláusulas de C.

Estos conceptos nos permiten mostrar el problema de satisfabilidad (SAT):

Sea U un conjunto de variables, y C una colección de cláusulas sobre U . ¿Existe algúna


correspondecia de verdad que satisfaga C?

Ejemplo 5.3.1. Sea U = {u1 , u2 }, entonces C1 = {{u1 , u2 }, {u1 , u2 }}, es una instancia satis-
factible del problema SAT, pues por ejemplo T (u1 ) = T (u2 ) = true satisface C1 , sin embargo
para C2 = {{u1 , u2 }{u1 , u2 }{u1 }} no existe ninguna correspondencia de verdad que la satisfaga,
luego C2 es no satisfactible.

Teorema 5.3.1 (Teorema de Cook).


El problema de satisfabilidad (SAT) es NP-Completo.

Demostración. Veamos primero que SAT pertenece a NP.


Una sı́-instancia del problema SAT, es por definición, aquella para la que existe una co-
rrespondencia de verdad que la satisfaga, por lo tanto si tomamos esta correspondencia como
certificado para el proceso de comprobación, podremos determinar en tiempo polinómico que
efectivamente es una sı́-instancia.
5.3. EL TEOREMA DE COOK 43

Sea ahora P = (X, Y ) un problema genérico en NP. Veamos que P se transforma polinómi-
camente en SAT. Para ello, encontraremos la transformación que cumpla la definición (5.2.6).
Por la definición (5.2.3) existe un polinomio p y otro problema de decisión P 0 = (X 0 , Y 0 ) en
P donde,
bp(size(x))c
X 0 := {x#c | x ∈ X, c ∈ {0, 1} },

Y := {y ∈ X | ∃c ∈ {0, 1}bp(size(y))c con y#c ∈ Y 0 }.


Sea ahora
φ : {0, . . . , N } × A → {−1, . . . , N } × A × {−1, 0, 1}
la máquina de Turing de P 0 con alfabeto A y A := A ∪ {t}. Sea q un polinomio tal que
time(φ, x#c) ≤ Q ∀x#c ∈ X 0 con Q = q(size(x#c)) y size(x#c) = size(x) + 1 + bp(size(x))c.
Notar que Q es una cota superior de la longitud de cualquier computación de φ para cualquier
x#c con c ∈ {0, 1}bp(size(x))c .

Ahora construiremos una colección de cláusulas Z(x) sobre un conjunto V(x) de variables
booleanas para cada x ∈ X, que cumpla que Z(x) es satisfactible si y sólo si x ∈ Y (posterior-
mente describiremos el significado de cada una de ellas).

Construimos V(x):

- Una variable vijσ para cada 0 ≤ i ≤ Q, −Q ≤ j ≤ Q y σ ∈ A..

- Una variable wijn para cada 0 ≤ i ≤ Q, −Q ≤ j ≤ Q y − 1 ≤ n ≤ N.

Construimos ahora Z(x), que va a contener las siguientes cláusulas:

- Vij := {vijσ | σ ∈ A} para cada 0 ≤ i ≤ Q, −Q ≤ j ≤ Q.

- Vijστ := {vijσ , vijτ } para cada 0 ≤ i ≤ Q, −Q ≤ j ≤ Q y σ, τ ∈ A con σ 6= τ.

- Wi := {wijn | −Q ≤ j ≤ Q, −1 ≤ n ≤ N } para 0 ≤ i ≤ Q.

- Wijnj 0 n0 := {wijn , wij 0 n0 } para 0 ≤ i ≤ Q, −Q ≤ j, j 0 ≤ Q y −1 ≤ n, n0 ≤ N con


(j, n) 6= (j 0 , n0 ).

A partir de aquı́, las cláusulas de Z(x) las distinguiremos en función de la ejecución del
algoritmo φ, computación que explicaremos más adelante:

Cláusulas de comienzo de algoritmo:

- {v0,j,xj } para 1 ≤ j ≤ size(x);

- {v0,size(x)+1,# };

- {v0,size(x)+1+j,0 , v0,size(x)+1+j,1 } para 1 ≤ j ≤ bp(size(x))c

- {v0,j,t } para −Q ≤ j ≤ 0 y size(x) + 2 + bp(size(x))c ≤ Q.

- {w010 }

Cláusulas en un paso intermedio:


44 CAPÍTULO 5. TSP ES NP-DURO

- {vijσ , wijn , vi+1,j,τ } para 0 ≤ i ≤ Q, σ ∈ A, −Q ≤ j ≤ Q, 0 ≤ n ≤ N ;

- {vijσ , wijn , wi+1,j+δ,m } para 0 ≤ i ≤ Q, σ ∈ A, −Q ≤ j ≤ Q, 0 ≤ n ≤ N ; donde τ, m y δ


se obtienen en función de n y de σ como φ(n, σ) = (m, τ, δ).

Cláusulas al alcanzar n = −1.

- {wi,j,−1 , wi+1,j,−1 } para 0 ≤ i ≤ Q, σ ∈ A, −Q ≤ j ≤ Q.

- {wi,j,−1 , vi,j,σ , vi+1,j,σ } para 0 ≤ i ≤ Q, σ ∈ A, −Q ≤ j ≤ Q.

Cláusulas para posiciones que nunca son escaneadas y que no cambian de valor.

- {vijσ , wij 0 n , vi+1,j,σ } para 0 ≤ i ≤ Q, σ ∈ A, −1 ≤ n ≤ N y −Q ≤ j, j 0 ≤ Q con j 6= j 0

Cláusulas que indican la salida (Output) del algoritmo.

- {vQ,1,1 }, {vQ,2,t }

Como podemos observar, la longitud de codificación de Z(x) es de orden O(Q3 log Q), pues
el número de literales de Z(x) es una O(Q3 ) 1 , cuyos ı́ndices requieren O(log Q) de espacio.
Ahora, lo que tenemos que demostrar para nuestro conjunto Z(x) es que se cumple:

Z(x) satisfactible ⇔ x ∈ Y.
Veamos ⇐c:
Supongamos que x ∈ Y , entonces sea c un certificado para x que cumple Output(φ, x#c) = 1.
Lo que debemos demostrar es que existe una correspondencia de verdad que satisfaga todas las
cláusulas de Z(x). Sea φ(i) = (n(i) , s(i) , π (i) )i=0,1,...,m : la computación de φ con entrada x#c.
Vamos a definir la correspondencia de verdad T siguiendo la idea que hemos utilizado para
construir Z(x) desde los valores de φ(i) :
 (i)
T (vijσ ) = true si y sólo si sj = σ

T (wijn ) = true si y sólo si π (i) = j y n(i) = n

T (vijσ ) = T (vi−1,j,σ ), T (wijn ) = T (wi−1jn ) para i = m + 1, . . . , Q. ∀j, n, σ

La primera nos dice que vijσ es cierta, si en el tiempo i (después de i computaciones), en la


posición j de la cinta, encontramos el sı́mbolo σ.
La segunda implica que wijn es cierta, sólo si en el tiempo i, se escanea la posición j de la
cinta y se computa la instrucción n.
La tercera nos muestra, que una vez llegada a la instrucción de parada, la cinta no cambia,
y la cabeza se queda en la posición en la que se encontraba.
Veamos ahora que esta correspondencia de verdad definida, satisface todas y cada una de
las cláusulas definidas en Z(x).
Los primeros dos conjuntos de cláusulas Vij y Vijστ condicionan que en cada posición de la
cadena puede haber uno y sólamente un sı́mbolo. Comprobemos que son ciertos bajo T .
1 Para obtener este valor, hay que coger cada uno de los conjuntos definidos arriba y ver en cada caso, cuantos

conjuntos de literales se crean, por ejemplo, en el caso: Wijnj 0 n0 , podemos encontrar O(Q3 ) valores distintos ya
que 1 ≤ i ≤ Q, − Q ≤ j, j 0 ≤ Q. Notar, que Q es un polinomio del tamaño de x y el número de elementos de
A y N (número de instrucciones) es una cantidad finita que depende del algoritmo φ pero es independiente de
la entrada x.
5.3. EL TEOREMA DE COOK 45

Vij contiene para cada i, j todas las posibles σ ∈ A. Como en cada posición j de la cinta
para cada instante, siempre va a haber un elemento σ ∈ A, luego entonces uno de los
elementos de ese conjunto será true para T , y por tanto el conjunto es satisfactible.

Vijστ es siempre verdadera pues al menos una de las dos variables vijσ o vijτ es siempre
falsa bajo T .

Los siguientes dos conjuntos de cláusulas: Wi y Wijnj 0 n0 indican que en cada instante se
ejecuta una y sólamente una instrucción y se escanea sólo una posición. Veamos que también
se satisfacen:

En cada conjunto Wi habrá por tanto un elemento verdadero.

En el conjunto Wijnj 0 n0 , una de las dos siempre será falsa bajo T pues no podemos tener
en un mismo instante la cabeza en dos posiciones distintas j, j 0 , y si j = j 0 entonces no
podemos ejecutar en un mismo instante dos instrucciones diferentes.

Las cláusulas de comienzo del algoritmo también se satisfacen todas para T , ya que están
modelizando que en un primer instante, sólo introducimos x#c en la cinta, empezando desde la
posición j = 1 hasta j = size(x) + 1 + bp(size(x))c tamaño de x#c. Las dos últimas cláusulas
indican que en el resto de espacios libres entre [−Q, Q], cotas del tamaño máximo de la compu-
tación, introducimos t y que la instrucción que ejecutaremos en el paso 1 será la instrucción
n = 0, estando en la posición j = 1.

Las cláusulas que modelan un paso intermedio, también son ciertas con esta correspondencia
y están basadas en la idea de que en un instante i, en una posición j en la que encontramos el
elemento σ, ejecutamos φ(n, σ) = (m, τ, δ). Es decir, obtenemos una nueva instrucción m, un
elemento τ a introducir en la posición j y δ ∈ {−1, 0, 1} nos indica la posición j + δ siguiente.
A continuación mostramos como en cada una de las cláusulas aquı́ definidas hay un elemento
verdadero.

- {vijσ , wijn , vi+1,j,τ } para 0 ≤ i ≤ Q, σ ∈ A, −Q ≤ j ≤ Q, 0 ≤ n ≤ N .


Una de las tres es siempre verdadera: para demostrarlo, supondremos que los dos prime-
ros literales son falsos y deduciremos que el tercero tiene que ser verdadero. Veámoslo:
supongamos que los dos primeros literales son falsos, entonces se cumple que vijσ = true
y wijn = true luego, como φ(n, σ) = (m, τ, δ), se cumple vi+1,j,τ = true y la cláusula es
satisfactible.

- {vijσ , wijn , wi+1,j+δ,m } para 0 ≤ i ≤ Q, σ ∈ A, −Q ≤ j ≤ Q, 0 ≤ n ≤ N .


Equivalentemente al caso anterior, supongamos que los dos primeros literales son falsos,
entonces vijσ = true y wijn = true. Entonces wi+1,j+δ,m = true y la cláusula es satisfac-
tible, pues φ(n, σ) = (m, τ, δ), es decir, en el paso siguiente, estaremos en la posición j + δ
y ejecutaremos la instrucción m.

Las cláusulas que modelizan la parada, son también verdad bajo T :

- {wi,j,−1 , wi+1,j,−1 } para 0 ≤ i ≤ Q, σ ∈ A, −Q ≤ j ≤ Q.


Una de las dos siempre es verdadera, para ello veremos que si el primer literal es falso, el
segundo es cierto. Es decir, si wi,j,−1 = f alse, entonces wi,j,−1 = true, luego estamos en
la instrucción −1, y en el instante siguiente i + 1 seguiremos en la misma posición con la
instrucción −1, luego wi+1,j,−1 = true.
46 CAPÍTULO 5. TSP ES NP-DURO

- {wi,j,−1 , vi,j,σ , vi+1,j,σ } para 0 ≤ i ≤ Q, σ ∈ A, −Q ≤ j ≤ Q. Una de las tres es siempre


verdadera: para demostrarlo, supondremos que los dos primeros literales son falsos y
deduciremos que el tercero tiene que ser verdadero. Veámoslo:
Si wi,j,−1 = f alse y vi,j,σ = f alse entonces wi,j,−1 = true y vi,j,σ = true. Por tanto, para
tiempo i la instrucción es n = −1 y en la posición j encontramos σ. En consecuencia, en
el tiempo i + 1 sigue estando σ en esta posición, es decir, vi+1,j,σ = true.

Nos quedan de ver que las cláusulas que modelizan las posiciones que nunca son escaneadas
son también verdaderas bajo T :

- {vijσ , wij 0 n , vi+1,j,σ } para 0 ≤ i ≤ Q, σ ∈ A, −1 ≤ n ≤ N y −Q ≤ j, j 0 ≤ Q con j 6= j 0 .


Veamos que si los dos primeros literales son falsos, el tercero es verdadero:
Si vijσ = f alse, wij 0 n = f alse entonces vijσ = true, luego en la posición j en el instante i
esta σ y como la cabecera está en la posición j 0 pues wij 0 n = true, entonces en j seguirá σ
en el siguiente paso, es decir, vi+1,j,σ = true

Para terminar, nos queda ver que {vQ,1,1 }, {vQ,2,t } son siempre verdaderas. Esto se cumple
porque estamos modelando una sı́-instancia, luego la salida tiene que ser 1.
Hemos encontrado por lo tanto una correspondencia de verdad T para la cual Z(x) se sa-
tisface.

Veamos ⇒c:
Sea ahora Z(x) satisfactible, entonces existe T correspondencia de verdad, que satisface
todas sus cláusulas. Tenemos que ver por tanto que existe un certificado c ∈ {0, 1}bp(size(x))c
tal que Output(φ, x#c) = 1 y vamos a definirlo usando esa correspondencia T . Notemos que T
satisface en concreto las cláusulas:

{v0,size(x)+1+j,0 , v0,size(x)+1+j,1 } para 1 ≤ j ≤ bp(size(x))c.

luego o bien T (v0,size(x)+1+j,1 ) = true, en este caso definiremos cj = 1 o bien T (v0,size(x)+1+j,0 ) =


true, entonces pondremos cj = 0.
Por la construcción de Z(x), cada una de las cláusulas de Z(x), todas ciertas bajo T , reflejan
la computación de φ con entrada x#c.
En efecto, que T satisfaga las primeras cláusulas (Vij , Vijστ ) implica que para cada i, para
cada j, existe uno y sólamente un elemento σ ∈ A tal que T (vijσ ) = true. En el futuro nos
referiremos a ella como condición (A).
Análogamente, que T (Wi ) = true, T (Wijnj 0 n0 ) = true implica que para cada i, existen úni-
cos valores j ∈ [−Q, Q] y n ∈ [−1, N ] tal que wijn = true. Esta será la denominada condición
(B).

Con estas condiciones y el significado del resto de cláusulas, vamos a intentar ver que en
realidad la correspondencia T que satisface Z(x) significa que:

I) T (vijσ ) = true ⇔ al ejecutar φ(x#c): en el tiempo i, en la posición j de la cinta, encon-


traremos el sı́mbolo σ.

II) T (wijn ) = true ⇔ en el paso i de la ejecución de φ(x#c), la cabeza lectora está en la


posición j y ejecutará la instrucción n.

Notemos que si se cumple la implicación a izquierda ⇐c en I), entonces también se cumple


su implicación a derecha ⇒c. En efecto, si no se cumple la parte derecha, es decir, al ejecutar
5.3. EL TEOREMA DE COOK 47

φ(x#c), en el tiempo i, en la posición j de la cinta encontramos un elemento α 6= τ , entonces


por la implicación a izquierda obtenemos que T (vijα ) = true y por la condición (A): T (vijτ ) =
f alse.
Ocurre lo mismo para II), ya que si no se cumple la parte derecha, es decir, en la computación
de φ(x#c), en el paso i o bien la cabeza lectora está en j 0 6= j o bien la cabeza esta en j pero
ejecuta una instrucción n0 6= n. Veamos entonces la parte de la izquierda tampoco se cumple;
en el primer caso existirá una instrucción n0 tal que por la implicación a izquierda obtenemos
que T (wij 0 n0 ) = true, luego por la condición (B), T (wijn ) = f alse y en el segundo caso por la
implicación a izquierda deducimos que T (wijn0 ) = true y entonces T (wijn ) = f alse.
Visto esto será suficiente demostrar para I) y II) las implicaciones ⇐c en los tres casos en
los que puede encontrarse la ejecución del algoritmo: En el comienzo, cuando está en ejecución
y cuando ha llegado a la instrucción de parada.

En el comienzo del algoritmo, es decir, cuando i = 0: por la condición (A) y la cláusula


{v0,j,xj } se concluye que T (vo,j,σ ) = true sólamente si σ = xj para 1 ≤ j ≤ size(x). Como al
comenzar la ejecución en la cinta de una máquina de Turing nos encontramos siempre la entrada
x#c, entonces deducimos que T (vo,j,xj ) = true implica que en la posición j, encontramos el
elemento xj . Llegamos a la misma definición de T para el resto de elementos al notar que
T (vo,size(x)+1,# ) = true y que en la posición size(x) + 1 está el elemento # y a continuación
c ya definida anteriormente usando T . Otra cláusula corrobora la definición de T para el resto
de posiciones de la cinta donde encontremos el elemento t.
Por la condición (B), como T (w0jn ) = true sólo puede darse para un valor de (j, n) y sabe-
mos que se cumple para j = 1, n = 0, entonces determinamos que T (w010 ) = true implica que
se comienza ejecutando la instrucción n = 0 en la posición j = 1.

Ahora suponemos que I) y II) son ciertos para un paso i distinto del de parada y veamos
que se cumple I) en el paso i + 1. La hipótesis ahora consiste en suponer que al ejecutar φ(x#c)
en el paso i + 1, en la posición j encontramos la letra σ. Distinguimos dos casos:

1. En el paso i, la cabeza no estaba en la posición j (estaba en otra posición j 0 6= j): esto


implica que no se ha cambiado la letra que habı́a en la posición j, es decir, en el paso i,
en la posición j se encontraba σ y por hipótesis T (vijσ ) = true y existirá n instrucción
tal que T (wij 0 n ) = true. Ası́, como la cláusula {vijσ , wij 0 n , vi+1,j,σ } es cierta bajo T y los
dos primeros literales son falsos, se debe cumplir que T (vi+1,j,σ ) = true.

2. En el paso i, la cabeza estaba en la posición j: entonces, sea α la letra que estaba en la po-
sición j para tiempo i y n la instrucción que se ejecutó, sabemos que φ(n, α) = (m, σ, δ).
Por hipótesis, T (vijα ) = true y T (wijn ) = true, luego los dos primeros literales de la
cláusula {vijα , wijn , vi+1,j,σ } son falsos y como la cláusula se satisface bajo T , forzosa-
mente T (vi+1,j,σ ) = true.

Ahora con la misma suposición para un paso i distinto del de parada, veamos que se cumple
II) en el paso i + 1. Suponemos entonces que en el paso i + 1 la cabeza está en la posición j
ejecutando la instrucción n. Tenemos que demostrar que wi+1,j,n = true.
Supongamos que en el paso i la computación ha sido φ(m, α) = (n, σ, δ). Ası́, T (vi,j−δ,α ) =
true y T (wi,j−δ,m ) = true. Entonces por la cláusula de paso intermedio {vi,j−δ,α , wi,j−δ,m , wi+1,j,n }
tenemos que wi+1,j,n = true.
Para terminar, nos queda ver que se cumplen I) y II) cuando en el paso i se ejecuta la ins-
trucción de parada. Esta demostración es análoga al caso anterior tomando para I) las cláusu-
las {vijσ , wi,j 0 ,−1 , vi+1,j,σ } (correspondiente o bien a una cláusula del segundo conjunto de las
48 CAPÍTULO 5. TSP ES NP-DURO

cláusulas de parada o bien a una cláusula de posiciones nunca escaneadas) y para II) una de
las cláusulas de parada de la forma {wi,j,−1 , wi+1,j,−1 }.
Una vez probado I) y II), ya sabemos cómo interpretar T en el desarrollo de la ejecución
de φ y podemos dar significado a las últimas dos cláusulas que se cumplen: {vQ,1,1 }, {vQ,2,t }.
Esto nos indica por tanto, que en el paso i = Q, en la posición j = 1, encontramos el elemento
1, y en la posición siguiente t. Luego Output(φ, x#c) = 1 que es lo que querı́amos ver y nos
permite concluir que x es una sı́-instancia del problema original (x ∈ Y ).

A partir de aquı́, como ya hemos encontrado un problema NP -Completo, es mucho más


sencillo demostrar la NP -Completitud de otro problema P, puesto que sólo debemos comprobar
que P ∈ NP y que SAT ∝ P.

5.3.1. 3-Satisfactibilidad
El problema de la 3-Satisfactibilidad (3-SAT ), es una restricción del problema SAT donde
toda instancia tiene que tener exactamente 3 literales en cada cláusula. Su simplicidad con
respecto al problema SAT lo hace ser muy útil a la hora de comprobar la NP -Completitud de
otros problemas.
Teorema 5.3.2.
El problema de la 3-Satisfactibilidad(3-SAT) es NP-Completo.

Demostración. Veamos primero que es NP: Es fácil ver que en el caso de encontrarnos ante una
sı́-instancia del 3-SAT, podremos comprobarlo fácilmente encontrando una correspondencia de
verdad que satisfaga cada una de las cláusulas de tres literales del problema.
Ahora realizaremos la transformación SAT ∝ 3-SAT.
Sea U = {u1 , u2 , . . . , un } un conjunto de variables y C = {c1 , c2 , . . . , cm } un conjunto de
cláusulas instancia arbitraria de SAT . Vamos a construir un conjunto de cláusulas de tres
literales C 0 sobre un conjunto de variables U 0 tal que C 0 sea satisfactible sı́ y sólo si C lo es.
Sea cj ∈ C, construiremos un conjunto de cláusulas de tres literales Cj0 , basada en las varia-
bles originales U y en un conjunto de variables adicionales Uj0 , cuyos literales sólo aparecerán
en las cláusulas de Cj0 . Juntando todos estos conjuntos, obtendremos:

m
[ 
U0 = U ∪ Uj0
j=1

y
m
[
C0 = Cj0 .
j=1

Construcción de Cj0 , Uj0 :


Sea cj = {z1 , z2 , . . . , zk } cláusula, con zi literales sobre U . Distinguimos varios casos en
función del valor k:

Caso 1. k = 1
Uj0 = {yj1 , yj2 }

Cj0 = {{z1 , yj1 , yj2 }, {z1 , yj1 , yj2 }, {z1 , yj1 , yj2 }, {z1 , yj1 , yj2 }}
5.3. EL TEOREMA DE COOK 49

Caso 2. k = 2
Uj0 = {yj1 }

Cj0 = {{z1 , z2 , yj1 }{z1 , z2 , yj1 }}

Caso 3. k = 3
Uj0 = ∅, Cj0 = {cj }

Caso 4. k > 3
Uj0 = {yji | 1 ≤ i ≤ k − 3}

Cj0 = {{z1 , z2 , yj1 }} ∪ {{yji , zi+2 , yji+1 | 1 ≤ i ≤ k − 4}} ∪ {{yjk−3 , zk−1 , zk }}

Veamos ahora para terminar que efectivamente:

C 0 es satisfactible ⇔ C es satisfactible

⇐c Sea T : U → {true, f alse} una correspondencia de verdad que satisface C. Vamos a


extender T a T 0 : U 0 → {true, f alse} tal que satisfaga C 0 . Como U 0 − U está dividida en
conjuntos Uj0 , y además las variables de cada uno de estos conjuntos, sólo aparecen en su
respectivo Cj0 , vamos a extender T a cada uno de los conjuntos Uj0 tal que se verifiquen las
cláusulas en su correspondiente Cj0 . Distinguimos 3 casos en función de como fue construido Uj0 :

1. Uj0 construido según Caso 1 o Caso 2: Como T (z1 ) = T (z2 ) = true, y toda cláusula
contiene a z1 o a z2 , podemos definir T 0 de cualquier modo para literales en U 0 − U . Sin
perdida de generalidad, podemos entonces asumir T 0 (y) = true, ∀y ∈ Uj0

2. Uj0 construido según Caso 3: La cláusula ya es satisfecha por T y Uj0 = ∅.

3. Uj0 construido según Caso 4: Aquı́ cj = {z1 , z2 , . . . , zk } con k > 3. Como es sastisfactible,
entonces existe l ∈ {1, . . . , k} tal que T (zl ) = true.

l ∈ {1, 2}, entonces T 0 (yji ) = f alse ∀1 ≤ i ≤ k − 3.


l ∈ {k − 1, k}, entonces T 0 (yki ) = true ∀1 ≤ i ≤ k − 3.
Resto de casos, entonces T 0 (yji ) = true ∀1 ≤ i ≤ l − 2 y T 0 (yji ) = f alse ∀l − 1 ≤
i ≤ k − 3.

Es sencillo observar, que con esta definición de T 0 , se satisfacen todas las cláusulas de Cj ‘en
cualquiera de los tres casos.

⇒c
Por otro lado, si T 0 es una correspondencia de verdad de C 0 , se verifica que T = T 0 |U satis-
face C.

Veamos por último que se puede realizar en tiempo polinómico:


Para ello, es necesario observar, que el número de cláusulas de 3 literales en C 0 , esta acotado
por mn,es decir, el número de cláusulas de C 0 es proporcional al numero de cláusulas y literales
de C, por ello,la transformación desde C hasta C 0 ,va a ser un proceso que se podrá realizar
en tiempo polinómico, luego el algoritmo visto anteriormente transforma polinómicamente una
instancia SAT en una 3 − SAT .
50 CAPÍTULO 5. TSP ES NP-DURO

Vamos a utilizar el problema 3 − SAT , para demostrar que el problema de los circuitos
hamiltonianos es también NP -Completo.

Nota 5.3.1. Recordemos que el problema de los circuitos hamiltonianos trata de decidir si
podemos encontrar algún circuito hamiltoniano en un grafo no dirigido.
Teorema 5.3.3.
El problema del circuito hamiltoniano es NP-Completo.2

Demostración. Ya hemos visto en la Proposición 5.2.1 anteriormente, que el problema del cir-
cuito hamiltoniano es NP. Ahora vamos a ver que 3-SAT se transforma polinómicamente en
este problema.
Dada una colección de cláusulas de tres literales Z = {Z1 , . . . , Zm } sobre un conjunto de
variables U = {u1 , . . . , un }, vamos a construir un grafo G que cumpla que: G contiene un
circuito hamiltoniano si y sólo si Z es satisfactible.
Para ello vamos a definir dos estructuras que nos permitirán crear el grafo.
Consideramos el grafo de la Figura 5.2(a). Suponemos que es un subgrafo de G al que
llamaremos A y ningún vértice de A excepto u, u0 , v, v 0 incide con otra arista de G. Entonces,
cualquier circuito hamiltoniano de G debe atravesar A de una de las dos formas que vemos en
la Figura 5.2 (b),(c).

(a) (b) (c) (d)

Figura 5.2: Estructura A.

Sean ahora dos aristas u − u0 , v − v 0 , diremos que las unimos mediante A, cuando creamos
entre ellas la estructura de la Figura 5.2(a) (es decir añadimos todos los puntos intermedios y
los unimos de esta forma).
Por simplificar el resultado final, vamos a describir la unión de dos aristas mediante A como
en la Figura 5.2(d). La importancia de estas estructuras, es que si en un grafo encontramos una
estructura de tipo A, cualquier ciclo hamiltoniano del grafo debe contener exactamente una de
las aristas u − u0 o v − v 0 .
Ahora consideramos también el grafo B de la Figura 5.3(a). Asumimos que es también un
subgrafo de G y que los únicos vértices incidentes con otras aristas de G son u, u0 . Entonces,
ningún circuito hamiltoniano de G atraviesa a las tres aristas {e1 , e2 , e3 }, es más, se observa que
para cualquier S ⊂ {e1 , e2 , e3 }, hay un camino hamiltoniano desde u a u0 en B, que contiene a
S pero no a {e1 , e2 , e3 } \ S. Vamos a representar B, con el sı́mbolo de la Figura 5.3(b).
2 Richard M. Karp fue el primero que mostró en 1972 que el Problema del Ciclo de Hamilton era un problema

NP -Completo, lo cual, como veremos más adelante implica que el TSP sea un problema NP -Duro.
15.5
15.5 Some
Some Basic
Basic NP
NP-Complete
-Complete Problems
Problems 361
361

We
We first
first define
define two
two gadgets
gadgets which
which will
will appear
appear several
several times in G.
times in G. Consider
Consider thethe
graph
graph shown
shown inin Figure
Figure 15.2(a),
15.2(a), which
which we call A.
we call A. We
We assume
assume that
that itit is
is aa subgraph
subgraph
of G
of G and
and no
no vertex of AA except
vertex of except u,u,uu,,v,
v,vv is
is incident
incident to
to any
any other
other edge edge ofof G.
G.
Then
Then any
any Hamiltonian
Hamiltonian circuit of G
circuit of G must traverse AA in
must traverse in one
one of
of the
the waysways shown
shown
in
in Figure
Figure 15.3(a)
15.3(a) and
and (b).
(b). So
So we
we can replace AA by
can replace by two
two edges
edges with
with thethe additional
additional
of GG must
5.3. EL TEOREMA restriction
restriction that
DE COOK that any
any Hamiltonian
Hamiltonian circuit
circuit of must contain
contain exactly
exactly one one ofof them
them
51
(Figure
(Figure 15.2(b)).
15.2(b)).

(a)
(a) (b)
(b)
uu uu

ee11

ee22 BB

ee33

uu uu
(a) (b)
Fig.
Fig. 15.4.
15.4.

Now
Now consider
consider the graph Figura
the graph shown 5.3:
BB shown in
in Figure
Figure 15.4(a).
15.4(a). We We assumeassume that that itit is
is aa
subgraph
subgraph of of G,
G, andand no no vertex
vertex of of BB exceptexcept uu and and uu is
is incident
incident to to any
any other
other edge
edge
of G.
of G. Then
Then no no Hamiltonian
Hamiltonian circuit circuit of of G G traverses
traverses all all ofof ee11,, ee22,, ee33.. Moreover,
Moreover, one one
Con estas dos estructuras
easily checks ya
easily checks that podemos
that for
for any any SS ⊂ ⊂ {e construir
{e 11,, ee22,, ee33}} there
thereGisisdesde
aa Hamiltonian
HamiltonianZ. Para path
path fromcada
from tocláusula Zi , i =
uu to
1, . . . , m, pondremos uuuna
in BB copia
in that
that contains de SB
contains buttras
S but none
none of otra
of {e {e11,, eeen ,,
22 33e
e una
}
} \
\ S.
S. Wemisma
We represent
represent columna,
BB by
by the
the y
symbol
symbol en una columna
paralela, uniremos con shown
shown in
in Figure
la primera Figure 15.4(b).
15.4(b).
y última copia de B,una sucesión de vértices, dos por cada
We
We are are nownow able able to construct G.
to construct G. For For eacheach clause,
clause, we we introduce
introduce aa copy copy of of
variable uj (j = 1, . . . ,B,n)joined
B, que one
joined existan
one after
after another. en lasBetween
another. cláusulas.
Between the
the firstfirstEstos
and thevértices
and the last
last copy
copy of están
of B,
B, weweainsert
su vez unidos entre
insert
ellos. La arista que une twolos
two dos for
vertices
vertices vértices
for each
each variable, que corresponden
variable, all
all joined
joined one afteraanother.
one after cada variable
another. We
We then then doubleuj , the
double la
the vamos a doblar,
para representar a uj edgesyedges
a ubetween
between the the two two vertices
vertices of of each variable x;
each variable x; these
these two two edges edges will
will cor-
cor-
j . Ahora en cada copia de B, unimos mediante copias de A, las aristas
respond
respond to to xx andand x, x, respectively.
respectively. The The edges edges ee11,, ee22,, ee33 in
in each
each copy copy of of BB areare
e1 , e2 , e3 con el primer, nowsegundo
now connected
connected via y tercer
via aa copy
copy of literal
of AA to to thethedefirst, la second,
first, cláusula
second, thirdcorrespondiente,
third literal
literal of of the corre- representados
the corre-
mediante las aristas desdobladas
sponding
sponding clause. clause.descritas
This
This construction anteriormente
construction is
is illustrated
illustrated by para
by Figure
Figure cada
15.5
15.5 with variable
with the (notar que entonces
the example
example
{{x
cualquier ciclo hamiltoniano{{x11,, xx22,, xx33},
},de
{x
{x11,G,
, xx22,, xxdebe
33},
},{x
{x11,,de
xx22,, xxcontener
33}}.
}}. Note
Note that thatoan
anbien
edge
edge representing
representing
a ei o bien aa literal
literal
al can can
literal relacionado
take
take part
part in in more
more than than one one copy
copy of of A; A; these
these are are then
then arranged
arranged in in series.
series.
mediante A con esa arista). Now
Now we Se observa
we claim
claim that that G además
G isis Hamiltonian que
Hamiltonian ifif and la arista
only ifif Z
and only correspondiente
Z isis satisfiable.
satisfiable. Let Let C C beabe un literal puede
formar parte de más de una copia
aa Hamiltonian
Hamiltonian circuit.
circuit.de We A.define
We define aa truth truth assignment
assignment by by setting
setting aa literal
literal true iff C
true iff C
Antes de continuar, contains
contains
vamos the
the a corresponding
corresponding
ver un ejemplo edge.
edge. By Byilustrativo
the
the properties
properties of of the
de the gadgets AA and
gadgets
construcción and BBde each
each
este grafo a partir
clause
clause contains
contains aa literal literal thatthat isis true.
true.
de un conjunto de cláusulas concreto. Sea U = {{x1 , x2 , x3 }, {x1 , x2 , x3 }, {x1 , x2 , x3 }}, entonces
362
el 15. NP -Completeness
grafo de la figura 5.4(a), es el correspondiente para U .

B A

B A

B A

(a) (b)
Fig. 15.5.

Figura 5.4: Grafo del ejemplo completo


Conversely, any satisfying truth assignment defines a set of edges correspond-
ing to literals that are true. Since each clause contains a literal that is true this set
of edges can be completed to a tour in G. 2
This proof is essentially due to Papadimitriou and Steiglitz [1982]. The problem
of deciding whether a given graph contains a Hamiltonian path is also NP-complete
(Exercise 14(a)). Moreover, one can easily transform the undirected versions to
the directed Hamiltonian circuit or Hamiltonian path problem by replacing each
undirected edge by a pair of oppositely directed edges. Thus the directed versions
are also NP-complete.
There is another fundamental NP-complete problem:
52 CAPÍTULO 5. TSP ES NP-DURO

En la Figura 5.4(b) podemos ver expandida la primera estructura de tipo B y A que aparece
en el ejemplo anterior, para entender mejor lo que estamos intentando representar.
Cada una de las estructuras de tipo A de la Figura 5.4(a) se representarı́a de esta manera,
teniendo en cuenta que si hay dos cláusulas que contienen el mismo literal, en la arista corres-
pondiente a ese literal, aparecerán puntos intermedios independientes para cada una de las dos
estructuras A.
Veamos ahora que:
G es hamiltoniano ⇔ Z es satisfactible
⇒c
Sea C un circuito hamiltoniano, definimos una correspondencia de verdad T que verifı́que
que T (x) = true, x literal sı́ y sólo si C contiene a la arista correspondiente. Por la propiedad de
B, un ciclo hamiltoniano no puede tener a la vez a las aristas e1 , e2 , e3 correspondientes a una
misma cláusula y por la propiedad de A, si el ciclo hamiltoniano no contiene a uno de esas tres
aristas, entonces contiene a la arista correspondiente al literal unido mediante A, luego toda
cláusula contiene un literal tal que la arista correspondiente a ese literal, pertenece al ciclo.
⇐c
Por otro lado, si Z es satisfactible, entonces cualquier correspondencia de verdad que satis-
faga Z, define un conjunto de aristas que corresponden a los literales que son verdad. Como
cada cláusula, contiene al menos un literal cierto (pues Z es satisfactible), entonces este con-
junto de aristas, puede ser completado hasta un ciclo en G, usando la construcción explicada
anteriormente.

5.4. NP-Duro
Ahora vamos a extender los resultados obtenidos para los problemas de decisión a los lla-
mados problemas de optimización.

Definición 5.4.1. Un problema de optimización discreto es un cuádruple P = (X, (Sx )x∈X , c, m)


donde:
3
X es un lenguaje sobre {0, 1} decidible en tiempo polinómico.

Sx es un subconjunto de {0, 1}∗ para cada x ∈ X: existe un polinomio p con size(y) ≤


p(size(x)) para todo y ∈ Sx , x ∈ x. Además los lenguajes {(x, y) | x ∈ X, y ∈ Sx } y
{x ∈ X | Sx = ∅} son decisibles en tiempo polinómico.

c : {(x, y) | x ∈ X, y ∈ Sx } → Q es computable en tiempo polinómico.

m ∈ {mı́n, máx}.

Los elementos de X, se conocen como instancias de P, y para cada instancia x ∈ X, Sx son


las llamadas soluciones factibles de X. OP T (x) := m{c(x, y) | y ∈ Sx }. Una solución óptima de
x, es una solución factible y ∈ Sx con c(x, y) = OP T (x).
Un algoritmo para un problema de optimización P = (X, (Sx )x∈X , c, m), es un algoritmo
A, que para cada x ∈ X con Sx 6= ∅, computa una solución factible y ∈ Sx . A veces escribimos
A(x) := c(x, y). Si A(x) = OP T (x) para todo x ∈ X con Sx 6= ∅, entonces A es un algoritmo
exacto.
3 Decimos que un lenguaje X es decisible en tiempo polinómico, si para toda f : X → {0, 1}, existe una

máquina de Turing polinómica que la compute.


5.4. NP-DURO 53

Definición 5.4.2. Un problema de optimización, o un problema de decisión P se llama NP -


Duro, si todos los problemas en NP, reducen polinomialmente a P.

Nota 5.4.1. En este caso, no hemos obligado, a que el problema sea un problema NP, como en
el caso de NP -Completo, además incluye no sólo a los problemas de decisión, sino también a
los de optimización. Muchas veces, cuando hablamos de un problema NP -Duro se suele decir
informalmente, que es al menos tan difı́cil como cualquier problema de decisión NP -Completo.
Teorema 5.4.1.
El problema del viajante de comercio (T SP ), es NP-Duro.
Demostración. Para ello, vamos a demostrar que el problema de decisión de circuitos Hami-
litotianos (HCP) se transforma polinómicamente en el (TSP). Para ello, debemos encontrar
una función f que a cada instancia de HCP le corresponda una del TSP y que satisfaga las
propiedades de transformación polinómica.
Sea G = (V, E) instancia del HCP con |V | = m. Su instancia correspondiente en el TSP
tiene un conjunto C de ciudades idéntico a V y para cada dos ciudades vi , vj ∈ C definimos

d(vi , vj ) = 1 si vi , vj ∈ E

d(vi , vj ) = 2 en otro caso


La longitud máxima de recorrido entre ciudades es B = m. Veamos ahora que f es computable
en tiempo polinómico: En efecto, ya que para cada una de las m(m − 1)/2 distancias d(vi , vj ),
sólamente es necesario examinar G para ver si vi , vj ∈ E. La segunda condición se reduce a
demostrar:

G contiene un ciclo hamiltoniano ⇔ hay un tour que pasa por todas las ciudades de f (G)
cuyo recorrido no es mayor que B.
Veamos primero ⇒c
Sea hv1 , v2 , . . . , vm i un circuito hamiltoniano de G. Entonces v1 , v2 , . . . , vm es también un
tour en f (G) de longitud m = B pues cada una de las aristas visitadas, es un elemento de E y
por eso tienen longitud 1.
Veamos ahora ⇐c
Sea ahora hv1 , v2 , . . . , vm i tour en f (G) con longitud total menor que B. Como las distancias
entre las ciudades son o bien 1, o bien 2, y se recorren en total m ciudades (m sumandos),
entonces la distancia entre las ciudades visitas es exactamente 1, es decir, por definición de f ,
{vi , vi+1 }, {vm , v1 } ∈ E ∀ i = 1, . . . , m − 1, luego < v1 , v2 , . . . , vm > un circuito hamiltotiano
de G.
54 CAPÍTULO 5. TSP ES NP-DURO
Bibliografı́a

[1] R. Bellman, Dynamic Programming. Princeton University Press, Princeton, New Jersey,
USA (1957).

[2] A. Calvo, Cooperación en los problemas del viajante (TSP) y de rutas de vehı́culos (VRP):
una panorámica. Universidad de Vigo (2011).

[3] CEOE, Confederación Española de Organizaciones Empresariales, Memorándum: El sector


del transporte y la logı́stica en España (2013).

[4] N. Christofides, Worst-Case Analysis of a New Heuristic for the Travelling Salesman Pro-
blem, Carnegie-Mellon University Management Sciences Research Report 388, Pittsburgh,
Pa., February 1976.

[5] S.A. Cook, The complexity of theorem-proving procedures. ACM Press, New York, USA.
151–158 (1971).

[6] G.B. Dantzig, D.R. Fulkerson, S.M. Johnson, Solution of a Large-Scale Traveling-Salesman
Problem, Operations Research 2 (1954) 393–410.

[7] J. Edmonds, Paths, trees and flowers. Canadian Journal of Mathematics 17, 449–467
(1965).

[8] M.M. Flood, Merrill Flood (with Albert Tucker), Interview of Merrill Flood in San Fran-
cisco on 14 May 1984., The princeton Mathematics Community in the 1930s, Transcript
number 11 (PMC11).

[9] M.M. Flood, The traveling-salesman problem. Operations Research (1956).

[10] M.R. Garey, D.S. Johnson, Computers and Intractability. A Guide to the Theory of NP-
Completeness. W.H. Freeman and Company (1979).

[11] R.E. Gomory, Outline of an Algorithm for Integer Solutions to Linear Programs, Bulletin
Of the American Mathematical Society 64, 275—278 (1958).

[12] G. Gutin, A.P. Punnen (Eds.), The Traveling Salesman Problem and its Variations., Sprin-
ger, Combinatorial Optimization, Vol. 12 (2007).

[13] M.Held, R.M. Karp, A dynamic programming approach to sequencing problems. Journal of
the Society of Industrial an Applied Mathematics b10, 196–210 (1962).

[14] B. Korte, J. Vygen, Combinatorial Optimization. Theory and Algorithms. Fifth edition,
Springer (2011).

55
56 BIBLIOGRAFÍA

[15] H.W. Kuhn, The Hungarian Method for the assignment problem, Naval Research Logistic
Quarterly, 2:83-97, (1955).
[16] A.H. Land, A.G. Doig, An Automatic Method of Solving Discrete Programming Problems.
Econometrica, Vol. 28, No. 3. pp. 497–520 (1960).
[17] J.D.C. Little, K.G. Murty, D.W. Sweeney, and C. Karel, An algorithm for the traveling
salesman problem, Operations Research 11, 972–989 (1963).

[18] S.Lin, B.W. Kernighan, An effective heuristic algorithm for the traveling-salesman problem.
Operation Research 21, 498–516 (1973).
[19] M.L. Stockdale, El problema del viajante: un algoritmo heurı́stico y una aplicación. Uni-
versidad de Buenos Aires (2011).

[20] K. Menger, Bericht über ein mathematisches Kolloquium. Monats-hefte für Mathematik
und Physik 38, 17–38 (1931).
[21] B.Fr. Voigt, Der Handlungsreisende – wie er sein soll und was er zu thun hat, um Aufträge
zu erhalten und eines glücklichen Erfolgs in seinen Geschäften gewiß zu sein – von einem
alten Commis-Voyageur, Ilmenau (1832)
[22] W.L. Winston, Investigación de Operaciones. Aplicaciones y algoritmos. Cuarta edición,
Thomson (2005).

También podría gustarte