INFORME Algoritmo A
INFORME Algoritmo A
INFORME Algoritmo A
Es ampliamente utilizado en las ciencias de la computación para encontrar rutas y que tan
transitable es una gráfica, es decir, se refiere al problema de visitar todos los nodos en una
gráfica dada de forma particular , esto no es más que el proceso de trazado de la ruta más
eficiente entre unos puntos llamados nodos. Este algoritmo goza de una aceptable y
continua implementación gracias a su desempeño y precisión. Fue descrito por primera
vez en 1968 como una extensión del algoritmo de Dijkstra (1959), por Peter Hart, Nils
Nilsson y Bertran Raphael, que expusieron que el A* lograba un mejor desempeño con
respecto al tiempo usando heurísticas.
En 1964 Nils Nilsson inventó una heurística basada en aproximaciones para incrementar la
velocidad del algoritmo de Dijkstra. Este algoritmo fue llamado inicialmente como A1.
En 1967 Bertran Raphael hizo mejoras dramáticas sobre este algoritmo pero falló en
demostrar su optimalizad. Él llamó a este algoritmo como A2. Hart introdujo un
argumento que el A2 era óptimo usando una heurística consistente haciendo unos
cambios menores. Su comprobación del algoritmo también demostró que el A2 era el
mejor algoritmo dadas algunas condiciones. Así Hart llamó a este nuevo algoritmo con la
sintaxis “Kleene star” (debido a que representa una operación con solamente un operando
[5, 6]) por ser un algoritmo que empieza con la letra A e incluye todas las versiones de
números posibles o A*. El algoritmo A*, (leído A estrella) es un algoritmo de búsqueda en
Universidad Nacional de Trujillo 2
grafos. Fue presentado por Peter E. Hart y Nils J. Nilsson (1968), y Bertram Raphael (1968),
el algoritmo encuentra, siempre y cuando se cumplan unas determinadas condiciones, el
camino de menor coste entre una condición inicial y una condición meta.
Este algoritmo en particular es uno de los más adecuados ya que según los creadores del
mismo es un algoritmo que encuentra el camino de menor coste de un recorrido A aun
recorrido B.
Es un algoritmo que se encarga de encontrar la ruta que representa un menor costo entre
un punto A y otro B. Es una técnica de búsqueda para grafos que utiliza una función
heurística (ya que trata de métodos exploratorios durante la resolución del problema en el
cual la solución se descubre por la evaluación del progreso logrado en la búsqueda de un
resultado final denotada f ’(x), la cual es una aproximación a f(x) que proporciona la
verdadera evaluación de un nodo para determinar el orden en que se realiza la visita a los
otros nodos del árbol. La función de evaluación es el resultado de la suma de otras dos
funciones, una que indica el coste del camino que se ha seguido hasta un cierto nodo la
cual se representa como g(x) y otra que nos da una estimación de la distancia del punto o
nodo en que nos encontramos hasta la meta que está representada como h(x). Entonces la
función de evaluación es el resultado de la suma de h(x) y g(x).
Donde:
Cuando comenzamos a analizar el problema nuestro nodo origen tiene un valor inicial 0
(cero) tanto en h como en g.
Donde:
De esta forma podemos empezar a realizar los cálculos para cada uno de los nodos que se
vayan analizando. Este algoritmo consiste entonces en atravesar una gráfica (de forma
definida normalmente) siguiendo una ruta con el menor costo conocido manteniendo una
cola sorteada de prioridades con segmentos de rutas alternas a lo largo del camino para
que si en un momento dado la ruta que se está siguiendo arroja un valor (costo) superior
en comparación con otro segmento de ruta encontrado, esta abandona esa ruta actual de
alto coste y en vez de ella toma la que le brinda un camino más “barato”. De esta forma el
proceso sigue hasta alcanzar la meta u objetivo.
Empezando en un nodo inicial dado, el algoritmo expande el nodo con el menor valor de
f’(x). Este algoritmo mantiene un conjunto de soluciones parciales almacenadas en una
cola de prioridad. El proceso continua hasta que una meta tiene un valor f’(x) menor que
cualquier otro nodo en la cola o hasta que el árbol ha sido recorrido completamente.
Como aspecto positivo podemos considerar que ningún otro algoritmo óptimo nos
garantiza expandir menos nodos que A*, pero éste requiere un alto consumo de memoria
De manera general este algoritmo se utiliza para encontrar el camino más corto entre dos
puntos dados, pero dentro de sus otras aplicaciones se utiliza en juegos para determinar el
recorrido que un objeto debe realizar; un ejemplo de ello es el videojuego pacman en el que
se aplicaba al comportamiento de los fantasmitas y en la resolución de los problemas de
Sudoku de 8 variables. También se puede utilizar para resolver el cubo Rubik mostrándonos
cómo hacerlo con la menor cantidad de movidas.
Debemos tener en cuenta que hay circunstancias en las que no es sencillo encontrar una
buena función heurística pero también es válido especificar que sea cero ya que la misma
debe ser estimada por defecto.
En la figura 1 se puede apreciar a través del uso de ‘ * ’ las barreras que por naturaleza se nos
están infligiendo, mismas que provocarán que el algoritmo tome una serie de decisiones para
elegir el camino que más le conviene.
En la última parte que se muestra en la ventana donde nos especifica el trayecto o la ruta a
recorrer se lee de derecha izquierda siguiendo el orden de las flechas.
buen algoritmo de búsqueda informada debería tener en cuenta ambos factores, el valor
heurístico de los nodos y el coste real del recorrido.
representa el valor heurístico 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), y
cerrados, donde se guarda la información 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.
El algoritmo es una combinación entre búsquedas del tipo primero en anchura con primero en
Si para todo nodo n del grafo se cumple , nos encontramos ante una búsqueda
voraz. Si para todo nodo n del grafo se cumple , A* pasa a ser una búsqueda de
coste uniforme no informada.
Para garantizar la optimalidad del algoritmo, la función debe ser admisible, esto es, que
no sobrestime el coste real de alcanzar el nodo objetivo.
la complejidad será exponencial, mientras que en el caso mejor, con una buena , el
algoritmo se ejecutará en tiempo lineal. Para que esto último suceda, se debe cumplir que
8. Complejidad en memoria
El espacio requerido por A* para ser ejecutado es su mayor problema. Dado que tiene que
almacenar todos los posibles siguientes nodos de cada estado, la cantidad de memoria que
requerirá será exponencial con respecto al tamaño del problema. Para solucionar este
problema, se han propuesto diversas variaciones de este algoritmo, como pueden ser RTA*,
IDA* o SMA*.
9. Implementación en pseudocódigo
f'(INICIAL) := h'(INICIAL)
repetir
si ABIERTOS = [] entonces FALLO
si no // quedan nodos
extraer MEJORNODO de ABIERTOS con f' mínima
// 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
TRATAR_SUCESOR
SUCESOR.ANTERIOR := VIEJO
// coste del camino hasta SUCESOR
1. Empezar con ABIERTO conteniendo sólo el nodo inicial. Poner el valor g de ese nodo a O,
su valor h' al que corresponda, y su valor f' a h' + O, es decir h'. Inicializar CERRADOS como
la lista vacía.
2. Repetir el siguiente procedimiento hasta que se encuentre el nodo meta: si no existen
nodos en ABIERTOS, informar del fallo. De lo contrario, tomar aquel nodo de ABIERTOS
con mejor valor f'. Llamarle MEJORNODO. Quitarlo de ABIERTOS. Colocarlo en CERRADOS.
Mirar si MEJORNODO es un nodo meta. Si lo es, salir e informar de la solución (bien sea
MEJORNODO si lo único que queremos es el nodo, o el camino que se ha creado entre el
estado inicial y MEJORNODO si estamos interesados en el camino). En caso contrario,
generar los sucesores de MEJORNODO, pero no poner MEJORNODO apuntando aún a
ellos (antes debemos mirar si alguno de ellos ya ha sido generado). Para cada SUCESOR,
hacer lo siguiente:
a) Poner a SUCESOR apuntando a MEJORNODO. Estos enlaces hacia atrás hacen
posible recuperar el camino una vez que se ha encontrado la solución.
b) Calcular g (SUCESOR) = g (MEJORNODO) + costes de ir desde MEJORNODO hasta
SUCESOR.
3. Mirar si SUCESOR está contenido en ABIERTOS (es decir, si ya ha sido generado pero no
procesado). Si es así, llamemos a ese nodo VIEJO. Puesto que este nodo ya existe en el
grafo, podemos desechar SUCESOR, y añadir VIEJO a la lista de los sucesores de
MEJORNODO. Ahora debemos decidir si el enlace paterno de VIEJO debería apuntar a
MEJORNODO. Debería ocurrir así si el camino que hemos encontrado hasta SUCESOR es
de menor coste que el mejor camino actual hasta VIEJO (puesto que SUCESOR y VIEJO son
en realidad el mismo nodo). Para ver si cuesta menos llegar hasta VIEJO a través de su
padre actual o hasta SUCESOR a través de MEJORNODO, comparar sus valores g. Si VIEJO
tiene menor (o igual) coste, no necesitamos hacer nada.
Si SUCESOR tiene menor coste, entonces hacer que el enlace paterno de VIEJO apunte
hacia MEJORNODO, grabar el nuevo camino óptimo en g (VIEJO), y actualizar f'(VIEJO).
más que otros, entonces debemos poner el coste de ir de un nodo a otro de forma que
refleje dichos costes. Así pues, el algoritmo A* puede usarse tanto si estamos interesados
en encontrar un camino con el coste total mínimo, como si simplemente queremos
encontrar cualquier camino de la forma más rápida posible.
Supongamos que el coste de todos los arcos es 1. Inicialmente, todos los nodos excepto A
están en ABIERTOS .
Para cada nodo, se indica f' como la suma de h' y g. En este ejemplo, el nodo B tiene la f'
más baja, 4, por lo que lo expandiremos en primer lugar. Supongamos que tiene un único
sucesor E, que también parece estar a tres movimientos de la meta. Ahora f'(E) es 5, igual
que f'(C). Supongamos que resolvemos esta disyuntiva a favor del camino que estábamos
siguiendo actualmente. Entonces expandiremos E a continuación. Supongamos que
también él tiene un único sucesor F', también a tres movimientos de la meta. Es evidente
que estamos haciendo movimientos sin realizar ningún progreso. Pero f'(F) = 6, que es
mayor que f'(C). Por tanto expandiremos C a continuación. Así vemos que al subestimar
h(B) hemos desperdiciado algún esfuerzo. Pero en un momento u otro descubrimos que B
estaba más lejos de lo que pensábamos, por lo que podemos regresar y encontrar otro
camino.
En el siguiente laberinto, se puede pasar desde una casilla a otra de las posibles adyacentes
(arriba, abajo, izquierda, derecha), salvo si existe una barrera entre ellas:
Solución
12. Linkografía
http://es.slideshare.net/Tutor4uDev/bsqueda-a
http://inteligencia7b.blogspot.com/2010/11/a-asterisco-o-estrella.html
http://es.wikipedia.org/wiki/Algoritmo_de_b%C3%BAsqueda_A*
https://prezi.com/uagchtutnyhx/busqueda-por-el-metodo-algoritmico-a/
http://www.infor.uva.es/~calonso/IAI/Tema4-
BusquedaInformada/BusquedaInformada09-00.pdf
http://arantxa.ii.uam.es/~fdiez/docencia/material/bh.pdf
http://www.sanchezcrespo.org/Docencia/IA/IA%20-%20Tema%203B%20-
%20Busquedas%20v1.3.pdf
http://www.uv.mx/personal/edbenitez/files/2010/09/CursoIA10-II-3.pdf
http://www.robot.uji.es/docencia/II28/teoria/transparencias-tema04.pdf
http://www.dee.ufma.br/~lpaucar/teaching/ia2000-1/cap2.3.2.html