Barbara Martina RodekerUniversidad Nacional del Centro de la Pcia. de Buenos Aires
El problema del viajanteUna implementación del esquema de
aproximaciónpropuesto por Sanjeev Arora
Formulación del problema
“ Sean N ciudades de un territorio. El objetivo es encontrar un camino que, comenzando y terminando en una ciudad concreta, pase una sola vez por cada una de las ciudades minimizando la distancia recorrida por el viajante “
C2c3
c4
c6
c5
c1
Consideraciones del problema
C2
c1
•Se conocen las ciudades
•Se conoce la distancia entre ellas
•A todo camino se le asocia un costo que es la suma de las distancias recorridas
costoC12
Breve clasificación
Simétricola distancia de A a Bes la misma que de B a A
Asimétricola distancia de A a B no es la misma que de B a A
c1
c2
c3
c4
c1
c2
c3
c4
Casos especialesCasos especiales
Desigualdad TriangularDesigualdad Triangular
TSP EuclídeoTSP Euclídeo(PTAS (PTAS
Arora)Arora)
AA
BB
CC
d(a,b) <= d(a,c) + d(c,b)
d(a,b) = ( a2 + b2 ) 1/2
Soluciones aproximadas
HEURÍSTICAS
•Soluciones cercanas a la óptima•Obtenidas en menor tiempo•Varían en su distancia al óptimo
Nearest Neighbour GreedyAlgoritmos genéticosAlgoritmos de colonia de hormigasEsquemas de aproximación
Esquemas de aproximación
• Conjunto de algoritmos trabajando juntos• El procesamiento se divide en varias etapas• La salida de una de las etapas sirve de base para la siguiente
Sanjeev Arora
http://www.cs.princeton.edu/~arora/
• Profesor de Cs. De la Computaciónde la Universidad de Princeton
•Trabaja en el área teórica de Cs. De la Computación.
•Sus intereses de investigación incluyen áreas como complejidad computacional, soluciones aproximadas a problemas NP, pruebas probabilísticas.
Pasos del esquema
•PERTURBACIÓN
•QUADTREE
•PORTALIZACIÓN
•PROGRAMACIÓN DINÁMICA
•TRIMMING
Perturbación
• Se realiza una grilla sobre el plano donde están los nodos.•Cada nodo se ubica en el punto más cercano de esa grilla•El objetivo es modificar las coordenadas de los nodos para un posterior procesamiento
• Se seleccionó como modificación del algoritmo original la menor distancia entre nodos en ambos ejes
Regrillado
•Con el objetivo de que la mínima distancia entre nodos sea 2, cada una de las coordenadas de los nodos se multiplica por 2c
Shift de coordenadas
•Corrimiento en una unidad de cada uno de los nodos
•Las coordenadas de los mismos serán impares
•No chocarán con las líneas de división del Quadtree
Complejidad
Leer los nodos desde archivo O ( N ) con N #nodos.Perturbación O ( N ) con N #nodos. Cualquiera de métodos en este paso del algoritmo implica un recorrido de los n nodos de entrada, de
Quadtree
• El plano se va dividiendo en cuatro partes iguales ( Cuadrantes )•Se avanza en la división hasta que dentro de un cuadrante queda solo un nodo ( Hoja )•Así tenemos registradas las hojas donde se ubican los nodos•Esta estructura de datos permite recorrer espacios del plano
Enclosing Box
•Es el cuadrado más pequeño posible, de dimensiones 2K que contenga a todos los nodos
•Desde él se construye el Quadtree
Portalización
• Se necesita que cada cuadrante pueda comunicarse con sus vecinos•Un portal es lo que permite la comunicación•Se ubican en los bordes de los cuadrantes•Son la base para construir la tabla de soluciones
• Originalmente se tomaba un conjunto de m-portales distribuidos uniformemente
Programación dinámicaApareos
Cuadrantes
Subsolución
• Se construye una tabla de tamaño cuadrantes x apareos•Un apareo es una asociación entre dos portales•La solución se construye desde las hojas•Se prosigue de forma bottom-up hasta la raíz
Estructurade las celdas
Complejidad
Número de Cuadrantes = Nc <= 4log2L , con L = largo del
Enclosing Box
Número de Apareos = Na #portales x #portales
Tamaño de la Tabla = Nc x Na
Costo Programación Dinámica O ( Nc x Na x c )
Trimming
• Se reconstruye el camino•Se sigue el camino indicado por la tabla resultado de la programación dinámica•Se van mapeando los nodos encontrados con los nodos originales
Datos útiles• Concorde:
- programa que implementa varias heurísticas - útil para comparaciones de resultados- http://www.tsp.gatech.edu/
•Tiempos de ejecución C++: LARGE_INTEGER frecuencia;
QueryPerformanceFrequency(&frecuencia); unsigned __int64 frec=frecuencia.QuadPart;
LARGE_INTEGER x;LARGE_INTEGER z;
QueryPerformanceCounter(&x); p=new Perturbacion(&archivoOpen,c); QueryPerformanceCounter(&z);
unsigned __int64 dif=z.QuadPart-x.QuadPart; tiempoPert=(long double)dif/(long double)frec;
QueryPerformanceFrequency(LARGE_INTEGER *n)
da como resultado la cantidad de ciclos por segundoa la que funciona el procesador
QueryPerformanceCounter(LARGE_INTEGER *n)
informa la cantidad de ciclos que han transcurrido desde que se inicio el sistema
Más información sobre TSP
http://www.ing.unlp.edu.ar/cetad/mos/TSPBIB_home.html