You are on page 1of 2

Algoritmo 8 puzzle El algoritmo de bsqueda IDA*.

Descripcin del algoritmo.


El mtodo IDA* (Iterative Deepening A*) consiste, como su nombre indica, en un algoritmo de profundizacin iterativa en el que se hace uso de la informacin heurstica de que se dispone sobre el problema para decidir qu nodo expandir a continuacin, y hasta dnde llegar en cada una de las iteraciones del proceso. En este algoritmo, como en cualquier algoritmo de profundizacin iterativa, cada iteracin es una bsqueda "primero en profundidad". En este caso la profundizacin se basa en la informacin heurstica y terminar no a una determinada profundidad, sino cuando se llegue a un nodo cuyo coste de la funcin heurstica de evaluacin f = g + h sea mayor que el actual lmite de coste de f. De esta forma en cada iteracin se revisan todos los nodos con un coste de f menor o igual que el actual lmite de coste. Adems de esto se evalan los nodos del contorno del rbol, que tienen un coste mayor que el actual lmite de f, para calcular el lmite de f que se utilizar en la siguiente iteracin. Este nuevo lmite ser el valor mnimo de todos los valores de f de los nodos del citado contorno. Todo esto se ver ms claro despus de analizar el seudocdigo del algoritmo y presentar un ejemplo ilustrativo. Seudocdigo de IDA* En adelante, "coste" representa un tipo de datos (tipicamente enteros o reales) en el que se almacenar el coste de los nodos. Para el problema del 8-puzzle basta con que "coste" sea de tipo entero.
funcin IDA*(problema) responde con una lista que contiene la ruta solucin Entradas: problema: Estructura que contiene lo siguiente: estado Inicial : Estado a partir del que se comienza la bsqueda estado Final : Estado o estados objetivo de la bsqueda. entero NumOps : Nmero de operadores aplicables a los estados. vector de entero CosteOperador : Vector en el que se almacena el coste de los operadores. coste CosteMaximo : Cota superior del coste de la solucin. Variables: coste lmite-f : En esta variable se almacena el lmite del coste f para la iteracin actual. nodo raz : Almacena el primer nodo del rbol. lista solucin : Almacena la ruta solucin. //Se crea el nodo raz.

raz = nuevoNodo(problema.inicial, problema.final) //El primer lmite-f es el coste-f del nodo raz. lmite-f = coste-f(raz) bucle hacer solucin, lmite-f = Contorno-DFS(raiz, lmite-f) si no EsVacia(solucin) responde con solucin si lmite-f CosteMaximo responde con ERROR finbucle funcin Contorno-DFS(nodoexp, lmite-f) responde con lista solucin, nuevo coste-f Entradas: nodo nodoexp : el nodo a expandir coste lmite-f : lmite actual de coste de f Variables: coste siguiente-f : lmite de coste-f correspondiente al siguiente contorno. Se inicializa con valor CosteMximo. // Si el coste de este nodo es mayor que el lmite actual, devolvemos su coste. si coste-f(nodoexp) > lmite-f responde con nulo, coste-f(nodoexp) // Si es un nodo meta, respondemos con una lista inicializada con el nodo. si EsMeta(nodoexp) responde con lista(nodoexp), lmite-f // En otro caso expandimos el nodo. para cada operador op //Si existe un sucesor de nodoexp con el operador op si suc = sucesor(nodoexp, op) //hacemos una llamada recursiva a Contorno-DFS (solucin, nueva-f ) = Contorno-DFS(suc, lmite-f) // Al retorno de Contorno-DFS, si tenemos solucin, aadimos a la lista //el nodo actual. si no EsVacia(solucin) InsertarLista(solucin, nodoexp) responde con solucin, lmite-f finsi // Si no hay solucin comprobamos el valor de nueva-f, y si es menor // que siguiente-f lo almacenamos como valor provisional de limite-f para // la prxima iteracin del algoritmo. siguiente-f = Minimo(siguiente-f, nueva-f) finsi //Si an quedan operadores por comprobar continuamos iterando (bucle 'para') finpara // Si llegamos hasta aqu es que desde el nodo nodoexp no se llega a una solucin // de coste menor o igual que lmite-f. Retornamos una lista vaca y el valor provisional // de lmite-f para la prxima iteracin. responde con nulo, siguiente-f

You might also like