El algoritmo Pathfindig A* (A estrella o A asterisco), es el más conocido de todos para encontrar el camino más corto entre un punto dado (A) y otro punto (B). Es muy usado en juegos, el primero en usarlo fue el famoso Pac-Man (Para los fantasmitas).
El método que explicaré esta "algo" retocado por mí, más que nada porque generalmente lo he usado en ActionScript y he querido mejor el rendimiento. Aunque esta MUY poco tocado, básicamente simplifique los valores de la fórmula y edité el uso de listas abiertas/cerradas para no guardar basura en la RAM.
No nos enfocaremos en código sino en la comprensión del Algoritmo. Hay algunos ejemplos de todas formas aquí en Clab.
Escenario base para el algoritmo A estrella o A asterisco
Imaginen tenemos un mapa o escenario, dónde encontraremos dos puntos A (Azul) y B (Rojo). Así como obstáculos (Negro).

Lo primero debemos hacer es representar este mapa a nivel lógico, por ello lo dividiremos en una cuadricula:

Cada cuadrado en la cuadricula es un punto de movimiento (El movimiento mínimo que podremos obtener). El sistema realmente puede usar cualquier figura geométrica poligonal. Los cuadrados son más fáciles.
Convertir nuestro escenario o mapa a datos
Ahora el problema es como representamos a nuestro código una cuadricula. Pues en realidad fácil, con una cuadricula o Array, donde señalaremos 0 para espacio vació, 1 espacio ocupado.
Para mi ejemplo:
Código :
[0,0,0,0,0,0] [0,0,1,0,0,0] [0,0,1,0,0,0] [0,0,1,0,0,0]
Notarán no puse los puntos de espacio de A ni B, dado que podrían ser dinámicos. Esos los manejaremos con posición:
Código :
A = [0,0] B = [5,2]
Algoritmo PathFinding A* explicado para humanos
La formula del Pathfinding A* es realmente simple:
Código :
Movimiento = Esfuerzo + Heurística
Primero que nada, debemos entender que solo podemos movernos hacia 8 direcciones: 2 Horizontales, 2 Verticales (Valores Ortogonales) y 4 Diagonales.
Cada movimiento le asignaremos un valor definido (El cálculo real usa raíces, pero no consume bastante más):
Código :
Valor Ortogonal = 10 Valor Diagonal = 14
Así que el esfuerzo será determinado según el movimiento que haremos, Ortogonal u Horizontal:

La variable Heurística en cambio, es una variable "a ojo". Como no sabemos el valor real, calcularemos la distancia entre A <-> B[Análisis] desde sus valores Ortogonales sin obstáculos. Lo cual es fácil, ya que sabemos la posición en la matriz de ambos objetos.
Código :
Heuristica desde Punto B (Inicial) = 7 * 10
O lo que es más correcto:
Código :
Heuristica = Distancia desde el punto de Analisis * 10
Hemos sumado 10 ya que tenemos una incertidumbre incierta, esto debería cubrirnos.
Este método de calcular la Heuristica se llama Manhattan.
Mejorar el rendimiento del Algoritmo A* estrella/asterisco
Siempre que uso el Pathfinding A* debo admitir no lo hago exactamente así, ya que nunca me ha gustado calcular 8 direcciones, cuando se para qué dirección quiero ir (Derecha o Izquierda).
Generalmente lo que hago es "eliminar" las posiciones de cálculo que no corresponden al lugar donde quiero ir. Esto lo hago calculando si mi posición desde B hacia A es negativa o positiva:
Código :
Direccion = Posicion B Horizontal - Posicion A Horizontal
Esto elimina una buena parte del cálculo (Ahora veremos porque esto nos preocupa).

Calcular el camino más corto
Antes que nada, debemos saber que calcularemos a la inversa, desde el punto B hacia el A (Por practicidad). Es lo mismo el path de ida que de venida, así que no afectará nada.
Para calcular debemos crear una progresión usando la fórmula que ya sabemos. Nos paramos en la posición B, y calculamos cual es el valor de B que más nos conviene tomar según la fórmula que ya conocemos.
Código :
Valor = G + H

Deberán ejecutar la fórmula pero evaluando que el cálculo sea posible, si el cuadrado es 0 (libre) o 1 (ocupado). En caso de 1 no valdrá el camino. Incluso pueden ejercer una regla, donde la diagonal no sea posible si su ortogonal esta ocupada (Es a criterio de cada uno).
Camino Final calculado por A*
Obviamente calcular el camino final implicará ir eligiendo el valor más corto y desde allí replicar la fórmula hasta llegar al punto A. Luego obviamente revertir la lista.

Resultado:
Código :
Movimiento 1 = [1][0] Movimiento 2 = [2][0] Movimiento 3 = [3][1] Movimiento 4 = [4][2]
Aplicaciones del Pathfinding A*
Este algoritmo de Inteligencia Artificial es muy útil para calcular el camino óptimo entre el punto A y B. Aunque también nos sirve para estimar comparativas. Si sabemos cual es el valor de todo el movimiento del camino y sabemos el valor del camino que hizo el usuario, podemos estimar cual fue su eficiencia.
Si lo que queremos usar es mapas, este Algoritmo debe ser aplicado mediante Waypoints.
Espero les sirva

Saludos, Hernán . -
Cabe señalar que la idea se puede extender de muchas maneras, como por ejemplo asignándole un valor diferente a la distancia según el tipo de camino que se tratase (para que por ejemplo no sea lo mismo desplazarse por carretera que por bosque. Quedaría:
Código :
donde multiplicador_de_dirección es 1 para las direcciones paralelas y raiz de 2 (1.4) para las diagonales.
y velocidad_de_la_baldosa puede depender del tipo de terreno, del objeto que se esté moviendo, de si hay transición entre terrenos distintos, o incluso de si la IA estima que es más o menos probable encontrarse con enemigos.
Saludos.
Si un día tengo un tiempo muerto por ahí, veré si hay maneras de optimizarlo.
Dano :
Si un día tengo un tiempo muerto por ahí, veré si hay maneras de optimizarlo.
Sería genial, ya que en grandes mapas, el rendimiento es una variable importante. Si te sirve, un tip, dónde hice la parte de las direcciones, nunca quede demasiado conforme con la doble validación de Dir -> + Usar 8 Valores Anteriores para cálcular no volver para atrás. Siempre pensé habría una manera más prólija.
Saludos, Hernán . -
Por [Sheer] el 04 de Octubre de 2010
Por otra parte, me da la sensación que, al eliminar posiciones, das por hecho que el camino más rápido será hacia las posiciones que mantienes, pero pueden haber obstáculos que hagan como camino más rápido o incluso único, el ir hacia las direcciones anuladas.
Vale, veo que has aclarado ésto en el primer comentario pero, aun y así, solo se habilitarian en caso de que las mantenidas no tengan solución, pero... ¿y si tienen solución pero ir hacia atrás sería más rápido?
¡O quizá se me esté escapando algo!
[Sheer]-blog :
¡O quizá se me esté escapando algo!
Pues nunca ir para atrás es más rápido, menos si estamos estimando con Heurística los cálculos, que solo nos dirán la distancia del Punto B[Analizado] al Punto A. La lógica implica que si caminamos en dirección "correcta", siempre deberíamos obtener un valor más bajo de H, ergo, siempre saldrán esos valores elegidos, evitando el cálculo de 3 variables por interacción.
Please que alguien me corrija si estoy equivocándome en mi análisis.
Saludos, Hernán . -
Realmente lo expones como 4dummies.
Para hacerlo realmente inteligente, considera cada cuadro como un agente, para que se convierta en un sistema multiagente. Agregando un algoritmo de comunicación entre agentes y un algoritmo de asynchronous backtracking. Si consideras todo como restricciones dentro de las heurísticas, puedes lograr que resuelva un problema extremadamente complicado, aunque la capacidad de procesamiento necesaria es relativa a la complejidad y tamaño.
Esto es ya para un sitema inteligente más grande y con más complicaciones. Es parte de la Teoría de Juegos.
daz_angie-blog :
Realmente lo expones como 4dummies.
JAJA gracias, intentaba justamente crear una atmosfera sencilla, estoy harto que todo lo que sea sinónimo de "interesante" sea igual a "no lo podrás leer"
daz_angie-blog :
Interesante idea, intentaré abordar la esquemática en siguientes tips. Aún me falta muuucho para llegar a eso je.
Gracias
Hernán :
daz_angie-blog :
Interesante idea, intentaré abordar la esquemática en siguientes tips. Aún me falta muuucho para llegar a eso je.
Lo que necesites de ese tema o AI dime. Me estoy especializando en eso
bien Hernan, son genial ese tipo de articulos
eveevans-blog :
bien Hernan, son genial ese tipo de articulos
JAJA no, solo tenía un tiempo y me puse a escribirlos jajaja..
Aún tengo varios en mente, pero mi semana no fue tan bien en tiempos como esperaba jaja
Por Mauro Cifuentes el 06 de Octubre de 2010
pueden verlo en accion en http://www.whitecat.com.ar/demos/astar
Por Kerly el 02 de Julio de 2011
Por leomont el 10 de Abril de 2012
Por leomont el 10 de Abril de 2012