NIVEL 17: ESTRUCTURAS NO LINEALES · Clase Vértice •Problema: ¿Cómo retornar el camino de...

Post on 20-Jul-2020

7 views 0 download

Transcript of NIVEL 17: ESTRUCTURAS NO LINEALES · Clase Vértice •Problema: ¿Cómo retornar el camino de...

ISIS1206 – Estructuras de Datos

http://cupi2.uniandes.edu.co

NIVEL 17: ESTRUCTURAS NO LINEALES

Búsqueda caminos y ciclos

1

ISIS1206 – Estructuras de Datos

http://cupi2.uniandes.edu.co

Agenda

• Caminos en un grafo

• Caminos acíclicos• Caminos con ciclos

• Clase Camino

• Camino entre dos vértices

• Camino más barato entre dos vértices y su costo

• Detección de ciclos

• ¿Hay ciclos desde un vértice?

• ¿El grafo es acíclico?

2

ISIS1206 – Estructuras de Datos

http://cupi2.uniandes.edu.co

Caminos en un grafo acíclico

• ¿Cómo buscar caminos en un grafo dirigido utilizando un planteamiento recursivo?

3

ISIS1206 – Estructuras de Datos

http://cupi2.uniandes.edu.co

Caminos en un grafo acíclico

Verificación de existencia:• Problema: Determinar si existe un camino entre dos vértices v1 y v2 de un grafo

4

Grafo acíclico Grafo con ciclos

ISIS1206 – Estructuras de Datos

http://cupi2.uniandes.edu.co

Caminos en un grafo acíclico

Verificación de existencia:• Problema: Determinar si existe un camino entre dos vértices v1 y v2 de un grafo.

5

Grafo acíclico: No hay riesgo de quedarse haciendo llamadas recursivas.

Se trata como si fuera un árbol n-ario.

Grafo con ciclos

ISIS1206 – Estructuras de Datos

http://cupi2.uniandes.edu.co

Caminos en un grafo acíclico

Verificación de existencia:• Problema: Determinar si existe un camino entre dos vértices v1 y v2 de un grafo

6

Grafo acíclico Grafo con ciclos: Los ciclos pueden generar llamadas recursivas infinitas.

Es necesario recordar los puntos por los cuales ya ha pasado el proceso de búsqueda para evitar hacer de nuevo una llamada recursiva desde ese vértice.

MARCAR

ISIS1206 – Estructuras de Datos

http://cupi2.uniandes.edu.co

Caminos en un grafo acíclico

Formalismo extendido para incluir la noción de vértice marcado

• G = ( V, A, V’ ), V’ V, v V’ si v está marcado

7

v1 v2

V3

v4

v5Marcados

ISIS1206 – Estructuras de Datos

http://cupi2.uniandes.edu.co

Caminos en un grafo acíclicoVerificación de existencia:

8

• Problema: Determinar si existe un camino entre dos vértices v1 y v2 de un grafo acíclico

Grafo acíclico: No hay riesgo de quedarse haciendo llamadas recursivas

Se trata como si fuera un árbol n-ario

ISIS1206 – Estructuras de Datos

http://cupi2.uniandes.edu.co

Caminos en un grafo acíclico

• Verificar si existe un camino a un vértice destino en un grafo acíclico (clase Vértice)

• Salida de la recursión: cuando el vértice actual (origen) coincide con el vértice destino

9

ISIS1206 – Estructuras de Datos

http://cupi2.uniandes.edu.co

Caminos en un grafo acíclico

• Verificar si existe un camino a un vértice destino en un grafo acíclico (clase Vértice)

• Recorre los arcos a sus sucesores

10

ISIS1206 – Estructuras de Datos

http://cupi2.uniandes.edu.co

Caminos en un grafo acíclico

• Verificar si existe un camino a un vértice destino en un grafo acíclico (clase Vértice)

• Obtiene el vértice sucesor

11

ISIS1206 – Estructuras de Datos

http://cupi2.uniandes.edu.co

Caminos en un grafo acíclico

• Verificar si existe un camino a un vértice destino en un grafo acíclico (clase Vértice)

• Verifica si hay camino desde el vértice sucesor hasta el destino final

12

ISIS1206 – Estructuras de Datos

http://cupi2.uniandes.edu.co

Caminos en un grafo acíclico• Verificar si existe un camino a un vértice destino en un grafo

acíclico (clase Vértice)

• Después de haber recorrido todos los sucesores retorna falseindicando que no encontró el camino

13

ISIS1206 – Estructuras de Datos

http://cupi2.uniandes.edu.co

Agenda

• Caminos en un grafo

• Caminos acíclicos

• Caminos con ciclos

• Clase Camino

• Camino entre dos vértices

• Camino más barato entre dos vértices y su costo

• Detección de ciclos

• ¿Hay ciclos desde un vértice?

• ¿El grafo es acíclico?

14

ISIS1206 – Estructuras de Datos

http://cupi2.uniandes.edu.co

Caminos en un grafo con ciclos

• ¿Y si hay ciclos ?

• ¿Hay camino entre V3 y V2 ?

• ¿V3.hayCaminoEnAciclico(v2) ?

15

v1 v2

V3

v4

v5

ISIS1206 – Estructuras de Datos

http://cupi2.uniandes.edu.co

Caminos en un grafo con ciclos

• ¿Hay camino entre V3 y V2 ?

16

v1 v2

V3

v4

v5

ISIS1206 – Estructuras de Datos

http://cupi2.uniandes.edu.co

Caminos en un grafo con ciclos

• ¿Hay camino entre V3 y V2 ?

• RECURSIÓN INFINITA

17

v1 v2

V3

v4

v5

ISIS1206 – Estructuras de Datos

http://cupi2.uniandes.edu.co

Caminos en un grafo con ciclos• ¿Hay camino entre V3 y V2 ?

• SOLUCIÓN: MARCAR

18

v1 v2

V3

v4

v5

ISIS1206 – Estructuras de Datos

http://cupi2.uniandes.edu.co

Caminos en un grafo con ciclos

• Cuando pase por v3 se marca, de forma tal que la siguientevez que se vaya a pasar por ahí, se ignora porque el vérticeya fue visitado

19

v1 v2

V3

v4

v5

ISIS1206 – Estructuras de Datos

http://cupi2.uniandes.edu.co

Caminos en un grafo con ciclos• Verificar si existe un camino a un vértice destino en un grafo con ciclos

(clase Vértice)

• Misma salida de la recursión: cuando el vértice actual (origen) coincide con el vértice destino

20

ISIS1206 – Estructuras de Datos

http://cupi2.uniandes.edu.co

Caminos en un grafo con ciclos• Verificar si existe un camino a un vértice destino en un grafo con ciclos

(clase Vértice)

• Marca el vértice para recordar que ya pasó por ahí

21

ISIS1206 – Estructuras de Datos

http://cupi2.uniandes.edu.co

Caminos en un grafo con ciclos• Verificar si existe un camino a un vértice destino en un grafo con ciclos

(clase Vértice)

• Recorre los arcos a sus sucesores

22

ISIS1206 – Estructuras de Datos

http://cupi2.uniandes.edu.co

Caminos en un grafo con ciclos

• Verificar si existe un camino a un vértice destino en un grafo con ciclos (clase Vértice)

• Obtiene el vértice sucesor

23

ISIS1206 – Estructuras de Datos

http://cupi2.uniandes.edu.co

Caminos en un grafo con ciclos• Verificar si existe un camino a un vértice destino en un grafo con

ciclos (clase Vértice)

1. Que el vértice sucesor no haya sido visitado previamente

2. Que haya camino desde el vértice sucesor hasta el destino final

24

ISIS1206 – Estructuras de Datos

http://cupi2.uniandes.edu.co

Caminos en un grafo con ciclos

• Nuevos métodos en la clase Vértice para manejar las marcas

25

ISIS1206 – Estructuras de Datos

http://cupi2.uniandes.edu.co

Agenda

• Caminos en un grafo

• Caminos acíclicos

• Caminos con ciclos

• Clase Camino

• Camino entre dos vértices

• Camino más barato entre dos vértices y su costo

• Detección de ciclos

• ¿Hay ciclos desde un vértice?

• ¿El grafo es acíclico?

26

ISIS1206 – Estructuras de Datos

http://cupi2.uniandes.edu.co

Retornar el camino

• Problema: Determinar si existe un camino entre dos vértices v1 y v2 de un grafo y retornarlo.

• Nueva clase en Cupi2Collections para representar y manipular Caminos

27

ISIS1206 – Estructuras de Datos

http://cupi2.uniandes.edu.co

Clase Camino

• El vértice origen del camino es de tipo Vertice

28

ISIS1206 – Estructuras de Datos

http://cupi2.uniandes.edu.co

Clase Camino• Se declara un vector (arcos) que contiene los arcos del camino

29

ISIS1206 – Estructuras de Datos

http://cupi2.uniandes.edu.co

Clase Camino• Se declara el costo del camino

30

ISIS1206 – Estructuras de Datos

http://cupi2.uniandes.edu.co

Clase Camino• Se crea el camino a partir de un vértice origen

31

ISIS1206 – Estructuras de Datos

http://cupi2.uniandes.edu.co

Clase Camino

• Métodos empleados:• public Camino( Vertice<K, V, A> pOrigen )

• public void agregarArcoFinal( Arco<K, V, A> arco )

• public void agregarArcoComienzo( Arco<K, V, A>

nuevoArco )

• public void concatenar( Camino<K, V, A> camino )

• public void eliminarUltimoArco( )

• public void reiniciar( )

• public int darLongitud( )

• public int darCosto( )

• public Iterador<Vertice<K, V, A>>

darSecuenciaVertices( )

32

ISIS1206 – Estructuras de Datos

http://cupi2.uniandes.edu.co

Agenda

• Caminos en un grafo

• Caminos acíclicos

• Caminos con ciclos

• Clase Camino

• Camino entre dos vértices

• Camino más barato entre dos vértices y su costo

• Detección de ciclos

• ¿Hay ciclos desde un vértice?

• ¿El grafo es acíclico?

33

ISIS1206 – Estructuras de Datos

http://cupi2.uniandes.edu.co

Camino entre dos vértices (Clase Vértice)• Retornar un camino a un vértice destino

• Se retorna un objeto de tipo camino

34

ISIS1206 – Estructuras de Datos

http://cupi2.uniandes.edu.co

Camino entre dos vértices (Clase Vértice)• Retornar un camino a un vértice destino

• Si es el vértice buscado retorna un camino nuevo con el vértice origen (sin arcos)

35

ISIS1206 – Estructuras de Datos

http://cupi2.uniandes.edu.co

Camino entre dos vértices (Clase Vértice)• Retornar un camino a un vértice destino

• Marca el vértice para recordar que ya pasó por ahí.

36

ISIS1206 – Estructuras de Datos

http://cupi2.uniandes.edu.co

Camino entre dos vértices (Clase Vértice)• Retornar un camino a un vértice destino

• Recorre los arcos sucesores

37

ISIS1206 – Estructuras de Datos

http://cupi2.uniandes.edu.co

Camino entre dos vértices (Clase Vértice)• Retornar un camino a un vértice destino

• Obtiene el vértice sucesor

38

ISIS1206 – Estructuras de Datos

http://cupi2.uniandes.edu.co

Camino entre dos vértices (Clase Vértice)• Retornar un camino a un vértice destino

• Verifica que el vértice sucesor no haya sido visitado previamente

39

ISIS1206 – Estructuras de Datos

http://cupi2.uniandes.edu.co

Camino entre dos vértices (Clase Vértice)• Retornar un camino a un vértice destino

• Obtiene el camino desde el sucesor hasta el destino

40

ISIS1206 – Estructuras de Datos

http://cupi2.uniandes.edu.co

Camino entre dos vértices (Clase Vértice)• Retornar un camino a un vértice destino

• Si encontró algún camino del sucesor al destino (!= null), adiciona el arco al inicio de la lista de arcos del camino y retorna el camino

41

ISIS1206 – Estructuras de Datos

http://cupi2.uniandes.edu.co

Camino entre dos vértices (Clase Vértice)• Retornar un camino a un vértice destino

• Si al haber recorrido todos sus sucesores no encontró camino al destino retorna null

42

ISIS1206 – Estructuras de Datos

http://cupi2.uniandes.edu.co

Agenda

• Caminos en un grafo

• Caminos acíclicos

• Caminos con ciclos

• Clase Camino

• Camino entre dos vértices

• Camino más barato entre dos vértices y su costo

• Detección de ciclos

• ¿Hay ciclos desde un vértice?

• ¿El grafo es acíclico?

43

ISIS1206 – Estructuras de Datos

http://cupi2.uniandes.edu.co

Clase Vértice• Problema: ¿Cómo retornar el camino de costo mínimo entre dos vértices v1 y v2 de un grafo dirigido que puede tener ciclos?

• Parecido al problema anterior (darCamino), pero debe buscar TODOS los caminos posibles entre los dos vértices antes de retornar el camino (para estar seguro de retornar el de costo mínimo).

44

ISIS1206 – Estructuras de Datos

http://cupi2.uniandes.edu.co

Qué pasa si usamos el dar Camino original ?

45

Camino de costo mínimo de v1 a v4 ?

Primer camino que encuentra: < v1, v2, v4> con costo 12. No es el de

menor costo !!!

v1

v2

V3

v4

5 7

2

2 12

v1

v2

V3

v4

5 7

2

2 12

ISIS1206 – Estructuras de Datos

http://cupi2.uniandes.edu.co

Qué modificaciones hay que hacer?

1. Encontrar TODOS los caminos (junto con su costo) de v1 a v4 para seleccionar el menor.

• Obliga a hacer una llamada recursiva a cada sucesor no marcado y según el costo que retorne cada llamada, seleccionar el mejor.

2. Desmarcar el nodo v1 antes de abandonar el método:

• Es indispensable porque se puede dar el caso de que el camino buscado pase por el nodo v1, pero viniendo de otra llamada recursiva

46

ISIS1206 – Estructuras de Datos

http://cupi2.uniandes.edu.co

Qué pasa si no se desmarca ?

47

Camino de costo mínimo de v1 a v4 ?

•Después de la primera recursión, v2 queda marcado.•Al buscar los caminos desde v1 que comiencen por v3, solo va a encontrar el camino <v1, v3, v4> , ignorando el camino de costo mínimo < v1, v3, v2, v4 > porque v2 estaba marcado.

v1

v2

V3

v4

5 7

2

2 12

v1

v2

V3

v4

5 7

2

2 12

ISIS1206 – Estructuras de Datos

http://cupi2.uniandes.edu.co

Qué pasa si no se desmarca ?

48

•Después de la primera recursión, v2 queda marcado.•Al buscar los caminos desde v1 que comiencen por v3, solo va a encontrar el camino <v1, v3, v4> , ignorando el camino de costo mínimo < v1, v3, v2, v4 > porque v2 estaba marcado.

Es necesario desmarcar los nodos en todos los algoritmos que deban

identificar todos los posibles caminos entre dos puntos

v1

v2

V3

v4

5 7

2

2 12

ISIS1206 – Estructuras de Datos

http://cupi2.uniandes.edu.co

Retornar el camino de costo mínimo a un vértice destino (clase Grafo)

• Complete el siguiente método

49

/**

* Retorna el camino más barato (de menor costo) entre el par

* de vértices especificados

* @param idVerticeOrigen Vértice en el que inicia el camino

* @param idVerticeDestino Vértice en el que termina el camino

* @return El camino más barato entre el par de vértices

* especificados

* @throws VerticeNoExisteException Si alguno de los dos

* vértices no existe

*/

public Camino darCaminoMasBarato( K idVerticeOrigen, K

idVerticeDestino ) throws VerticeNoExisteException {

// Borra todas las marcas presentes en el grafo

// Obtiene los vértices

// Le pide al vértice de origen que localice el camino

}

ISIS1206 – Estructuras de Datos

http://cupi2.uniandes.edu.co

Retornar el camino de costo mínimo a un vértice destino (clase Grafo)

50

/**

* Retorna el camino más barato (de menor costo) entre el par

* de vértices especificados

* @param idVerticeOrigen Vértice en el que inicia el camino

* @param idVerticeDestino Vértice en el que termina el camino

* @return El camino más barato entre el par de vértices

* especificados

* @throws VerticeNoExisteException Si alguno de los dos

* vértices no existe

*/

public Camino darCaminoMasBarato( K idVerticeOrigen, K

idVerticeDestino ) throws VerticeNoExisteException {

// Borra todas las marcas presentes en el grafo

reiniciarMarcas();

// Obtiene los vértices

Vertice<K, V, A> verticeOrigen = darVertice( idVerticeOrigen );

Vertice<K, V, A> verticeDestino = darVertice( idVerticeDestino );

// Le pide al vértice de origen que localice el camino

return verticeOrigen.darCaminoMasBarato( verticeDestino );

}

ISIS1206 – Estructuras de Datos

http://cupi2.uniandes.edu.co

Camino más corto (clase Vértice)

51

• Implemente el siguiente método

/**

* Devuelve el camino mas corto al vértice especificado

* @param destino Vértice destino

* @return Camino mas corto hacia el vértice especificado

*/

public Camino<K, V, A> darCaminoMasCorto( Vertice<K, V, A> destino )

{

//Si el origen y destino son iguales retorne un camino con el

//vértice actual

//De lo contrario:

//Marque el vértice actual

//Pida los arcos sucesores

//Recorra los sucesores

//Por cada arco obtenga el vértice y si no esta marcado llame la

//recursión.

//Si el camino anterior existe y (no ha encontrado el camino más corto o

//la longitud del camino actual es menor que la longitud del camino más

//corto que llevaba -> Actualice el camino mas corto y el arco.

//Después de recorrer todos los arcos desmarque

//Si el camino no existe retorne null

//Si el camino existe agregue el arco al camino y retórnelo

}

ISIS1206 – Estructuras de Datos

http://cupi2.uniandes.edu.co

Clase Vértice• Retornar el camino con menor costo a un vértice destino

• Se declaran variables auxiliares donde se guarda la información del último hasta el momento

52

ISIS1206 – Estructuras de Datos

http://cupi2.uniandes.edu.co

Clase Vértice• Retornar el camino con menor costo a un vértice destino

• Se hace el mismo ciclo anterior verificando que el vértice sucesor no esté marcado

53

ISIS1206 – Estructuras de Datos

http://cupi2.uniandes.edu.co

Clase Vértice• Retornar el camino con menor costo a un vértice destino

• Se calcula recursivamente el camino más barato desde el sucesor hasta el destino

54

ISIS1206 – Estructuras de Datos

http://cupi2.uniandes.edu.co

Clase Vértice• Retornar el camino con menor costo a un vértice destino

• Se verifica que el vértice sucesor encuentre su propio camino más barato

55

ISIS1206 – Estructuras de Datos

http://cupi2.uniandes.edu.co

Clase Vértice• Retornar el camino con menor costo a un vértice destino

• Se calcula el costo de ese camino, incluyendo el arco al nodo sucesor

56

ISIS1206 – Estructuras de Datos

http://cupi2.uniandes.edu.co

Clase Vértice• Retornar el camino con menor costo a un vértice destino

• Si el nuevo costo es menor que el menor hasta el momento (o si es la primera vez), se actualizan los valores de las variables auxiliares.

57

ISIS1206 – Estructuras de Datos

http://cupi2.uniandes.edu.co

Clase Vértice• Retornar el camino con menor costo a un vértice destino

• Después de haber recorrido TODOS los vértices sucesores:

• Se desmarca

• Verifica si encontró camino mínimo. En este caso, añade el arco que lleva al vértice origen de ese camino

58

ISIS1206 – Estructuras de Datos

http://cupi2.uniandes.edu.co

Agenda

• Caminos en un grafo

• Caminos acíclicos

• Caminos con ciclos

• Clase Camino

• Camino entre dos vértices

• Camino más barato entre dos vértices y su costo

• Detección de ciclos• ¿Hay ciclos desde un vértice?

• ¿El grafo es acíclico?

59

ISIS1206 – Estructuras de Datos

http://cupi2.uniandes.edu.co

¿Hay un ciclo desde un vértice?

• Implementar el siguiente método:

• ¿En qué clase va este método ?

60

Ayuda: Utilice el método hayCamino( )

ISIS1206 – Estructuras de Datos

http://cupi2.uniandes.edu.co

¿Hay un ciclo desde un vértice?

• Implementar el siguiente método:

• ¿En qué clase va este método ?

61

ISIS1206 – Estructuras de Datos

http://cupi2.uniandes.edu.co

Agenda

• Caminos en un grafo

• Caminos acíclicos

• Caminos con ciclos

• Clase Camino

• Camino entre dos vértices

• Camino más barato entre dos vértices y su costo

• Detección de ciclos

• ¿Hay ciclos desde un vértice?

• ¿El grafo es acíclico?

62

ISIS1206 – Estructuras de Datos

http://cupi2.uniandes.edu.co

¿El grafo es acíclico ?

• Implementar un método que diga si el grafo es acíclico.

• En qué clase va este método ?

Ayuda: Utilice el método hayCamino( )

63