0% encontró este documento útil (0 votos)
140 vistas5 páginas

Búsquedas Informadas

El documento describe los algoritmos de búsqueda informada, que introducen conocimiento adicional sobre el problema para encontrar soluciones de forma más eficiente que los algoritmos de búsqueda ciega. Explica dos algoritmos principales: el algoritmo voraz, que explora primero los nodos vecinos de menor coste inmediato, y el algoritmo A*, que estima el coste total del camino para cada nodo para guiar de manera más efectiva la búsqueda hacia la solución óptima.

Cargado por

Michelle Pluas
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
140 vistas5 páginas

Búsquedas Informadas

El documento describe los algoritmos de búsqueda informada, que introducen conocimiento adicional sobre el problema para encontrar soluciones de forma más eficiente que los algoritmos de búsqueda ciega. Explica dos algoritmos principales: el algoritmo voraz, que explora primero los nodos vecinos de menor coste inmediato, y el algoritmo A*, que estima el coste total del camino para cada nodo para guiar de manera más efectiva la búsqueda hacia la solución óptima.

Cargado por

Michelle Pluas
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 5

Búsquedas Informadas

Es evidente que los algoritmos de búsqueda ciega (o no informada) serán incapaces de encontrar
soluciones en problemas en los que el tamaño del espacio de búsqueda sea grande, ya que todos ellos
tienen un coste temporal que es exponencial en el tamaño del dato de entrada, por lo que cuando se
aplican a problemas reales el tiempo para encontrar la mejor solución a un problema no es asumible.

 Una de las formas para intentar reducir este tiempo de búsqueda a cotas más razonables pasa por
hacer intervenir dentro del funcionamiento del algoritmo de búsqueda conocimiento adicional sobre el
problema que se está intentando resolver. En consecuencia, perderemos en generalidad, a cambio de
ganar en eficiencia temporal.

 En estas líneas nos centraremos en aquellos algoritmos que introducen mecanismos para manipular esa
información adicional que puede suponer la diferencia entre tardar un tiempo impracticable para hallar
la solución óptima y poder encontrarla en tiempos razonables.

Calculando costes para optimizar


Al igual que se hace con la búsqueda ciega, hemos de definir qué entendemos por búsqueda del
óptimo, por lo que hemos de dar alguna medida del coste de obtener una solución. En general, este
coste se medirá sobre el camino que nos lleva desde el estado inicial del problema hasta el estado final.
No siempre es una medida factible ni deseable, pero nos centraremos en problemas en los que esta
medida del óptimo tenga sentido. Para poder calcular este coste de forma efectiva, tendremos un coste
asociado a los operadores que permiten pasar de un estado a otro.

Los algoritmos que veremos utilizarán el coste de los caminos explorados para saber qué  nodos merece
la pena explorar antes que otros. De esta manera, perderemos la sistematicidad de los algoritmos  de
búsqueda no informada, y el orden de visita de los estados no vendrá determinado  por su posición en el
grafo de búsqueda, sino por su coste respecto del problema real que intentan resolver.

En la mayoría de los problemas, debido al tamaño del espacio de búsqueda, no podemos plantearnos
generar todo el grafo asociado de una vez, sino que deber ser generado a medida que es explorado, por
lo que se tienen dos elementos fundamentales que intervienen en el coste del camino que va desde el
estado inicial hasta la solución que buscamos:

1. En primer lugar, tendremos el coste del camino recorrido, que podremos calcular simplemente
sumando los costes de los operadores aplicados desde el estado inicial hasta el nodo actual. En
consecuencia, este coste es algo que se puede calcular con exactitud.
2. En segundo lugar, tendremos un coste más difícil de determinar, el coste del camino que nos
queda por recorrer hasta el estado final. Dado que lo desconocemos, tendremos que utilizar el
conocimiento del que disponemos del problema para obtener una aproximación. Es aquí donde
interviene el adjetivo de "heurística" que se aplica a este tipo de algoritmos de búsqueda.
Evidentemente, la calidad de este conocimiento que nos permite aproximar el coste futuro hará más o
menos exitosa nuestra búsqueda. Si nuestro conocimiento fuera perfecto, podríamos dirigirnos
rápidamente hacia el objetivo descartando todos los caminos de mayor coste, eligiendo en cada
momento el mejor estado posible, y dando la solución en tiempo lineal. En el otro extremo, si
estuviéramos en la total ignorancia, tendríamos que explorar muchos caminos antes de hallar la
solución óptima. Una situación similar a la que se encuentra en la búsqueda ciega.
 

Así pues, esta función heurística de coste futuro se vuelve fundamental en la resolución eficiente del
problema, de forma que, cuanto más ajustada esté al coste real, mejor funcionarán los algoritmos que
hagan uso de ella. El fundamento de los algoritmos de búsqueda heurística será el modo de elegir qué
nodo explorar primero, para ello podemos utilizar diferentes estrategias que nos darán diferentes
propiedades.

Algoritmo Voraz

Una primera estrategia, que representa una heurística muy limitada pero muy extendida, es utilizar
como estimación futura el coste del siguiente paso que vamos a dar, que lo podemos calcular fácilmente
desde el nodo actual en el que nos encontramos. En este caso, la heurística usada se resume en suponer
que, en cada paso, el mejor camino se consigue al minimizar el coste inmediato.

Esta estrategia se traduce en el algoritmo voraz (greedy best first), cuya única diferencia con respecto a
los algoritmos ciegos es que utiliza alguna estructura ordenada de datos para almacenar los nodos
abiertos (por ejemplo, una cola con prioridad), de forma que aquellos que supongan un coste inmediato
menor se coloquen primero. Una posible implementación podría ser la siguiente:

 
Algoritmo: Voraz
Insertar Estado_inicial Est_abiertos
Actual ← Primero Est_abiertos
mientras Actual no es_final? y Est_abiertos no vacía? hacer
  Quitar_primero Est_abiertos
  Insertar Actual Est_cerrados
  hijos ← generar_sucesores_ordenados_por_peso (Actual)
  hijos ← tratar_repetidos (Hijos, Est_cerrados, Est_abiertos)
  Insertar Hijos Est_abiertos
  Actual ← Primero Est_abiertos
fin

Aunque explorar antes los nodos vecinos más cercanos puede ayudar a encontrar una solución antes, es
fácil dar ejemplos en los que no se garantice que la solución encontrada sea óptima.

El algoritmo A∗
Dado que nuestro objetivo no es solo llegar lo mas rápidamente a la solución, sino encontrar la de
menor coste tendremos que tener en cuenta el coste de todo el camino y no solo el camino recorrido o
el camino por recorrer.

Para poder introducir el siguiente algoritmo y establecer sus propiedades es necesario conocer las
siguientes definiciones:
 El coste de una arista entre dos nodos ni

y nj es el coste del operador que nos permite pasar de un nodo al otro, y lo denotaremos como
c(ni,nj)
 . Este coste siempre será positivo.

 El coste de un camino entre dos nodos ni y nj es la suma de los costes de todos los arcos que llevan
desde un nodo al otro y lo denotaremos como: 

C(ni,nj)=∑x=ij−1c(nx,nx+1)

  El coste del camino mínimo entre dos nodos ni y nj (el del camino de menor coste de aquellos que
llevan desde un nodo al otro) se denotará por:

K(ni,nj)=minkCk(ni,nj)
  Si nj es un nodo terminal, para cada nodo ni notaremos h∗(ni)=K(ni,nj)

 , es decir, el coste del camino mínimo desde ese estado a un estado solución.

 Si ni es un nodo inicial, para cada nodo nj notaremos g∗(nj)=K(ni,nj)

 , es decir, el coste del camino mínimo desde un estado inicial a ese estado.

Esto nos permite definir el coste del camino


mínimo que pasa por cualquier nodo como la suma del coste del camino mínimo desde el nodo inicial y
el coste del camino mínimo nodo hasta  el nodo final:
f∗(n)=g∗(n)+h∗(n)
El problema habitual suele ser que para un nodo cualquiera, n

, el valor de h∗(n) es desconocido,  por lo que este valor hemos de estimarlo por una función que nos
lo aproximará, a esta función la denotaremos h(n) y le daremos el nombre de función heurística, que
debe ser siempre un valor mayor o igual que cero. Denominaremos g(n) al coste del camino desde el
nodo inicial al nodo n

, que en este caso sí es conocido ya que lo hemos recorrido en nuestra exploración. De esta manera
tendremos una estimación del coste del camino mínimo que pasa por cierto nodo:

f(n)=g(n)+h(n)
Este será el valor que utilizaremos para decidir en nuestro algoritmo de búsqueda cuál es el
siguiente nodo a explorar de entre todos los nodos abiertos disponibles por medio del siguiente
algoritmo, que denominaremos A∗

:
Algoritmo: A∗
Insertar Estado_inicial Est_abiertos
Actual ← Primero Est_abiertos
mientras Actual no es_final? y Est_abiertos no vacía? hacer
  Quitar_primero Est_abiertos
  Insertar Actual Est_cerrados
  hijos ← generar_sucesores_ordenados_por_heurística (Actual)
  hijos ← tratar_repetidos (Hijos, Est_cerrados, Est_abiertos)
  Insertar Hijos Est_abiertos
  Actual ← Primero Est_abiertos
fin

También podría gustarte