Download Algoritmos sobre Grafos

Document related concepts

Diagrama de decisión binario wikipedia , lookup

Aprendizaje basado en árboles de decisión wikipedia , lookup

Estructura de datos para conjuntos disjuntos wikipedia , lookup

Árbol-R wikipedia , lookup

Tabla de hash distribuida wikipedia , lookup

Transcript
Deniciones
Algoritmos básicos de búsqueda
Algoritmos de ruta más corta
Algoritmos basados en árboles
Algoritmos sobre Grafos
Hugo Franco, PhD
21 de febrero de 2011
Hugo Franco, PhD
Algoritmos sobre Grafos
Deniciones
Algoritmos básicos de búsqueda
Algoritmos de ruta más corta
Algoritmos basados en árboles
Contenido
1
Deniciones
2
Algoritmos básicos de búsqueda
3
Algoritmos de ruta más corta
4
Algoritmos basados en árboles
Hugo Franco, PhD
Algoritmos sobre Grafos
Deniciones
Deniciones
Algoritmos básicos de búsqueda
Algoritmos de ruta más corta
Algoritmos basados en árboles
Deniciones sobre Grafos
Par de una lista de nodos y una lista de enlaces, denidos a su vez
como pares del conjunto de nodos.
G ≡
{V, E}
V
≡
{v1 , v2 , . . . , vn }
E
≡
{. . . , {vi , vj }, . . . } , i, j ∈ [1, n], i 6= j
Si el orden de los elementos
vi
enlace es relevante, se tiene un
y
vj
en cada par del conjunto de
grafo dirigido
Representaciones en algoritmos:
Lista de Adyacencia:
el nodo
ain ,
cada
ai
es la lista de nodos enlazados con
i−ésimo
A ≡ aij m×n , aij = 1 sí y sólo sí vi está
0 en caso contrario. Se puede extender asignando
Matriz de Adyacencia:
conectado con
vj ,
aij un valor asociado a la intensidad del enlace (matriz de
proximidad) o la propia distancia geodésica de un nodo a otro
(matriz geodésica)
a los
Hugo Franco, PhD
Algoritmos sobre Grafos
Deniciones
Algoritmos básicos de búsqueda
Algoritmos de ruta más corta
Algoritmos basados en árboles
Ciclo, Grafos Acíclicos
Ciclo: secuencia de enlaces adyacentes en
un grafo, recorridos sin repetir enlaces y
cuyo nodo de partida es el mismo nodo de
llegada.
Ciclo Hamiltoniano: aquel que recorre
todos sus nodos exactamente una vez
(excepto el de partida/llegada).
Ciclo Euleriano: ciclo que contiene todos
los enlaces de un grafo, cada uno de ellos
una única vez.
Hugo Franco, PhD
Algoritmos sobre Grafos
Deniciones
Algoritmos básicos de búsqueda
Algoritmos de ruta más corta
Algoritmos basados en árboles
Grafo Dirigido Acíclico
Grafo dirigido que no tiene ciclos
para cada nodo, no hay un camino directo que
empiece y termine en éste.
Fuente: nodo sin enlaces de entrada,
Sumidero: nodo sin enlaces de salida.
Un GDA (DAG) nito tiene por lo menos una
fuente y un sumidero.
La profundidad de un nodo es la longitud del
camino más largo desde una fuente a éste
La altura de un nodo es la mayor longitud del
camino más largo entre éste y un sumidero.
La longitud de un DAG nito es la longitud
(número de arcos) del camino más largo.
máxima altura de todas las fuentes, máxima
profundidad de todos los sumideros.
Hugo Franco, PhD
Algoritmos sobre Grafos
Deniciones
Algoritmos básicos de búsqueda
Algoritmos de ruta más corta
Algoritmos basados en árboles
Etiquetado
Los recorridos sobre grafos exigen usualmente almacenar de forma
accesible el Estado de cada nodo (y en ocasiones, enlace) del grafo
según haya sido recorrido / analizado durante el proceso de análisis
/ búsqueda
La forma de almacenar ese estado se puede implementar a través de
atributos asignados a los nodos que representen el estado en el que
se encuentra el nodo con un valor asociado a cada estado,
El estado de un nodo puede constar de uno o más parámetros,
simbólicos o numéricos. En casos de representaciones simbólicas, se
suelen emplear enumeraciones descriptivas, que determinan la
implementación de las reglas de evolución de los nodos del grafo
Hugo Franco, PhD
Algoritmos sobre Grafos
Deniciones
Algoritmos básicos de búsqueda
Algoritmos de ruta más corta
Algoritmos basados en árboles
Etiquetado
Los recorridos sobre grafos exigen usualmente almacenar de forma
accesible el Estado de cada nodo (y en ocasiones, enlace) del grafo
según haya sido recorrido / analizado durante el proceso de análisis
/ búsqueda
La forma de almacenar ese estado se puede implementar a través de
atributos asignados a los nodos que representen el estado en el que
se encuentra el nodo con un valor asociado a cada estado,
El estado de un nodo puede constar de uno o más parámetros,
simbólicos o numéricos. En casos de representaciones simbólicas, se
suelen emplear enumeraciones descriptivas, que determinan la
implementación de las reglas de evolución de los nodos del grafo
Hugo Franco, PhD
Algoritmos sobre Grafos
Deniciones
Algoritmos básicos de búsqueda
Algoritmos de ruta más corta
Algoritmos basados en árboles
Etiquetado
Los recorridos sobre grafos exigen usualmente almacenar de forma
accesible el Estado de cada nodo (y en ocasiones, enlace) del grafo
según haya sido recorrido / analizado durante el proceso de análisis
/ búsqueda
La forma de almacenar ese estado se puede implementar a través de
atributos asignados a los nodos que representen el estado en el que
se encuentra el nodo con un valor asociado a cada estado,
El estado de un nodo puede constar de uno o más parámetros,
simbólicos o numéricos. En casos de representaciones simbólicas, se
suelen emplear enumeraciones descriptivas, que determinan la
implementación de las reglas de evolución de los nodos del grafo
Hugo Franco, PhD
Algoritmos sobre Grafos
Algoritmos Básicos de Búsqueda
Deniciones
Algoritmos básicos de búsqueda
Algoritmos de ruta más corta
Algoritmos basados en árboles
Problema del Ordenamiento Topológico
Dado un Grafo Dirigido Acíclico, el problema del ordenamiento
topológico consiste en
Encontrar un ordenamiento de los vértices tal que todos ellos se listen
hacia adelante (nodo inicial, nodo nal) de acuerdo a sus enlaces
Utilidad: Asignar una prioridad a una lista de tareas con restricciones
de precedencia (hacer primero la tarea A porque una tarea B
depende del resultado de A, etc...)
Se asume que el grafo está representado como una lista de
adyacencias
Hugo Franco, PhD
Algoritmos sobre Grafos
Deniciones
Algoritmos básicos de búsqueda
Algoritmos de ruta más corta
Algoritmos basados en árboles
Búsqueda en Profundidad
Dada una lista de vértices
Para
i=1
Si
vi
hasta
V
y una lista de enlaces
E,
hacer
n
no está marcado como visitado,
RecorrerProfundidad(i)
Fin
Función RecorrerProfundidad(índice
Marcar
vi
Agregar
i
a la lista de recorrido
Usando la lista de enlaces
Si
vj
i)
como visitado
e,
para cada vecino
vj
de
vi
no está marcado como visitado
RecorrerProfundidad(j )
Agregar el enlace que une a
vi con vj al árbol de recorrido
Regresar
Hugo Franco, PhD
Algoritmos sobre Grafos
Deniciones
Algoritmos básicos de búsqueda
Algoritmos de ruta más corta
Algoritmos basados en árboles
Búsqueda en Anchura
Dada una lista de vértices
cola de prioridad
Q,
Marcar el nodo inicial
Añadir
i
encolar
vi
Mientras
V
y una lista de enlaces
E,
deniendo una
hacer
vi
como visitado
a la lista de recorrido
en
Q
Q 6= Ø
extraer
ui
desde
Para cada vecino
Si
Q
uj
de
ui
uj no esta marcado como visitado
agregar uj a Q
marcar uj como visitado
Agregar el enlace que une a ui con uj al árbol de recorrido
Hugo Franco, PhD
Algoritmos sobre Grafos
Algoritmos de Ruta más corta
Deniciones
Algoritmos básicos de búsqueda
Algoritmos de ruta más corta
Algoritmos basados en árboles
Algoritmo de BellmanFord
Algoritmo de programación dinámica
Encontrar la ruta más corta desde todos los nodos a un nodo sumidero
t.
Se
suele calcular las longitudes de los caminos más cortos así que posteriormente
se pueden reconstruir las rutas fácilmente. La idea de algoritmo es
1
Para cada nodo
v,
encontrar la longitud de la ruta más corta a
al menos una arista o etiquetar
2
Supóngase para todo
t
que usa
i−1
v
∞
xj
hasta
t
que usa
se tienen las longitudes de la ruta más corta hasta
o menos enlaces. La ruta más corta desde
o menos enlaces primero irá a algún vecino
corta desde
t
si no hay tal ruta.
que usa
i−1
xj
de
v
v
a
t
que usa
y tomar la ruta más
o menos enlaces (paso 1). Así, se
necesita tomar únicamente los mínimos de la distancia entre todos los
vecinos
3
xj
de
v
Repetir mientras
i≤n−1
Hugo Franco, PhD
Algoritmos sobre Grafos
i
Deniciones
Algoritmos básicos de búsqueda
Algoritmos de ruta más corta
Algoritmos basados en árboles
Pseudocódigo BellmanFord
1
Inicializar d[v][0] =
2
Para
1
i=1
Para cada
1
3
hasta
v,
for
v 6= t.
d[t][i]=0
∀
i.
n−1
v 6= t
d[v][i] =
Para cada
∞
min
(v,xj )∈E
(len(v,x) + d[x][i-1])
escribir d[v][n-1].
Hugo Franco, PhD
Algoritmos sobre Grafos
Deniciones
Algoritmos básicos de búsqueda
Algoritmos de ruta más corta
Algoritmos basados en árboles
Todas las distancias mínimas: FloydWarshall
Sea A[i][j] la matriz de proximidad del grafo
En vez de incrementar el número de enlaces en la ruta, se recorrerá
el grafo por vértices
Se incrementará el contador sobre el conjunto de vértices que se
admiten como intermedios en la ruta estimada
Usando la matriz de i, después de cada iteración del bucle exterior,
A[i][j] será igual a la longitud del camino más corto de
puede usar los vértices en la secuencia
Para
k
= 1 hasta
Para cada
vi
a
vj
que
{1, 2, . . . , k}:
n
i, j
A[i][j] = min( A[i][j], (A[i][k] + A[k][j]); .
Aunque el algoritmo tarda del orden de
n3 ,
donde n es el número de
nodos, el código es simple y compacto.
Hugo Franco, PhD
Algoritmos sobre Grafos
Deniciones
Algoritmos básicos de búsqueda
Algoritmos de ruta más corta
Algoritmos basados en árboles
Todas las distancias mínimas: Dijkstra
Sea un grafo dirigido
conectado de N
nodos, sea
x
el nodo origen y
un vector (array) de distancias a los diferentes nodos indexados por
1
Inicializar el array de todas las distancias en
Dn
con un valor innito
relativo (valor inicial desconocido), exceptuando la de
colocar en 0 (la distancia de
2
Sea
3
Recorrer todos los nodos
k = x (k
x
Dn
n
x
que se debe
a sí mismo es 0).
es el nodo actual).
adyacentes
de
k
(denominados
vi ),
excepto los
marcados como evaluados
4
Si la distancia desde
desde
x
hasta
k
x
hasta
vi
guardada en
sumada a la distancia desde
Di es mayor que la distancia
k hasta vi , ésta se sustituye
con la segunda nombrada, esto es:
si
Di > Dk + d(k, vi )
entonces
Di = Dk + d(k, vi )
5
Marcar como evaluadoa
6
El siguiente nodo actual es el de menor valor en
k.
Di
(puede hacerse
almacenando los valores en una cola de prioridad); volver a 3 mientras
existan nodos no evaluados.
Hugo Franco, PhD
Algoritmos sobre Grafos
Deniciones
Algoritmos básicos de búsqueda
Algoritmos de ruta más corta
Algoritmos basados en árboles
Algoritmo de Dijkstra: Ejemplo
Se añade
Mientras
AaQ
Q 6= Ø
Se escoge
D
v∈Q
con menor
y se marca como visitado
(sale de
Q)
Q
Se añaden a
los vecinos
v,
x
D de cada x
no marcados de
denominados
Se actualiza
si la distancia que
atraviesa a
v
hasta
x
es
menor que la distancia
hasta
x
anterior
Hugo Franco, PhD
Algoritmos sobre Grafos
de la iteración
Algoritmos basados en Árboles
Deniciones
Algoritmos básicos de búsqueda
Algoritmos de ruta más corta
Algoritmos basados en árboles
Árbol de Expansión
Spanning tree
Un árbol de expansión de un grafo es una estructura de datos en
árbol que toca todos los vértices del grafo
Sólo tienen sentido en grafos de un sólo componente (conexos)
Un árbol de expansión mínimo es un árbol de expansión cuya suma
de longitudes de los enlaces es tan pequeña como sea posible en un
grafo dado (puede haber más de uno)
Se llama tamaño del árbol de expansión a la suma de las
longitudes de los enlaces.
Hugo Franco, PhD
Algoritmos sobre Grafos
Deniciones
Algoritmos básicos de búsqueda
Algoritmos de ruta más corta
Algoritmos basados en árboles
Algoritmo de Prim
El algoritmo de Prim sobre un grafo permite construir el árbol de
expansión mínimo (MST) del mismo. Puede verse como una versión
simplicada del algoritmo de Dijkstra
1
2
Seleccionar un nodo arbitrario de inicio
s.
Inicializar el árbol
Repetidamente agregar el enlace más corto incidente a
T
T = s.
en cada
nodo (el enlace más corto que tiene un vértice dentro de los enlaces
de
T
y el otro no hasta que el árbol contenga todos los nodos
Hugo Franco, PhD
Algoritmos sobre Grafos
Deniciones
Algoritmos básicos de búsqueda
Algoritmos de ruta más corta
Algoritmos basados en árboles
Algoritmo de Kruskal
Otra forma de encontrar el árbol de expansión mínimo de un grafo
muy conocida es el Algoritmo de Kruskal.
La idea es la de ordenar los enlaces por longitud y examinar cada
uno de ellos del más corto al más largo. Se debe poner cada enlace
en un conjunto de subárboles si no forma un ciclo con los enlaces
escogidos con anterioridad
Hugo Franco, PhD
Algoritmos sobre Grafos