Sunteți pe pagina 1din 24

ESCUELA POLITECNICA NACIONAL

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.

Leonardo Euler estudi el asunto, represent las distintas zonas A, B, C y D por


medio de puntos, mientras que los puentes estaban representados por lneas que
unan estos puntos. A la figura la llam grafo, a los puntos los llam vrtices y a las
lneas las denomin aristas. Estudi si una figura lineal se poda dibujar con un solo
trazo, sin levantar el lpiz del papel y sin pasar dos veces por el mismo sitio.
Lleg a la siguiente conclusin:
1. Es imposible si hay ms de dos vrtices impares.
2. Es posible cuando:
a) Todos los vrtices son pares y el punto de partida puede ser cualquiera.
b) Cuando no hay ms de dos vrtices impares y en este caso el comienzo
del recorrido comienza en uno de ellos y termina en el otro.
(Impar es un vrtice si de l parten un nmero impar de caminos).
A la isla A llegan 5 puentes; a la B llegan 3 puentes; a la orilla C
llegan 3 puentes y a la orilla D llegan 3 puentes, por tanto, segn las
conclusiones anteriores, el problema no tiene solucin.
Ejemplos:
Estos dibujos pueden hacerse de un solo trazo:

Estos no pueden hacerse en las condiciones exigidas:

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).

El trabajo de Leonhard Euler, en 1736, sobre el problema de los puentes de


Knigsberg es considerado como uno de los primeros resultados de la teora de
grafos. Tambin se considera uno de los primeros resultados topolgicos en
geometra (que no depende de ninguna medida). Este ejemplo ilustra la profunda
relacin entre la teora de grafos y la topologa.
En 1845 Gustav Kirchhoff public sus leyes de los circuitos para calcular el
voltaje y la corriente en los circuitos elctricos.
En 1852 Francis Guthrie plante el problema de los cuatro colores
que
plantea si es posible, utilizando solamente cuatro colores, colorear cualquier
mapa de pases de tal forma que dos pases vecinos nunca tengan el mismo
color. Este problema, que no fue resuelto hasta un siglo despus por
Kenneth Appel y Wolfgang Haken, puede ser considerado como el nacimiento

de la teora de grafos. Al tratar de resolverlo, los matemticos definieron trminos


y conceptos tericos fundamentales de los grafos.

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.

En teora de grafos, slo queda lo esencial del dibujo: la forma de las


aristas no son relevantes, slo importa a qu vrtices estn unidas. La
posicin de los vrtices tampoco importa, y se puede variar para obtener
un grafo ms claro
Generalmente, se considera que colocar los vrtices en forma de polgono regular
da grafos muy legibles.
Prcticamente cualquier red puede ser modelada con un grafo: una red de
carreteras que conecta ciudades, una red elctrica o un alcantarillado.
Aristas dirigidas y no dirigidas

En algunos casos es necesario asignar un sentido a las aristas, por


ejemplo, si se quiere representar la red de las calles de una ciudad con sus
inevitables direcciones nicas. El conjunto de aristas ser ahora un subconjunto
de todos los posibles pares ordenados de vrtices, con (a, b) (b, a). Los grafos
que contienen aristas dirigidas se denominan grafos orientados.

Las aristas no orientadas se consideran bidireccionales para efectos prcticos


(equivale a decir que existen dos aristas orientadas entre los nodos, cada una en
un sentido).
Se considera la caracterstica de "grado" (positivo o negativo) de un
vrtice, como la cantidad de aristas que llegan o salen de l; para el caso de

grafos no orientados, el grado de un vrtice es simplemente la cantidad de


aristas que tocan este vrtice. Por ejemplo, el grado positivo (salidas) de d
es 3, mientras que el grado negativo (llegadas) de b es 1.
Grafos isomorfos
Dos grafos tendrn la misma forma matemtica cuando la nica diferencia entre
ambos, en cuanto a su estructura, sea la representacin grfica de sus vrtices y
aristas. Cuando las conexiones entre vrtices tengan las mismas aristas, se dice
que son homorfos. [Hortal, 270]
Ejemplo:

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

el grafo completo de n vrtices.


Un Kn, es decir, grafo completo de n vrtices tiene exactamente
aristas.
La representacin grfica de los Kn como los vrtices de un polgono
regular da cuenta de su peculiar estructura.
Grafos Bipartitos
Un grafo G es bipartito si puede expresarse como G = {V1 + V2, A} (es
decir, la unin de dos grupos de vrtices), bajo las siguientes condiciones:
V1 y V2 son distintos y tienen ms de un elemento cada
uno.
Una arista en A une un vrtice de V1 con uno de
V2.
No existen aristas uniendo dos elementos de V1; anlogamente para
V2.
Bajo estas condiciones, el grafo se considera bipartito, y puede
describirse
Informalmente como el grafo que une o relaciona dos conjuntos de elementos
diferentes, como aquellos resultantes de los ejercicios y puzles en los que debe
unirse un elemento de la columna A con un elemento de la columna B.

Definicin: Sean x, y
dirigido

vrtices (no necesariamente diferentes) de un grafo

G = (V, E) un camino x - y en G es una sucesin alternada finita

Camino

A t:

Abce f
Ad e f

Camino cerrado: Cualquier camino x - y donde x = y; esto es, inicia y termina en


a
a:

El mismo nodo

abd a
abced a

Camino abierto: Cuando X y, inicia y termina en vrtices diferentes

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 a b tambin camino b a


Camino b Tambin camino f b
f
Camino
f a tambin camino a f

4. {b, c}, {c, d}, {d , c}


Camino:

Camino:

cerrado:

repite arista

bx
x

x
y

b c d b

repite vrtices

Camino cerrado: repite a y x x


v:
Recorrido: no repite arista: (b d )
b c d e c
f a : f c e d a
Recorrido cerrado: b-b: x-x
Circuito = recorrido cerrado (no repite aristas y llega al mismo
vrtice) Ejemplo: {a, b}, {b, c}, {c, e}, {e, d}, {d, a}
a b c e d a : camino a a
recorrido a- a
cerrado a a
longitud = 5
Camino simple: no repite vrtice: no se repite vrtice
f a : f c e d a
a b c e : a e
Camino simple cerrado: no repite vrtices y lleva al mismo X y
lado.

Ciclo: camino simple cerrado

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.

2. Mira en todos los cuadrados alcanzables o transitables adyacentes al punto


de inicio, ignorando cuadrados con muros, agua u otros terrenos prohibidos.
Adelos a la lista abierta tambin. Por cada uno de esos cuadrados,
guarda el punto A como su "cuadrado padre". El cuadrado padre es muy
importante para trazar nuestro camino.
3. Saca el cuadro inicial A desde tu lista abierta y adelo a una "lista cerrada"
de cuadrados que no necesitan, por ahora, ser mirados de nuevo.
En este punto, deberas tener algo como la siguiente ilustracin. En este
diagrama, el cuadrado verde oscuro del centro es tu cuadrado de inicio. Este
bordeado el azul claro para indicar que el cuadrado ha sido aadido a la lista
cerrada. Todos los cuadros adyacentes estn ahora en la lista abierta para ser
comprobados, estn bordeados con verde claro. Cada uno tiene un puntero gris
que seala a su padre, el cual es el cuadro inicial.

[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:

G = el coste de movimiento para ir desde el punto inicial A a un cierto


cuadro de la rejilla, siguiendo el camino generado para llegar all.

H= el coste de movimiento estimado para ir desde ese cuadro de la rejilla


hasta el destino final, el punto B. Esto es a menudo nombrado como la
heurstica, la cual puede ser un poco confusa. La razn por la cual es
llamada as, se debe a que es una suposicin. Realmente no sabemos la
distancia actual hasta que encontramos el camino, ya que toda clase de
cosas pueden estar en nuestro camino (muros, agua, etc.) Nuestro camino
se genera por ir repetidamente a travs de nuestra lista abierta y eligiendo
el cuadrado con la puntuacin F ms baja. Este proceso se describir con

ms detalle un poco ms adelante. Primero veamos ms de cerca cmo


calculamos la ecuacin.
Tal y como est descrito ms arriba, G es el coste de movimiento para ir desde el
punto de inicio a un cierto cuadro usando el camino generado para llegar all. En
este ejemplo asignaremos un coste de 10 a cada cuadro vertical u horizontal hacia
el que nos movamos, y un coste de 14 para un movimiento diagonal. Usamos
estos nmeros porque la distancia actual para mover diagonalmente es el
cuadrado de la raz de 2, ms o menos 1,414 veces el coste del movimiento
horizontal o vertical. Usamos 10 y 14 con el fin de simplificar. El rango es bastante
bueno, y as nos libramos de tener que calcular races cuadradas y sus decimales.
Usar nmeros enteros tambin es mucho ms rpido para el ordenador.
H puede ser estimado de diferentes maneras. El mtodo que hemos usado aqu
se llama el mtodo Manhattan, donde calculas el nmero total de cuadros movidos
horizontalmente y verticalmente para alcanzar el cuadrado destino desde el
cuadro actual, sin hacer uso de movimientos diagonales. Luego multiplicamos el
total por 10. Se llama mtodo Manhattan porque es como calcular el nmero de
manzanas que hay desde un lugar a otro, donde no puedes acortar atravesando
en diagonal una manzana. Cabe sealar que cuando calculamos H, ignoramos
cualquier obstculo que intervenga. Es una estimacin de la distancia que queda,
no de la distancia actual, es por eso que se llama heurstica.
F se calcula sumando G y H. El resultado del primer paso en nuestra bsqueda
puede ver se en la ilustracin inferior. Las puntuaciones F, G y H estn escritas en
cada cuadrado. En el cuadro inmediatamente a la derecha de cuadro inicial, la F
est impresa arriba a la izquierda, la G abajo a la izquierda y la H abajo la
derecha.

[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.

As pues, y ya que lo elegimos anteriormente, escogemos el cuadro justo debajo


del cuadrado que desechamos antes. La siguiente ilustracin lo aclara:

[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.

b) Cmbialo a la lista cerrada


c) Para cada uno de los 8 cuadros adyacentes al cuadro actual ...

Si no es transitable o si est en la lista cerrada, ignralo. En cualquier


otro caso haz lo siguiente.

Si no est en la lista abierta, adelo a la lista abierta. Haz que el


cuadro actual sea el padre de este cuadro. Almacena los costes F, G y H
del cuadro.

Si ya est en la lista abierta, comprueba si el camino para ese es mejor


usando el coste G como baremo. Un coste G menor significa que este
es un mejor camino. Si es as, cambia el padre del cuadrado al cuadro
actual y recalcula G y F del cuadro. Si ests manteniendo la lista abierta
por orden de puntuacin F, podras necesitar reordenar la lista para
llevar cuenta del cambio.

d) Para cuando:

aadas el cuadro objetivo a la lista abierta en cuyo caso el camino ha sido


encontrado, o

falles en encontrar el cuadro objetivo y la lista abierta est vaca. En este


caso no hay camino.

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

El algoritmo de Dijkstra, tambin llamado algoritmo de caminos mnimos, es


un algoritmo para la determinacin del camino ms corto dado un vrtice origen al
resto de vrtices en un grafo con pesos en cada arista. Su nombre se refiere a
Edsger Dijkstra, quien lo describi por primera vez en 1959.
La idea subyacente en este algoritmo consiste en ir explorando todos los caminos
ms cortos que parten del vrtice origen y que llevan a todos los dems vrtices;
cuando se obtiene el camino ms corto desde el vrtice origen, al resto de vrtices
que componen el grafo, el algoritmo se detiene. El algoritmo es una
especializacin de la bsqueda de costo uniforme, y como tal, no funciona en
grafos con aristas de coste negativo (al elegir siempre el nodo con distancia
menor, pueden quedar excluidos de la bsqueda nodos que en prximas
iteraciones bajaran el costo general del camino al pasar por una arista con costo
negativo).
Teniendo un grafo dirigido ponderado de N nodos no aislados, sea x el nodo
inicial, un vector D de tamao N guardar al final del algoritmo las distancias
desde x al resto de los nodos.
ALGORITMO
1. Inicializar todas las distancias en D con un valor infinito relativo ya que son
desconocidas al principio, exceptuando la de x que se debe colocar en 0
debido a que la distancia de x a x sera 0.
2. Sea a = x (tomamos a como nodo actual).
3. Recorremos todos los nodos adyacentes de a, excepto los nodos
marcados, llamaremos a estos nodos no marcados vi.
4. Para el nodo actual, calculamos la distancia tentativa desde dicho nodo a
sus vecinos con la siguiente frmula: dt(v i) = Da + d(a,vi). Es decir, la
distancia tentativa del nodo v i es la distancia que actualmente tiene el
nodo en el vector D ms la distancia desde dicho el nodo a (el actual) al

nodo vi. Si la distancia tentativa es menor que la distancia almacenada en


el vector, actualizamos el vector con esta distancia tentativa. Es decir: Si
dt(vi) < Dvi Dvi = dt(vi)
5. Marcamos como completo el nodo a.
6. Tomamos como prximo nodo actual el de menor valor en D (puede
hacerse almacenando los valores en una cola de prioridad) y volvemos al
paso 3 mientras existan nodos no marcados.
Una vez terminado al algoritmo, D estar completamente lleno.
TEOREMA: El Algoritmo de Dijkstra realiza O(n2) operaciones (sumas y
comparaciones) para determinar la longitud del camino ms corto entre dos
vrtices de un grafo ponderado simple, conexo y no dirigido con n vrtices.
DIJKSTRA (Grafo G, nodo_fuente s)
para u V[G] hacer
distancia[u] = INFINITO
padre[u] = NULL
distancia[s] = 0
adicionar (cola, (s, distancia[s]))
mientras que cola no es vaca hacer
u = extraer_mnimo(cola)
para todos v adyacencia[u] hacer
si distancia[v] > distancia[u] + peso (u, v) hacer
distancia[v] = distancia[u] + peso (u, v)
padre[v] = u
adicionar(cola,(v, distancia[v]))

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.

Existen dos versiones:

Versin no optimizada para grafos con ciclos negativos, cuyo coste de


tiempo es O(VE).

Versin optimizada para grafos con aristas de peso negativo, pero en el


grafo no existen ciclos de coste negativo, cuyo coste de tiempo, es tambin
O(VE).

bool BellmanFord(Grafo G, nodo_origen s)


// inicializamos el grafo. Ponemos distancias a INFINITO menos el nodo origen
que
// tiene distancia 0
for v V[G] do
distancia[v]=INFINITO
predecesor[v]=NIL
distancia[s]=0
// relajamos cada arista del grafo tantas veces como nmero de nodos -1
haya en el grafo
for i=1 to |V[G]|-1 do
for (u, v) E[G] do
if distancia[v]>distancia[u] + peso(u, v) then
distancia[v] = distancia[u] + peso (u, v)
predecesor[v] = u
// comprobamos si hay ciclos negativo
for (u, v) E[G] do
if distancia[v] > distancia[u] + peso(u, v) then
print ("Hay ciclo negativo")
return FALSE
return TRUE
bool BellmanFord_Optimizado(Grafo G, nodo_origen s)
// inicializamos el grafo. Ponemos distancias a INFINITO menos el nodo
origen que
// tiene distancia 0. Para ello lo hacemos recorrindonos todos los vrtices del
grafo
for v V[G] do
distancia[v]=INFINITO
padre[v]=NIL
distancia[s]=0
encolar(s, Q)
en_cola[s]=TRUE
while Q!=0 then
u = extraer(Q)
en_cola[u]=FALSE
// relajamos las aristas

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

representa el valor heurstico del nodo a evaluar desde el actual,

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

=0 la bsqueda ser aleatoria.

Si

=0y

=1 o constante la bsqueda ser Primero en Anchura.

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

, no puede garantizarse la consecucin del camino del

ABIERTOS := [INICIAL] //inicializacin


CERRADOS := []
f'(INICIAL) := h'(INICIAL)
repetir
si ABIERTOS = [] entonces FALLO
si no // quedan nodos
extraer MEJORNODO de ABIERTOS con f' mnima
// cola de prioridad
mover MEJORNODO de ABIERTOS a CERRADOS
si MEJORNODO contiene estado_objetivo entonces
SOLUCION_ENCONTRADA := TRUE
si no
generar SUCESORES de MEJORNODO
para cada SUCESOR hacer TRATAR_SUCESOR
hasta SOLUCION_ENCONTRADA o FALLO

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

S-ar putea să vă placă și