1 NIVEL 17: ESTRUCTURAS NO LINEALES Recorridos y Algorítmica de Grafos
2 Agenda Recorridos de grafos Recorridos Planos Recorridos en profundidad Recorridos por niveles Recorridos Heurísticos Algorítmica de grafos Camino Hamilton Camino Euler
3 Recorrido de grafos Cómo pasar exactamente una vez por cada uno de los vértices de la estructura? Los grafos se pueden recorrer de diferentes formas con el fin de determinar alguna característica o encontrar alguna información especial.
4 Recorrido de grafos Tipos de recorrido: Plano En profundidad Por niveles En ambas direcciones
5 Recorrido de grafos Recorrido plano Recorrido en profundidad Recorrido por niveles Recorrido en ambas direcciones
6 Agenda Recorridos de grafos Recorridos Planos Recorridos en profundidad Recorridos por niveles Recorridos Heurísticos Algorítmica de grafos Camino Hamilton Camino Euler
7 Recorrido plano El más sencillo Barrido secuencial de los elementos del conjunto V. Permite localizar todos los vértices que cumplan con alguna propiedad, sin tener en cuenta la topología (ignora los arcos).
8 Recorrido plano Cómo se hace en Cupi2Collections? 1. Pedir los elementos (valores) a la tabla de hashing (es una Collection). 2. Recorrerla.
9 Recorrido plano 1. Pedir los elementos (valores) a la tabla de hashing (es una Collection).
10 Recorrido plano 2. Recorrerla.
11 Recorrido plano Ejercicio Retornar todos los sumideros de un grafo dirigido, usando un recorrido plano.
12 Agenda Recorridos de grafos Recorridos Planos Recorridos en profundidad Recorridos por niveles Recorridos Heurísticos Algorítmica de grafos Camino Hamilton Camino Euler
13 Recorrido en profundidad Equivalente a un recorrido en preorden de un árbol n-ario: Primero el vértice Después sus sucesores Verificando en TODO momento que el algoritmo no se quede en ciclos +
14 Recorrido en profundidad Consta de dos rutinas: 1. Rutina 1: Hace un recorrido en profundidad a partir de un vértice dado, marcando los puntos por los cuales va pasando. 2. Rutina 2: Busca vértices sin marcar y lanza la rutina 1. Termina cuando TODOS los vértices hayan sido visitados.
15 Recorrido en profundidad 1 7 5 2 6 3 4 1 Se visita el vértice 1, se marca, se localizan sus sucesores y se hace una llamada recursiva sobre cada uno de ellos, verificando que no estén marcados 1 5 2 6 3 4 1, 7 Se hace el recorrido en profundidad partiendo del vértice 7 (el único sucesor de 1). 7
16 Recorrido en profundidad 1 7 5 2 6 3 4 1, 7, 5 Se hace el recorrido en profundidad a partir del vértice 5. Al terminar TODO este recorrido, se debe comenzar el mismo proceso a partir del vértice 6. Pendiente recorrido desde: 6 1 5 2 3 1, 7, 5, 2 Se repite recursivamente el proceso para los vértices 2 y 6 (sucesores de 5). 7 6 4 Pendiente recorrido desde: 6,6
17 Recorrido en profundidad 1 7 5 2 6 3 4 1, 7, 5, 2, 3 Se recorre en profundidad el grafo a partir del vértice 3 (sucesor de 2). Pendiente recorrido desde: 6,6 1 5 2 3 1, 7, 5, 2, 3, 6 Se repite recursivamente el proceso para los vértices 4 y 6 (sucesores de 3). 7 6 4 Pendiente recorrido desde: 6,6,4
18 Recorrido en profundidad 1 7 5 2 6 3 4 1, 7, 5, 2, 3, 6, 4 Puesto que el vértice 4 no tiene sucesores, se hace un recorrido en profundidad desde el elemento 6 (el último que quedó pendiente en el proceso) Pendiente recorrido desde: 6,6
19 Recorrido en profundidad Se puede observar que el orden de visita de los elementos depende de: El vértice inicial escogido. El orden en el cual se retornen los sucesores de un vértice.
20 Recorrido en profundidad Ejercicio: Dibujar la secuencia de recorrido en profundidad en el siguiente caso: Arrancando en el vértice 3 1 2 3 5 7 6 4
21 Recorrido en profundidad Ejercicio: Escribir el método Iterador<Vertice<K, V, A>> darrecorridoprofundidad( ) que retorna un iterador con los vértices visitados por profundidad. En qué clase(s) va este método?
22 Recorrido en profundidad Clase Grafo Se crea el iterador donde se va a hacer la acumulación de parámetros (recorrido)
23 Recorrido en profundidad Clase Grafo Rutina 2: Busca vértices sin marcar y lanza la rutina 1. Termina cuando TODOS los vértices hayan sido visitados.
24 Recorrido en profundidad Clase Grafo Retorna el iterador lleno.
25 Recorrido en profundidad Clase Vertice El vértice se añade al iterador.
26 Recorrido en profundidad Clase Vertice El vértice se marca
27 Recorrido en profundidad Clase Vertice Recorre todos sus sucesores
28 Recorrido en profundidad Clase Vertice Si el sucesor NO está marcado, lanza recursivamente el recorrido en profundidad a partir del sucesor
29 Agenda Recorridos de grafos Recorridos Planos Recorridos en profundidad Recorridos por niveles Recorridos Heurísticos Algorítmica de grafos Camino Hamilton Camino Euler
30 Recorrido por niveles Similar al proceso correspondiente en un árbol n-ario. Consta de dos rutinas: 1.Rutina 1: Hace un recorrido por niveles a partir de un vértice dado, marcando los puntos por los cuales va pasando. 2.Rutina 2: Busca vértices sin marcar y lanza la rutina 1. Termina cuando TODOS los vértices hayan sido visitados.
31 Recorrido por niveles La lista de elementos para ser recorridos se denomina frente de exploración.
32 1 7 Recorrido por niveles 2 3 5 6 4 Se visita el vértice 1, se marca, se localizan sus sucesores y se incluyen al final del frente de exploración. Recorrido: 1 Frente de Exploración: 7 1 5 2 3 Se toma el primer elemento del frente de exploración (7) y se procesa como en el paso anterior. 7 6 4 Recorrido: 1, 7 Frente de Exploración: 5, 6
33 1 Recorrido por niveles 2 3 5 Recorrido: 1, 7, 5 Frente de Exploración: 6, 2, 6 6 4 7 1 5 2 3 Recorrido: 1, 7, 5, 6 Frente de Exploración: 2, 6, 4 6 4 7
34 1 Recorrido por niveles 2 3 5 Recorrido: 1, 7, 5, 6, 2 Frente de Exploración: 6, 4, 3 6 4 7 1 5 2 3 Recorrido: 1, 7, 5, 6, 2, 4 Frente de Exploración: 3 6 4 7
35 1 Recorrido por niveles 2 3 5 Recorrido: 1, 7, 5, 6, 2 Frente de Exploración: 6, 4, 3 6 4 7 1 5 2 3 Recorrido: 1, 7, 5, 6, 2, 4 Frente de Exploración: 3 6 4 7
36 1 Recorrido por niveles 2 3 5 Recorrido: 1, 7, 5, 6, 2, 3 Frente de Exploración: 7 6 4
37 Recorrido por niveles Ejercicio: Escribir el método Iterador<Vertice<K, V, A>> darrecorridoniveles( ) que retorna un iterador con los vértices visitados por niveles. En qué clase(s) va este método?
38 Recorrido por niveles Clase Vertice Se crea el iterador a retornar con los vértices recorridos por niveles
39 Recorrido por niveles Clase Vertice Se crea una cola para guardar el frente de exploración
40 Recorrido por niveles Clase Vertice Se recorren todos los vértices del grafo
41 Recorrido por niveles Clase Vertice Se verifica que el vértice no esté marcado, es decir que no ha sido visitado
42 Recorrido por niveles Clase Vertice Se inserta el vértice en el frente de exploración
43 Recorrido por niveles Clase Vertice Para cada vértice del frente de exploración
44 Recorrido por niveles Clase Vertice Se toma el vértice
45 Recorrido por niveles Clase Vertice Si no ha sido marcado
46 Recorrido por niveles Clase Vertice Se marca
47 Recorrido por niveles Clase Vertice Se añade al iterador
48 Recorrido por niveles Clase Vertice Cada uno de sus sucesores
49 Recorrido por niveles Clase Vertice Se añade al frente de exploración si no ha sido previamente marcado
50 Recorrido por niveles Clase Vertice Se retorna el iterador
51 Agenda Recorridos de grafos Recorridos Planos Recorridos en profundidad Recorridos por niveles Recorridos Heurísticos Algorítmica de grafos Camino Hamilton Camino Euler
52 Recorridos heurísticos Son informados: Tienen en cuenta alguna característica del mundo en el cual ocurre el problema. El proceso de avance es más inteligente. Dan al algoritmo de búsqueda del camino, una medida de qué tan cerca se encuentra de una solución: En la exploración, dan prioridad a los vértices que tengan más posibilidades de llevar a la respuesta. Se usan como técnicas de inteligencia artificial en juegos, robótica,
53 Recorridos heurísticos El frente de búsqueda se encuentra ordenado de acuerdo con una función h(v): Un vértice tiene un menor valor a medida que se encuentra más cerca de la respuesta. h(v) es una heurística y depende del problema mismo sobre el cual se está trabajando.
54 Ejemplo...... 2 8 3 2 8 3 2 8 3 Recorrido heurístico... 1 6 4 7 5... 1 6 4 7 5 2 8 3 1 4 7 6 5...... 1 6 4 7 5 2 8 2 8 3 2 8 3 1 6 3 1 6 1 6... 7 5 4 7 5 4 7 5 4...... 1 2 3 4 5 6 7 8...
55 Agenda Recorridos de grafos Recorridos Planos Recorridos en profundidad Recorridos por niveles Recorridos Heurísticos Algorítmica de grafos compleja Camino Hamilton Camino Euler
56 Camino Hamilton El camino Hamilton pasa una vez por TODOS los vértices /** * Indica si en el grafo hay camino hamiltoniano * @return true si hay camino hamiltoniano o false en caso contrario */ public boolean haycaminohamilton( ) { } // Recorre todos los vértices del grafo buscando un camino de Hamilton for( Vertice<K, V, A> vertice : vertices.values( ) ) { // Borra todas las marcas presentes en el grafo reiniciarmarcas( ); if( vertice.haycaminohamilton( 0, darorden( ) ) ) return true; } return false;
57 Camino Hamilton /** * Indica si hay un camino de Hamilton que pasa por el vértice actual, * teniendo en cuenta que en dicho camino ya se ha pasado por un cierto * número de vértice (longactual) y que debe pasar por todos lo vértices * del grafo (ordengrafo) * @param longactual Longitud actual del camino * @param ordengrafo Orden del grafo * @return True si existe, False si no */ public boolean haycaminohamilton( int longactual, int ordengrafo ) { longactual++; if( longactual == ordengrafo ) return true; else { marcar( ); for( Arco<K, V, A> arco : darsucesores( ) ) { Vertice<K, V, A> vert = arco.darverticedestino( ); if(!vert.marcado( ) && vert.haycaminohamilton( longactual, ordengrafo ) ) { return true; } } } return false; }
58 Agenda Recorridos de grafos Recorridos Planos Recorridos en profundidad Recorridos por niveles Recorridos Heurísticos Matrices de adyacencias Algorítmica de grafos Camino Hamilton Camino Euler Árboles de recubrimiento
59 Camino Euler El camino Euler pasa una vez por TODOS los arcos