Documente Academic
Documente Profesional
Documente Cultură
TEORIA DE GRAFOS
JOSE FRANCISCO LIMAICO
GR2
Introduccin
LOS SIETE PUENTES DE LA ISLA KUEIPHOF
La isla Kueiphof en Koenigsberg (Pomerania) el ro que la rodea se divide en dos
brazos. Sobre los brazos estaban construidos siete puentes y para los habitantes
era motivo de distraccin descubrir un itinerario de manera que pudieran regresar al
punto de partida, despus de haber cruzado por los siete puentes pero pasando slo
una vez por cada uno de ellos.
Este estudio de Euler dio origen a la teora de los grafos, que se emplean en el
estudio de los circuitos elctricos, en problemas de transporte, programacin
con ordenador, etc.
.1 Teora de grafos
La Teora de Grafos juega un papel importante en la fundamentacin
matemtica de las Ciencias de la Computacin. Los grafos constituyen una
herramienta bsica para modelar fenmenos discretos y son fundamentales para
la comprensin de las estructuras de datos y el anlisis de algoritmos.
En matemticas y ciencias de la computacin, la teora de grafos
estudia las propiedades de los grafos, que son colecciones de objetos llamados
vrtices (o nodos) conectados por lneas llamadas aristas (o arcos) que
pueden
tener orientacin (direccin asignada). Tpicamente, un grafo est
diseado por una serie de puntos (los vrtices) conectados por lneas (las
aristas).
Grafo
Un grafo es una pareja G = (V, A), donde V es un conjunto de puntos,
llamados vrtices, y A es un conjunto de pares de vrtices, llamadas aristas.
Subgrafo
Un grafo G1 es subgrafo de otro G si todos los vrtices de G1 estn en G
pero no necesariamente todos los vrtices de G estn en G1. [Hortal, 268]
Caracterizacin de Grafos
Grafos Simples
Un grafo es simple si a lo ms slo 1 arista une dos vrtices
cualesquiera. Esto es equivalente a decir que una arista cualquiera es el
nico que une dos vrtices especficos.
Un grafo que no es simple se denomina complejo.
Grafos Conexos
Un grafo es conexo (ms formalmente fuertemente conexo) si todos sus
vrtices estn conectados por un camino; es decir, si para cualquier par de
vrtices (a, b), existe al menos un camino posible desde a hacia b.
Es posible determinar si un grafo es fuertemente conexo coleccionando la
informacin de los grados de sus vrtices al tiempo que se acumulan las
diferentes rutas que salen de un vrtice o llegan a l.
En trminos matemticos la propiedad de un grafo de ser fuertemente
conexo permite establecer en base a l una relacin de equivalencia para
sus vrtices, la cual lleva a una particin de stos en "componentes
fuertemente conexos", es decir, porciones del grafo, que son fuertemente
conexas cuando se consideran como grafos aislados. Esta propiedad es
importante para muchas demostraciones en teora de grafos.
Grafos Completos
Un grafo simple es completo si existen aristas uniendo todos los pares
posibles de vrtices. Es decir, todo par de vrtices (a, b) debe tener una arista e
que los une.
El conjunto de los grafos completos es denominado usualmente
, siendo
Definicin: Sean x, y
dirigido
Camino
A t:
Abce f
Ad e f
El mismo nodo
abd a
abced a
1.
{A, b}, {b, d}, {d, c}, {c, e}, {e, d}, {d, b}
Camino: a b longitud = 6
se repiten vrtices b y d
a b d c e d
b
Se repite arista: {d , b} (2)
1
2
3
4
5
a b d c e
2
d b
2. b c d e c f
Camino: b longitud = 5
f
Se repiten vrtice c
Arista no se repite
3. {f , c}, {c, e}, {e, d}, {d , a}:
Camino: f longitud = 4
a
No repite vrtice
No repite arista
* Como no es dirigido
Camino:
cerrado:
repite arista
bx
x
x
y
b c d b
repite vrtices
Vrtices
repetidos
X
X
X
X
-
Aristas
repetidas
X
X
-
x y abierto
X
X
X
-
X
X
X
Nombre
Camino
Camino cerrado
Recorrido
Circuito
Camino simple
Ciclo
b
c f a
Camino simple:
a b c d
a d c f
Circuito:
a d b c
d a
Recorrido.
a b c d
b
Camino cerrado:
a b d c
d a
Camino:
a b d c
b d e
Ejemplo.
No existe un camino
simple para llegar ha
e
Pathfinding
En muchos juegos, un personaje tiene que ser capaz de viajar de forma
automtica desde su posicin actual hasta un destino deseado. Por ejemplo, es
posible controlar el personaje del jugador haciendo clic en un punto de destino en
el mundo del juego, o tal vez un NPC (Non Playable Character) enemigo podra
tener que encontrar una ruta para interceptar el jugador. En algunos casos, esta
ser una simple cuestin de moverse en lnea recta o a lo largo de un camino
preestablecido, pero tambin hay mundos de juego basado alrededor de edificios,
bosques u otros lugares donde la ruta hacia el destino no es tan directa. En juegos
como estos, se necesita algo de lgica de control para permitir al personaje tomar
decisiones en cada punto a lo largo de su recorrido para elegir su prximo paso. El
proceso de eleccin de los movimientos de un personaje en el mundo del juego
como este es conocido como navegacin.
Existen varias tcnicas que pueden usarse para navegar un personaje a su
destino, algunas de las cuales involucran un elemento de prueba y error con los
errores y giros equivocados. Sin embargo, a menudo, el comportamiento deseado
es hacer que el personaje parezca estar planeando su ruta de forma inteligente,
tomando la ruta ms directa o ventajosa. Esto requiere un poco de inteligencia
artificial (IA) para establecer la mejor manera de llegar desde el punto de partida
hasta el destino. Esta tarea en IA de un juego se conoce como bsqueda de
caminos y, aunque puede ser muy tcnico, Unity hace muy fcil algunos casos
comunes usando su sistema de pathfinding (bsqueda de caminos) incorporado.
Introduccin:
El rea de Bsqueda
Vamos a asumir que tenemos a alguien que quiere ir desde el punto A hasta el
punto B. Asumamos tambin que un muro separa estos dos puntos. El ejemplo
queda ilustrado en el grfico siguiente, donde el recuadro verde es el punto de
inicio A, el rojo es el punto de destino B y la zona azul el muro que hay entre
ambos.
[Figura 1]
Lo primero que deberas advertir es que hemos dividido nuestro rea de bsqueda
en una rejilla cuadrada. Simplificar el rea, tal y como hemos hecho, es el primer
paso en un pathfinding. Este particular mtodo reduce nuestra rea de bsqueda a
una simple matriz bidimensional. Cada elemento de la matriz representa uno de
los cuadrados de la rejilla, y su estado se almacena como transitable o
intransitable. El camino se elige calculando qu cuadros deberamos pisar para ir
desde A hasta B. Una vez que el camino haya sido encontrado, el personaje de
nuestro juego (o lo que sea) se mover desde el centro de un cuadrado hacia el
centro del siguiente hasta que el objetivo haya sido alcanzado.
A esos puntos centrales se les llama "nodos". Esto se debe a que es posible dividir
nuestra rea en otras cosas aparte de cuadrados. Podran ser rectangulares,
hexagonales, o de cualquier otra forma; y podran situarse en cualquier lugar
dentro de esas formas - en el centro, por los bordes, o en cualquier lugar. Nosotros
usamos este sistema porque es el ms simple.
Iniciando la Bsqueda
Una vez que hemos simplificado nuestro rea de bsqueda en un nmero de
nodos asequible, tal y como hemos hecho con la rejilla de la figura anterior, el
siguiente paso es dirigir una bsqueda para encontrar el camino ms corto. En el
pathfinding A*, (estrella) lo hacemos empezando desde el punto A, comprobando
los cuadros adyacentes y generalmente buscando hacia fuera hasta que
encontremos nuestro destino.
Empezamos la bsqueda haciendo lo siguiente:
1. Empieza en el punto inicial A y adelo a una "lista abierta" de cuadrados a
tener en cuenta. La lista abierta es como una lista de la compra. Ahora
mismo solo tenemos un elemento en la lista, pero ms tarde tendremos
ms. La lista contiene los cuadrados que podran formar parte del camino
que queremos tomar, pero que quizs no lo hagan. Bsicamente, esta es
una lista de los cuadrados que necesitan ser comprobados.
[Figura 2]
Despus, elegimos uno de los cuadrados adyacentes de la lista abierta y ms o
menos repetimos el proceso anterior como se describe un poco ms abajo. Pero,
cul cuadro debemos elegir? Aquel que tenga el coste F ms bajo.
Puntuando el camino
La clave para determinar que cuadrados usaremos para resolver el camino est
en la siguiente ecuacin:
F=G+H
Donde:
[Figura 3]
As pues, vamos a mirar algunos ejemplos de estos cuadros. En el cuadrado con
letras, G =10. Esto es debido a que est solo a un cuadro del cuadrado inicial en
direccin horizontal. Los cuadrados inmediatamente encima, abajo y a la izquierda
del cuadrado inicial; tienen todos el mismo valor G de 10. Los cuadros diagonales
tienen un valor G de 14.
Las puntuaciones H se calculan estimando la distancia Manhattan hasta el
cuadrado rojo objetivo, movindose solo horizontal y verticalmente e ignorando el
muro que est en el camino. Usando este mtodo, el cuadro de la derecha del
inicial, est a 3 cuadros del cuadrado rojo con una puntuacin H de 30. El
cuadrado est a solo 4 cuadros de distancia (recuerda que solo nos movemos en
horizontal y vertical) con una puntuacin H de 40. Probablemente comprendas
como se calculan las puntuaciones H para los dems cuadros.
De nuevo, la puntuacin F de cada cuadro se calcula simplemente sumando G y
H.
1.
Continuando la bsqueda
Para continuar la bsqueda, simplemente elegimos la puntuacin F ms baja de
todos aquellos que estn en la lista abierta. Despus hacemos lo siguiente con el
cuadro seleccionado:
4) Scalo de la lista abierta y adelo a la lista cerrada.
5) Comprueba todos los cuadrados adyacentes, ignorando aquellos que estn
en la lista cerrada o que sean intransitables terrenos con muros, agua, o
cualquier terreno prohibido), aade los cuadros a la lista abierta si no estn
ya en esa lista. Haz al cuadro seleccionado el "padre" de los nuevos
cuadros.
6) Si el cuadro adyacente ya est en la lista abierta, comprueba si el camino a
ese cuadro es mejor que este. En otras palabras, comprueba que la G de
ese cuadro sea ms baja que la del que estamos usando para ir all. Si no
es as, no hagas nada. Por otro lado, si el coste G del nuevo camino es ms
bajo, cambia el padre del cuadro adyacente al cuadro seleccionado (en el
diagrama superior, cambia la direccin del puntero para que seale al
cuadro seleccionado). Finalmente, recalcula la F y la G de ese cuadrado. Si
esto te parece confuso, podrs verlo ilustrado ms abajo.
Ahora vamos a ver como funciona. De nuestros 9 cuadros iniciales, dejamos 8
en la lista abierta despus de que el cuadrado inicial fuera incluido en la
lista cerrada. De estos, el que tiene el coste F ms bajo es el de
inmediatamente a la derecha del cuadro inicial, con una F de 40. As que
seleccionamos este cuadrado como nuestro siguiente cuadrado. Est
resaltado en azul en la siguiente ilustracin.
[Figura 4]
Primero, lo sacamos de nuestra lista abierta y lo aadimos a nuestra lista cerrada
(por que ahora est resaltado en azul). Luego comprobamos los cuadros
adyacentes. Todos los que hay a la derecha son cuadros de muro, as que no los
tenemos en cuenta. El de la izquierda es el cuadrado inicial; ese est en la lista
cerrada, as que lo ignoramos tambin.
Los otros 4 cuadrados ya estn en la lista abierta, as que necesitamos comprobar
si alguno de los caminos hasta esos cuadros es mejor que el del cuadrado actual
hasta ellos. Para eso usaremos la puntuacin G como punto de referencia.
Miremos debajo de nuestro cuadrado seleccionado; su G actual es 14. Si
fusemos a travs del cuadro actual hasta all, la G sera igual a 20 (10, la G del
cuadro actual, ms 10 de un movimiento vertical hacia el cuadro superior). Una G
de 20 es mayor que una de 14, as que no es un buen camino. Todo eso debera
cobrar sentido si miras el diagrama. Es ms directo llegar a ese cuadro desde el
cuadro inicial movindote un cuadro en diagonal, que moverte horizontalmente un
cuadro y luego verticalmente otro.
Cuando repetimos este proceso para los otros 4 cuadros adyacentes que ya estn
en la lista abierta, descubrimos que ninguno de los caminos ha mejorado por ir a
travs del cuadro actual (el de la derecha bordeada de azul), as que pasamos de
l. Ahora que hemos mirado en todos los cuadros adyacentes y ya nos hemos
hecho con este nuevo cuadro, estamos listos para movernos al siguiente
cuadrado.
Recorremos el grupo de cuadros de nuestra lista abierta, ahora ha bajado a 7
cuadrados, cogemos el que tenga el coste F ms bajo. Interesante..., en este caso
hay dos cuadros que tienen una puntuacin de 54. As que, cul elegimos? La
verdad es que no importa. Para propsitos de velocidad, puede ser ms rpido
elegir el ltimo que aadimos a la lista abierta. Esto influencia a la bsqueda en
favor de cuadros que fueron encontrados ms tarde justo cuando ests ms cerca
de alcanzar tu objetivo. De todas formas no es verdaderamente importante.
[Figura 5]
Esta vez, cuando comprobamos los cuadrados adyacentes encontramos que el de
la izquierda y el superior a este son cuadros de muro as que los ignoramos.
Tampoco tenemos en cuenta el cuadro que est debajo del muro. Por qu?
Porque no puedes llegar a ese cuadrado sin que tu personaje se raspe el hombro
con la esquina al intentar pasar en diagonal; lo mejor es dar un pequeo rodeo,
primero bajando y luego yendo hacia la derecha. (Nota: Esta regla de bordear
esquinas es opcional. Su uso depende de cmo estn situados tus nodos.)
Eso nos deja otros 5 cuadros. Los otros 2 cuadros bajo el actual no estn en la
lista abierta as que los aadimos y el cuadro actual se convierte en su padre. De
esos otros 3 cuadros, 2 ya estn en la lista cerrada (el cuadro inicial, y el cuadro
que hay encima del actual, ambos resaltados en azul en el diagrama) as que los
ignoramos. El ltimo cuadro, el de la izquierda del cuadro actual, se comprueba
para ver si el coste G hasta l desde el cuadro actual, es menor que llegando
directamente desde el cuadro inicial. Lo hacemos y no hay suerte, as que ya
estamos listos para comprobar el siguiente cuadro de nuestra lista abierta.
Repetimos este proceso hasta que aadimos el cuadro objetivo a la lista abierta,
en ese momento parecera algo como la ilustracin inferior:
[Figura 6]
Observa que el cuadro padre para el cuadrado dos cuadros por debajo del cuadro
inicial ha cambiado desde la ilustracin anterior. Antes tena un coste G de 28 y
apuntaba al cuadrado encima suya y a la derecha. Ahora tiene una puntuacin de
20 y apunta al cuadrado encima de ella. Esto ocurri en algn momento por la
forma en la que se ejecuta nuestra bsqueda, donde la puntuacin G fue
comprobada y devuelta ms baja usando un nuevo camino - el padre cambi y G y
F fueron recalculadas. A pesar de que este cambio no parece demasiado
importante en este ejemplo, hay muchas posibles situaciones donde este
constante control significar la diferencia en la determinacin del mejor camino
hasta tu objetivo.
Pero, cmo determinamos el camino actual en s mismo? Fcil, slo empiezas
desde el cuadro objetivo rojo, y vas hacia atrs de un cuadrado a su padre,
siguiendo las flechas. Eso te llevar de vuelta al cuadrado inicial y tus movimientos
sern el camino a seguir. Debera parecerse a la siguiente ilustracin. Moverse
desde el cuadro inicial A hasta el cuadro destino B es solo cuestin de ir
movindose desde el centro de un cuadro (el nodo) al siguiente hasta alcanzar el
objetivo.
[Figura 7]
2.
Sumario del Mtodo A*
Ahora que has ledo la explicacin, vamos a resumir el mtodo paso a paso:
1) Aade el cuadro inicial a la lista abierta.
2) Repite lo siguiente:
a) Busca el cuadro con el coste F ms bajo en la lista abierta. Nos referimos a este
como el cuadro actual.
d) Para cuando:
3) Guarda el camino. Muvete hacia atrs desde el cuadro objetivo, ve desde cada
cuadro a su padre hasta que alcances el cuadro inicial. El camino seguido es el
que buscas.
ALGORITMOS
Algoritmo de Dijkstra
Algoritmo de Bellman-Ford
Este algoritmo genera las rutas mnimas del nodo origen, hacia los dems nodos,
este algoritmo realiza una mecnica similar que el algoritmo de Dijkstra, con la
diferencia de que este algoritmo puede manejar pesos negativos, pero
sacrificando en que se tarda un tiempo mayor.
El Algoritmo de Bellman-Ford es, en su estructura bsica, muy parecido al
algoritmo de Dijkstra, pero en vez de seleccionar vorazmente el nodo de peso
mnimo aun sin procesar para relajarlo, simplemente relaja todas las aristas, y lo
hace |V|-1 veces, siendo |V| el nmero de vrtices en el grafo. Las repeticiones
permiten a las distancias mnimas recorrer el rbol, ya que en la ausencia de
ciclos negativos, el camino ms corto solo visita cada vrtice una vez. A diferencia
de la solucin voraz, la cual depende de la suposicin de que los pesos sean
positivos, esta solucin se aproxima ms al caso general.
for v ady[u] do
if distancia[v]>distancia[u] + peso(u, v) then
distancia[v] = distancia[u] + peso (u, v)
padre[v] = u
if en_cola[v]==FALSE then
encolar(v, Q)
en_cola[v]=TRUE
Algoritmo A*
llamado A estrella, fue presentado por primera vez en 1968. Este algoritmo
implementa el algoritmo de dijkstra, pero le hace una mejora, al tratar de
acercarse al objetivo utilizando un mtodo heurstico (con Heurstico nos
referimos a un mtodo de prueba y error). Por lo que este algoritmo, dando una
solucin bastante aproximada a la ptima, tarda en computar menos tiempo
que el algoritmo de Dijkstra.
El algoritmo de bsqueda A* (pronunciado "A asterisco" o "A estrella") se
clasifica dentro de los algoritmos de bsqueda en grafos . Presentado por
primera vez en 1968 por Peter E. Hart, Nils J. Nilsson y Bertram Raphael, el
algoritmo A* encuentra, siempre y cuando se cumplan unas determinadas
condiciones, el camino de menor coste entre un nodo origen y uno objetivo.
As, el algoritmo A* utiliza una funcin de evaluacin
donde
n, hasta el final, y
, el coste real del camino recorrido para llegar a dicho
nodo, n, desde el nodo inicial. A* mantiene dos estructuras de datos auxiliares,
que podemos denominar abiertos, implementado como una cola de prioridad
(ordenada por el valor
de cada nodo), ycerrados, donde se guarda la
informacin de los nodos que ya han sido visitados. En cada paso del
algoritmo, se expande el nodo que est primero en abiertos, y en caso de que
no sea un nodo objetivo, calcula la
de todos sus hijos, los inserta en
abiertos, y pasa el nodo evaluado a cerrados.
Si
hace un estimacin perfecta de
objetivo.
, A* converge inmediatamente al
Si
= 0, la funcin
controla la bsqueda.
Si
=0y
Si
=0y
Si
nunca sobrestima a
(o subestima), se garantiza encontrar el camino
ptimo, pero se desperdicia esfuerzo explorando otras rutas que parecieron
buenas.
Si
sobrestima a
menor coste
Referencias:
[1] Usuarios de Wikipedia. (2015, Febrero 25). Algoritmo de Disjkstra [en lnea].
Disponible en: http://es.wikipedia.org/wiki/Algoritmo_de_Dijkstra
[2] Usuarios de Wikipedia. (2015, Mayo 30). Algoritmo de Bellman-Ford [en lnea].
Disponible en: http://es.wikipedia.org/wiki/Algoritmo_de_Bellman-Ford
[3] Usuarios de Wikipedia. (2015, Marzo 02). Algoritmo de bsqueda A*[en lnea].
Disponible en: http://es.wikipedia.org/wiki/Algoritmo_de_b%C3%BAsqueda_A%2A
[4] Ngj /2008, Teoria de Grafos, [en lnea].
Disponible
en:
http://campus.cva.itesm.mx/nazira/Tc1003/PDF/TODO/0701_Tc1003_TODO_
Grafos.pdf
[5] Patrick Lester/2003,A* Patfinding para Principiantes, [en lnea]
Disponible en: http://www.policyalmanac.org/games/aStarTutorial_es.htm