Está en la página 1de 21

BSQUEDA HEURSTICA

Introduccin



La bsqueda es una de las tcnicas ms utilizadas para resolver los problemas de
pathfinding o planificacin que se presentan en la inteligencia artificial en los juegos de
vdeo. En particular, la bsqueda es utilizada para resolver el problema de la navegacin.

La constante evolucin de los juegos de vdeo ha llevado a que la inteligencia artificial
constituya uno de los aspectos ms importantes; es fundamental que los agentes (entidades
autnomas) controlados por la computadora se comporten en forma inteligente. Un
problema caracterstico es la navegacin, que consiste en determinar el camino ms
conveniente entre una posicin inicial y una posicin de destino. Si bien el planteo del
problema es sencillo, el mismo est lejos de ser trivial debido a la creciente complejidad de
los entornos simulados y los requerimientos de tiempo real de los juegos modernos.



Clasificacin de los algoritmos de bsqueda.










Definicin



La bsqueda es una tcnica para resolver problemas cuya solucin consiste en una serie de
pasos que frecuentemente deben determinarse mediante la prueba sistemtica de las
alternativas. Desde los inicios de la Inteligencia Artificial, la bsqueda se ha aplicado en
diversas clases de problemas como juegos de dos jugadores, problemas de satisfaccin de
restricciones y problemas de un nico agente.

Por lo tanto se puede decir que los algoritmos de bsqueda heurstica son mtodo
computacional para resolver problemas de pathfinding bsqueda de la mejor ruta del punto
A al punto B.

De los distintos tipos de algoritmos de bsqueda, los algoritmos bsqueda heurstica
completa se encuentran ampliamente difundidos, el algoritmo A* es el algoritmo de
bsqueda heurstica ms popular.



Algoritmo de bsqueda A*

DEFINICIN

El algoritmo de bsqueda A* o tambin denominado A Estrella se encuentra dentro de los
tipos de algoritmos de bsqueda en grafos, representado por Peter E. Hart, Nils J. Nilsson y
Bertram Rpale, en 1968.

El algoritmo A* es el nico que garantiza, sea cual sea la funcin heurstica, que se tiene en
cuenta el camino recorrido y por ende es mejor que la versin ms extendida de "primero el
mejor", aqulla que slo considera la distancia a la meta. En definitiva, s tiene razn en el
caso concreto que usted plantea, pero no la tiene en general.










REPRESENTACIN

A continuacin se muestra la clsica representacin del algoritmo A *.


Donde:

g (n) es la distancia total que ha tomado para llegar desde la posicin inicial a la ubicacin
actual.

h '(n) es la estimacin de la distancia desde la posicin actual con el destino, es una funcin
heurstica se utiliza para crear esta estimacin sobre cuan lejos se esta para alcanzar la meta.

f '(n) es la suma de g (n) y h' (n). Este es el camino actual estimado ms corto. f (n) es el
verdadero camino ms corto que no se descubrieron hasta que el algoritmo A * ha
terminado.

Ejemplo: Una familia cuando se dirige de vacaciones, y uno pregunta al padre que esta al
volante, "Cunto ms falta para llegar?", a lo cual el Papa dir supongo "Otras 300 millas,
si la familia ya haba conducido 100 millas en ese punto, que representan g (n), el total de
distancia recorrida hasta el momento. La estimacin de 300 millas se h '(n), el adivinar en
cunto ms sera. Por lo tanto, el f '(n) sera de 100 + 300 = 400 millas.




Ejemplo: pequeo juego.



f'(n) = g(n) + h'(n)



CARACTERISTICAS

! Realiza la bsqueda informada teniendo en cuenta dos factores fundamentales, el
valor heurstico de los nodos y el coste real del recorrido.

! Se utiliza en la bsqueda de un camino ms corto.

! El Algoritmo no desarrolla un camino por interaccin, sino que desarrolla varios
caminos y elige los ms prometedores.

! Tiene algunas buenas referencias y consejos acerca elementos de juego de la
programacin y la industria del juego, ejemplo tetris, camino ms corto entre dos
puntos.

! Es una combinacin entre bsquedas del tipo primero en anchura con primero en
profundidad: mientras que h(n) tiende a primero en profundidad, g(n) tiende a
primero en anchura. De este modo, se cambia de camino de bsqueda cada vez que
existen nodos ms prometedores.

! Si para todo nodo n del grafo se cumple que g(n) = 0, nos encontramos ante una
bsqueda voraz. Si para todo nodo n del grafo se cumple h(n) = 0, el algoritmo A*
pasa a ser una bsqueda de coste uniforme no informada.

! Para garantizar la optimalidad del algoritmo, la funcin h(n) debe ser admisible,
quiere decir que no sobrestime el coste real de alcanzar el nodo objetivo, si fuese as
el algoritmo pasa a denominarse simplemente A, debido a que no se asegura que el
resultado obtenido sea el camino de coste mnimo.

! Debido a que se tiene que almacenar todos los posibles siguientes nodos de cada
estado, la cantidad de memoria que requerir ser exponencial con respecto al
tamao del problema.











APLICACIONES

Se mencionar algunas aplicaciones:

Minera de datos, bsqueda de comportamiento en los datos.


Procesamiento de imgenes.

Medicina humana, software mdicos, control de tumores, problemas cancerigenos,


VESALIO.

En la aeronavegacin y transporte, el pilotaje automtico, bsquedas de rutas mas


prximas.

Video juegos de estrategia, camino ms corto, ejemplo Pacman: Los fantasmas que
persiguen a Pacman buscan el camino mas corto, en lugar de aparecer en forma
aleatoria en el Mapa del Juego.

Juegos, ejemplo Age of Empires, un juego de conquista de civilizaciones, los


enemigos salvan obstculos para llegar a la ciudad del adversario.






SEGUIMIENTO Y EXPLICACION DEL PSEUDOCODIGO

Para explicar el funcionamiento del cdigo primero vamos a ver algunas definiciones
funcionamientos previos respecto a las reas de bsquedas.















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, esto se puede ver 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.





















Lo primero que deberas advertir es que hemos dividido nuestra 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". Cuando leas en cualquier otro sitio sobre
pathfinding, a menudo vers a gente hablando sobre nodos. Acaso no es ms fcil referirse
a ellos como cuadrados? 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. Se usa este sistema porque es el ms simple.




Iniciando la Bsqueda

Una vez que hemos simplificado nuestro rea de bsqueda en un nmero de nodos
accesible, 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*, 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.
Se explicar ms adelante.
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. Esta 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.


















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, cual 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.), existen muchas formas de calcular H.


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 (no temas), o mas 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. Esto no es solo porque seamos idiotas y no nos gusten las
matemticas; usar nmeros enteros tambin es mucho ms rpido para el ordenador. Pronto
descubrirs que el pathfinding puede ser muy lento si no usas atajos como este.



Ahora que hemos calculado el coste G mediante un camino especfico hasta cierto cuadrado,
la forma de resolver el coste G del cuadrado es coger el coste G de su padre, y luego
aadirle 10 o 14 dependiendo de si est en diagonal u ortogonal(no diagonal) con respecto a
ese cuadro padre. Este mtodo se har ms claro cuando llevemos este ejemplo un poco ms
all y nos alejemos un cuadro del inicial.



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


























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.




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 imagen mostrada.






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, cual 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 figura se ve mas claro:



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 como 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 imagen de abajo:

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
suya. 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 si 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.





Resumen del Mtodo A*

Ahora que has ledo la explicacin, vamos a resumir el mtodo paso a aso:
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.















CONCLUSIONES


! La implementacin esta involucra almacenar todos los posibles siguientes nodos de
cada estado, la cantidad de memoria que requerir ser exponencial con respecto al
tamao del problema.
! Los puntos tratados en el trabajo sintetizan las conclusiones.


Un poco de charlatanera
Perdname por divagar pero es importante sealar que cuando leas varias discusiones sobre
el pathfinding A* en la web y en diferentes foros, alguna vez vers que alguien se refiere a
cierto cdigo como A* cuando en realidad no lo es. Para el mtodo A* necesitas incluir los
elementos que hemos explicado arriba - especficamente listas cerradas y abiertas y
puntuacin del camino usando F,G y H. Hay muchos otros algoritmos de pathfinding, pero
esos otros mtodos no son A*, el cual es generalmente considerado como el mejor. Bryan
Stout habla sobre muchos de ellos en el artculo al que se hace referencia al final de este,
incluyendo algunos de sus pros y contras. Algunas veces las alternativas son mejores bajo
determinadas circunstancias, pero deberas comprender en lo que te ests metiendo. Bueno,
suficiente rollo por hoy, volvamos al artculo.
Notas sobre la implementacin
Ahora que comprendes el mtodo bsico, aqu tenemos algunos temas adicionales para
cuando ests escribiendo tu propio programa. Alguno de los siguientes materiales hacen
referencia al programa que he escrito en C++ y en Blitz Basic, de todas formas, los puntos
son igualmente vlidos en otros lenguajes.
1. Manteniendo la Lista Abierta: Suele ser uno de los elementos que ms tiempo consume
en la funcin del pathfinding A*. Cada vez que accedes a la lista abierta necesitas encontrar
el cuadrado que tiene el coste F ms bajo. Hay varias formas en las que podras hacerlo.
Podras guardar los elementos del camino segn los necesites y simplemente recorrer la lista
entera cada vez que necesites encontrar el cuadrado con el coste F ms bajo. Esta es fcil,
pero es una manera muy lenta para caminos largos. Puedes mejorarlo manteniendo una lista
ordenada y simplemente cogiendo el primer elemento de la lista cada vez que necesites el
cuadro con el coste F ms bajo. Cuando escrib mi programa de demostracin, este fue el
primer mtodo que us.
Aunque esto funciona razonablemente bien para pequeos mapas, no es la solucin ms
rpida. Programadores serios de A* que buscan ms velocidad, usan algo llamado Heap
binario que es lo que us en mi cdigo. En mi opinin, es aproximadamente de 2 a 3 veces
ms rpido que el orden estndar en la mayora de las situaciones, y tambin
geomtricamente ms rpido ( + de 10 veces) en caminos largos. Si ests motivado para
saber ms acerca de las Pilas Binarias, chale un vistazo a mi artculo, Usando Pilas
Binarias en un Pathfinding A. (Nota del traductor: de los 4 artculos del autor, este ha
presentado la mayor complejidad, quiz.)
2. Otras Unidades: Si se te ocurre examinar mi cdigo de ejemplo, vers que ignora
completamente otras entidades que haya en el mapa. Los criterios en los que se basa mi
pathfinding consisten en ir derechos desde un punta A hasta uno B. Dependiendo del juego,
quizs vaya bien o no. Si quieres considerar otras entidades en el mapa y que las entidades
interacten entre s, te sugiero que no tengas en cuenta esas nuevas entidades en el cdigo
del pathfinding y que lo aadas como cdigo nuevo y externo. (consideramos entidades, a
todo aquello que pueda influir en el camino de un personaje). Imagina, por ejemplo, que el
personaje debe ir hasta un punto del mapa y en su camino se tropieza con otro personaje, tal
vez en casos como este quieras que tu personaje genere un nuevo camino o que use algunas
reglas estndar de movimiento (p. e. que siempre lo rodee movindose hacia la derecha, o
que si este personaje es daino, se aleje,...) hasta que el obstculo ya no se encuentre en su
camino para generar de nuevo otro. Por qu no incluir esas entidades cuando estemos
calculando el camino inicial? Porque esas entidades quizs estn dotadas de movimiento y
cuando llegues a su posicin puede que ya no estn. Por este motivo, tenerlas en cuenta
podra generar extraos resultados; tal vez esquivando en su camino a una entidad que ya no
est all o "pisoteando" a aquellas que se desplazaron a una situacin dentro del camino tras
haber sido calculado.
No obstante, ignorar otras unidades dentro del pathfinding significa que necesitars escribir
cdigo por separado para manejar colisiones. Este apartado es especfico de cada juego, as
que dejo la resolucin del problema a tu criterio. El artculo de Bryan Stout ! s, en la seccin
de referencias al final de este documento, es una valiosa fuente para aprender algunas
posibles soluciones (como el robust tracing (trazado robusto), etc..).
3. Algunos Trucos para Obtener ms Velocidad: Cuando desarrolles tu propio programa
A*, o adaptes el que he escrito, quizs te des cuenta de que el pathfinding est consumiendo
gran parte del tiempo de proceso de tu CPU. Esto es particularmente notorio si tienes un
mapa (razonablemente) grande y un nmero decente de personajes en l. Si lees el material
existente en internet, vers que esto les pasa incluso a los profesionales que disean juegos
como Starcraft o Age of Empires. Si ves que algunas cosas empiezan a ir ms despacio por
el pathfinding, aqu tienes algunas ideas que podran acelerarlas:
Considera la utilizacin de un mapa pequeo o unos pocos personajes.
Nunca busques el camino para ms de unos pocos personajes al mismo tiempo. En
vez de ello, ponlos en una cola y realiza las bsquedas por grupos en varios ciclos de
juego. Si tu juego est funcionando en, por ejemplo, 40 ciclos por segundo, nadie lo
notar. Pero cuando un buen puado de personajes estn intentando buscar
simultneamente su camino, te aseguro que tu programa ir ms lento que una
tortuga.
Considera el uso de cuadrados ms grandes para tu mapa. Esto reduce el nmero total
de cuadrados que sern comprobados para encontrar el camino. Si eres ambicioso,
puedes idear 2 o ms sistemas de pathfinding que se usen en diferentes situaciones
dependiendo de la longitud del camino. Esto es lo que hacen los profesionales, usan
reas grandes para pathfinding largos, y luego afinan la bsqueda con reas ms
pequeas cuando se acercan al objetivo. Si ests interesado en este concepto, chale
un vistazo a mi artculo Pathfinding A* de 2 niveles.
Considera el uso de un sistema de waypoints (paradas) para caminos largos o ingenia
caminos precalculados que estn incluidos en el juego.
Considera "pre-procesar" tu mapa para calcular qu reas son inaccesibles desde el
resto del mapa. Yo llamo a esas reas "islas". En realidad, pueden ser islas o
cualquier rea que est amurallado y sea inaccesible. Uno de los inconvenientes de
A* es que si tu le dices que busque caminos en un rea, el los buscar teniendo en
cuenta el mapa entero, detenindose solo cuando cada nodo/cuadro accesible haya
sido procesado mediante las listas abierta y cerrada. Eso puede desperdiciar mucho
tiempo de CPU. Es posible prevenirlo determinando que reas son inaccesibles (va
flood-fill o rutina similar), almacenando esa informacin en una matriz de algn tipo,
y luego comprobndolo antes de empezar a buscar el camino. En la versin Blitz de
mi cdigo, he creado un mapa "pre-procesado" que hace esto. Tambin estn pre-
identificados los callejones sin salida que el algoritmo pathfinding puede ignorar,
cosa que acelera bastante las cosas.
4.- Variable de Coste del Terreno: En este tutorial y en mi programa acompaante, el
terreno es solo una de dos cosas - transitable o intransitable. Pero qu pasa si tienes un
terreno transitable pero con un coste de movimiento mayor? Pantanos, colinas, escaleras en
un dungeon, etc... - son todos ejemplos de terrenos transitables pero con un coste de
movimiento mayor que el de un terreno liso y abierto. Igualmente, una carretera podra tener
un coste de movimiento menor que el terreno circundante.

Este problema se soluciona fcilmente aadiendo el coste del terreno cuando calcules el
coste G del cuadro sealado. Simplemente aade un coste extra a cada cuadro. El algoritmo
A* ya est escrito para encontrar el camino con el coste ms bajo y manejarlo fcilmente.
En el simple ejemplo que he descrito, cuando el terreno es solo transitable o intransitable, el
A* busca el camino ms corto y directo. Pero en un entorno con un terreno de coste
variable, el camino con un coste menor podra significar viajar una mayor distancia - como
coger una carretera que rodea un pantano en vez de atravesarlo directamente.

Una interesante consideracin adicional es lo que algunos profesionales llaman "mapa de
influencia". Al igual que el terreno de coste variable, podras crear un sistema de puntuacin
adicional y aplicarlo a los caminos para propsitos de IA. Imagina que tienes un mapa con
un buen puado de malhechores defendiendo un paso a travs de una regin de montaa.
Cada vez que el ordenador enviase a alguien por un camino que atravesase el paso, lo
enviara a una muerte segura. Si quieres, podras crear un mapa de influencia que penalice
los cuadros donde se est produciendo alguna carnicera. Esto podra ensear al ordenador
caminos seguros, y le ayudara a evitar situaciones estpidas en las que enva tropas y
personajes segn un camino en particular y slo porque es el ms corto (pero tambin el
ms peligroso).
5.- Manejando reas Inexploradas: Has jugado alguna vez a un juego de PC donde el
ordenador siempre sabe exactamente qu camino tomar, incluso aunque el mapa no haya
sido explorado todava? Dependiendo del juego, un pathfinding que sea demasiado bueno
puede ser irreal. Afortunadamente, es un problema que puede resolverse con absoluta
facilidad.
La solucin es crear una matriz "traspasabilidadConocida" aparte para cada uno de los
jugadores y oponentes controlados por el ordenador (cada jugador, no cada unidad - ya que
requerira mucha mas memoria). Cada matriz contendra informacin sobre las reas que el
jugador ha explorado, con el resto del mapa considerado como transitable hasta que se
demuestre lo contrario. Usando esta aproximacin, las unidades no evitarn callejones sin
salida y harn elecciones errneas similares hasta que aprendan el camino. Sin embargo, una
vez que el mapa est explorado, el pathfinding funcionar normalmente.
6. Caminos ms Suavizados: Aunque un A* te dar automticamente el camino ms corto y
de coste menor, no te dar automticamente el camino ms suavizado. chale un vistazo al
camino final calculado en nuestro ejemplo (figura 7). En ese camino, el primer paso es en
diagonal hacia abajo y a la derecha del cuadro inicial. No sera nuestro camino ms
suavizado si el primer paso en vez de ser en diagonal fuese directamente hacia abajo?
Hay varias formas de tratar este problema. Cuando ests calculando el camino podras
penalizar cuadros donde hay un cambio de direccin, aadiendo una penalizacin de sus
puntuaciones G. Alternativamente, podras recorrer tu camino tras haberlo calculado,
buscando lugares donde elegir un cuadro adyacente le dara un aspecto mucho mejor. Para
ms informacin lee Toward More Realistic Pathfinding, un artculo (gratis, pero requiere
registrarse) de Gamasutra.com, escrito por Marco Pinter.
7.- reas de Bsqueda No Basadas en Cuadros: En nuestro ejemplo, hemos usado una
simple capa de cuadros 2D. No ests obligado a hacer uso de lo mismo, podras usar reas
de formas irregulares. Piensa en el tablero del Risk y en los pases en el juego. Podras
inventar un pathfinding para el escenario de un juego como ese. Para conseguirlo,
necesitaras crear una tabla para almacenar que pases son adyacentes entre s, y un coste
asociado con el movimiento de un pas al siguiente.. Tambin necesitaras dar con un
mtodo para calcular H. El resto de cosas seran iguales que en el ejemplo de arriba. En vez
de usar cuadros adyacentes, simplemente buscaras pases cercanos cuando aadas nuevos
elementos a tu lista abierta.
Igualmente, podras crear un sistema de waypoints (paradas) para los caminos en un mapa
de terrenos adjunto. Los waypoints son normalmente puntos en una ruta (como las paradas
de un autobs o metro), quizs en una carretera o en un tnel clave de un dungeon. Como
diseador de juego, podras preasignar esos waypoints. Dos waypoints seran considerados
"adyacentes" entre ellos si no hay obstculos en la lnea recta que les separa. Al igual que en
el ejemplo del Risk, deberas almacenar esta informacin de adyacencia en una tabla de
alguna clase y usarla cuando generes una nueva lista de elementos. Despus deberas
guardar los costes G asociados (quiz usando la lnea directa entre nodos) y los costes H
(talvez usando una lnea directa desde el nodo hasta el objetivo). El resto funcionara igual
que en el ejemplo de la explicacin principal.
Para otros ejemplos de bsqueda en un mapa de un RPG isomtrico usando un rea de
bsqueda no basada en cuadros, mira mi artculo Pathfinding A* de 2 niveles.
Leyendo ms all.
Bueno, ahora que tienes los fundamentos y una nocin de algunos conceptos avanzados. En
este punto, te sugerira que te sumerjas en mi cdigo fuente. El paquete contiene 2
versiones, una en C++ y otra en Blitz Basic. ambas versiones estn extensamente
comentadas y deberan ser totalmente asequibles para el lector (relativamente hablando).
Aqu est el enlace:
A* Pathfinder (2D) Versin 1.71
Si no tienes acceso a C++ o a Blitz Basic, hay 2 pequeos archivos exe en la versin C++.
La versin Blitz Basic puede ejecutarse ejecutndola mediante la demo gratis de la versin
Blitz Basic 3D del programa (no Blitz Plus) descargndola de su web oficial en Blitz Basic.
Tambin deberas considerar la posibilidad de leer la siguientes pginas. Sern mucho ms
fciles de comprender ahora que has ledo este tutorial.
Amits A* Pages: Extensa pgina de referencia creada por Amit Patel, pero puede ser
un poco confusa si no has ledo este artculo primero. Lee atentamente el enlace
thoughts en su pgina.
Smart Moves: Intelligent Path Finding: Articulo de Bryan Stout en Gamasutra.com,
requiere estar registrado para leerlo. El registro es gratuito y no solo te dar acceso a
ese artculo, sino tambin a otros muchos recursos disponibles. El programa escrito
en Delphi de Bryan me ayud a aprender el A*, y hay mucho de l en el mo.
Tambin describe algunas alternativas a este algoritmo.
Terrain Analysis: Este es un avanzado pero interesante artculo de Dave Pottinger, un
profesional de Ensemble Studios. Este to coordin el desarrollo de Age of Empires y
Age of Kings. Aunque es un buen artculo que podra darte buenas ideas, no esperes
comprenderlo todo. Incluye algunas discusiones acerca de mip-mapping, influence
mappinng y algunos otros conceptos avanzados de pathfinding/IA. La discusin
acerca del "flood-filling" fue una inspiracin para mi propio cdigo de proceso de
callejones sin salida e islas que est incluido en la versin Blitz de mi programa.

Algunos otros sitios interesantes son:
aiGuru: Pathfinding
Game AI Resource: Pathfinding
GameDev.net: Pathfinding
Bueno, eso es todo. Si llegas a escribir un programa que usa cualquiera de estos
conceptos, me encantara verlo. Si quieres puedes enviarlo a:

Hasta entonces, buena suerte!

También podría gustarte