Está en la página 1de 76

6

Captulo 1. Resolucin de problemas

Satisfaccin de restricciones: Esta aproximacin es especca para problemas que se puedan plantear como un conjunto de variables a las que se han de asignar valores cumpliendo ciertas restricciones. Juegos: Tambin es una aproximacin especca, en la que el problema se plantea como la competicin entre dos o mas agentes La eleccin de la forma de representacin depender de las caractersticas del problema, en ocasiones una metodologa especializada puede ser ms eciente.

1.2 El espacio de estados


La aproximacin ms general y ms sencilla de plantear es la que hemos denominado espacio de estados. Deberemos suponer que podemos denir un problema a partir de los elementos que intervienen en l y sus relaciones. En cada instante de la resolucin de un problema estos elementos tendrn unas caractersticas y relaciones especcas que son sucientes para determinar el momento de la resolucin en el que estamos. Denominaremos estado a la representacin de los elementos que describen el problema en un momento dado. Distinguiremos dos estados especiales, el estado inicial (punto de partida) y el estado nal (objetivo del problema). La cuestin principal que nos deberemos plantear ser qu debemos incluir en el estado. No existen unas directrices que nos resuelvan esta cuestin, pero podemos tomar como lnea general que debemos incluir lo suciente para que, cuando obtengamos la solucin, sta pueda trasladarse al problema real, ya que una simplicacin excesiva nos llevar a soluciones inservibles. En el otro extremo, representar elementos de estado que sean irrelevantes o superuos lo nico que conseguir es aumentar innecesariamente el coste computacional de la resolucin. Para poder movernos entre los diferentes estados que denen el problema, necesitaremos lo que denominaremos operadores de transformacin. Un operador es una funcin de transformacin sobre la representacin de un estado que lo convierte en otro estado. Los operadores denirn una relacin de accesibilidad entre estados. Los elementos que denen un operador son: 1. Condiciones de aplicabilidad, las condiciones que debe cumplir un estado para que podamos aplicrselo. 2. Funcin de transformacin, la transformacin que ha de aplicarse al estado para conseguir un estado sucesor al actual. Igual que con la eleccin de los elementos que forman parte del estado, tampoco existen unas directrices que nos permitan decidir, de manera general, que operadores sern necesarios para resolver el problema, cuantos sern necesarios o que nivel de granularidad han de tener (como de diferente es el estado transformado respecto al original). Se puede dar el mismo consejo que con los estados, pocos operadores pueden hacer que nuestro problema sea irresoluble o que la solucin no nos sirva en el problema real, demasiados operadores pueden hacer que el coste de la resolucin sea prohibitivo. Los estados y su relacin de accesibilidad conforman lo que se denomina el espacio de estados. ste representa todos los caminos que hay entre todos los estados posibles de un problema. Podra asimilarse con un mapa de carreteras de un problema, la solucin de nuestro problema esta dentro de ese mapa, solo nos falta hallar el camino adecuado. El ltimo elemento que nos queda por denir es la solucin. La deniremos de dos maneras, como la secuencia de pasos que llevan del estado inicial al nal (secuencia de operadores) o el estado nal del problema. Existen problemas en los que la secuencia de operadores es el objetivo de la solucin,

1.2 El espacio de estados

en stos, por lo general, sabemos como es la solucin, pero no sabemos como construirla y existen tambin problemas en los que queremos saber si es posible combinar los elementos del problema cumpliendo ciertas restricciones, pero la forma de averiguarlo no es importante. Tambin podremos catalogar los diferentes tipos problema segn el tipo de solucin que busquemos, dependiendo de si nos basta con una cualquiera, queremos la mejor o buscamos todas las soluciones posibles. Evidentemente el coste computacional de cada uno de estos tipos es muy diferente. En el caso de plantearnos el cuantos recursos gastamos para obtener una solucin, deberemos introducir otros elementos en la representacin del problema. Deniremos el coste de una solucin como la suma de los costos individuales de la aplicacin de los operadores a los estados, esto quiere decir que cada operador tendr tambin asociado un coste. Vamos a ver a continuacin dos ejemplos de como denir problemas como espacio de estados: Ejemplo 1.1 El ocho puzzle es un problema clsico que consiste en un tablero de 9 posiciones dispuesto como una matriz de 33 en el que hay 8 posiciones ocupadas por chas numeradas del 1 al 8 y una posicin vaca. Las chas se pueden mover ocupando la posicin vaca, si la tienen adyacente. El objetivo es partir de una disposicin cualquiera de las chas, para obtener una disposicin de stas en un orden especco. Tenemos una representacin del problema en la siguiente gura:

1 4 7

2 5 8

3 6

La denicin de los elementos del problema para plantearlo en el espacio de estados podra ser la siguiente: Espacio de estados: Conguraciones de 8 chas en el tablero Estado inicial: Cualquier conguracin Estado nal: Fichas en un orden especco Operadores: Mover el hueco Condiciones: El movimiento est dentro del tablero Transformacin: Intercambio entre el hueco y la cha en la posicin del movimiento Solucin: Que movimientos hay que hacer para llegar al estado nal, posiblemente nos interesa la solucin con el menor nmero de pasos En esta denicin hemos escogido como operador mover el hueco, evidentemente, en el problema real lo que se mueven son las chas, pero elegir el movimiento de una cha como operador nos habra dado 8 posibles aplicaciones con 4 direcciones posibles para cada una. Al elegir el mover hueco como operador tenemos una nica aplicacin con 4 direcciones posibles. Este tipo de elecciones sobre como representar el problema pueden hacer que sea computacionalmente ms o menos costoso de resolver, ya que estamos variando la forma y el tamao del espacio de estados.

Captulo 1. Resolucin de problemas

Ejemplo 1.2 El problema de las N reinas es tambin un problema clsico, en este caso el problema se trata de colocar N reinas en un tablero de ajedrez de NN de manera que no se maten entre si. En este problema no nos interesa la manera de hallar la solucin, sino el estado nal. En la gura tenemos representada la solucin para un problema con dimensin 4:

La denicin de los elementos del problema para plantearlo en el espacio de estados podra ser la siguiente: Espacio de estados: Conguraciones de 0 a n reinas en el tablero con solo una por la y columna Estado inicial: Conguracin sin reinas en el tablero Estado nal: Conguracin en la que ninguna reina se mata entre si Operadores: Colocar una reina en una la y columna Condiciones: La reina no es matada por ninguna otra ya colocada Transformacin: Colocar una reina ms en el tablero en una la y columna determinada Solucin: Una solucin, pero no nos importan los pasos Tambin podramos haber hecho otras elecciones de representacin como por ejemplo que el estado inicial tuviera las N reinas colocadas, o que el operador permitiera mover las reinas a una celda adyacente. Todas estas alternativas supondran un coste de solucin ms elevado. Un elemento que ser importante a la hora de analizar los problemas que vamos a solucionar, y que nos permitir tomar decisiones, es el tamao del espacio de bsqueda y su conectividad. Este tamao inuir sobre el tipo de solucin que podemos esperar, por ejemplo, si el tamao es demasiado grande, encontrar la solucin ptima puede ser irrealizable, el tipo de algoritmo que es ms adecuado, por ejemplo, habr algoritmos ms aptos para soluciones que estn ms lejos del estado inicial, y cul ser el coste computacional que implicar la resolucin del problema. Es esencial entonces, a la hora de plantear un problema, estimar cual es el nmero de estados que contiene. Por ejemplo, en el caso del ocho puzzle tenemos tantas combinaciones como posibles ordenes podemos hacer de las 8 piezas mas el hueco, esto signica 9! estados posibles (362880 estados). Probablemente no tendremos que recorrer todos los estados posibles del problema, pero nos puede dar una idea de si el problema ser mas o menos difcil de resolver1 . Otro elemento a considerar es la conectividad entre los estados, que se puede calcular a partir del factor de ramicacin de los operadores que podemos utilizar. No es lo mismo recorrer un espacio
1 Se sola comentar hace unos aos que problemas que tengan menos de 232 estados para los que solo nos interesa saber si existe una estado solucin eran la frontera de los problemas sencillos y que se pueden resolver por fuerza bruta simplemente enumerndolos todos, con la capacidad de clculo actual probablemente ahora ese nmero mnimo de estados sea algo mayor.

1.3 Algoritmos de bsqueda en el espacio de estados Algoritmo 1.1 Esquema de algoritmo de bsqueda en espacio de estados Funcin: Busqueda en espacio de estados() Datos: El estado inicial Resultado: Una solution Seleccionar el primer estado como el estado actual mientras estado actua = estado nal hacer Generar y guardar sucesores del estado actual (expansin) Escoger el siguiente estado entre los pendientes (seleccin) n

de estados en el que de un estado podemos movernos a unos pocos estados sucesores, que un espacio de estados en los que cada estado esta conectado con casi todos los estados posibles. Esta es la razn por la que elegir operadores con un factor de ramicacin no muy grande es importante. Pero debemos tener en cuenta otra cosa, un factor de ramicacin pequeo puede hacer que el camino hasta la solucin sea ms largo. Como siempre, hemos de buscar el compromiso, tener mucha conectividad es malo, pero muy poca tambin puede ser malo. En el caso del ocho puzzle, el factor de ramicacin es 4 en el peor de los casos, pero en media podemos considerar que estar alrededor de 2.
?

Puedes tomarte unos minutos en pensar otros problemas que puedas denir segn el paradigma del espacio de estados. Debers jarte en que los problemas representables de este modo se pueden reducir a la bsqueda de un camino.

1.3 Algoritmos de bsqueda en el espacio de estados


La resolucin de un problema planteado como un espacio de estados pasa por la exploracin de ste. Debemos partir del estado inicial marcado por el problema, evaluando cada paso posible y avanzando hasta encontrar un estado nal. En el caso peor deberemos explorar todos los posibles caminos desde el estado inicial hasta poder llegar a un estado que cumpla las condiciones del estado nal. Para poder implementar un algoritmo capaz de explorar el espacio de estados en busca de una solucin primero debemos denir una representacin adecuada de ste. Las estructuras de datos ms adecuadas para representar el espacio de estados son los grafos y los rboles. En estas estructuras cada nodo de representar un estado del problema y los operadores de cambio de estado estarn representados por los arcos. La eleccin de un rbol o un grafo la determinar la posibilidad de que a un estado solo se pueda llegar a travs de un camino (rbol) o que haya diferentes caminos que puedan llevar al mismo estado (grafo). Los grafos sobre los que trabajarn los algoritmos de resolucin de problemas son diferentes de los algoritmos habituales sobre grafos. La caracterstica principal es que el grafo se construir a medida que se haga la exploracin, dado que el tamao que puede tener hace imposible que se pueda almacenar en memoria (el grafo puede ser incluso innito). Esto hace que, por ejemplo, los algoritmos habituales de caminos mnimos en grafos no sirvan en este tipo de problemas. Nosotros nos vamos a centrar en los algoritmos que encuentran una solucin, pero evidentemente extenderlo a todas las soluciones es bastante sencillo. En el algoritmo 1.1 se puede ver el que sera un esquema a alto nivel de un algoritmo que halla una solucin de un problema en el espacio de estados. En este algoritmo tenemos varias decisiones que nos permitirn obtener diferentes variantes que

10

Captulo 1. Resolucin de problemas

Algoritmo 1.2 Esquema general de bsqueda Algoritmo: Busqueda General Est_abiertos.insertar(Estado inicial) Actual Est_abiertos.primero() mientras no es_nal?(Actual) y no Est_abiertos.vacia?() hacer Est_abiertos.borrar_primero() Est_cerrados.insertar(Actual) Hos generar_sucesores(Actual) Hos tratar_repetidos(Hos, Est_cerrados, Est_abiertos) Est_abiertos.insertar(Hos) Actual Est_abiertos.primero() n

se comportarn de distinta manera y que tendrn propiedades especcas. La primera decisin es el orden de expansin, o lo que es lo mismo, el orden en el que generamos los sucesores de un nodo. La segunda decisin es el orden de seleccin, o sea, el orden en el que decidimos explorar los nodos que an no hemos visitado. Entrando un poco ms en los detalles de funcionamiento del algoritmo, podremos distinguir dos tipos de nodos, los nodos abiertos, que representarn a los estados generados pero an no visitados y los nodos cerrados, que correspondern a los estados visitados y que ya se han expandido. Nuestro algoritmo siempre tendr una estructura que almacenar los nodos abiertos. Las diferentes polticas de insercin de esta estructura sern las que tengan una inuencia determinante sobre el tipo de bsqueda que har el algoritmo. Dado que estaremos explorando grafos, y que por lo tanto durante la exploracin nos encontraremos con estados ya visitados, puede ser necesario tener una estructura para almacenar los nodos cerrados. Merecer la pena si el nmero de nodos diferentes es pequeo respecto al nmero de caminos, pero puede ser prohibitivo para espacios de bsqueda muy grandes. En el algoritmo 1.2 tenemos un algoritmo algo ms detallado que nos va a servir como esquema general para la mayora de los algoritmos que iremos viendo. Variando la estructura de abiertos variamos el comportamiento del algoritmo (orden de visita de los nodos). La funcin generar_sucesores seguir el orden de generacin de sucesores denido en el problema. Este puede ser arbitrario o se puede hacer alguna ordenacin usando conocimiento especco del problema. El tratamiento de repetidos depender de cmo se visiten los nodos, en funcin de la estrategia de visitas puede ser innecesario. Para poder clasicar y analizar los algoritmos que vamos a tratar, escogeremos unas propiedades que nos permitirn caracterizarlos. Estas propiedades sern: Completitud: Si un algoritmo es completo tenemos la garanta de que hallar una solucin de existir, si no lo es, es posible que algoritmo no acabe o que sea incapaz de encontrarla. Complejidad temporal: Coste temporal de la bsqueda en funcin del tamao del problema, generalmente una cota que es funcin del factor de ramicacin y la profundidad a la que se encuentra la solucin. Complejidad espacial: Espacio requerido para almacenar los nodos pendientes de explorar, generalmente una cota que es funcin del factor de ramicacin y la profundidad a la que se encuentra la solucin. Tambin se puede tener en cuenta el espacio para almacenar los nodos ya explorados si es necesario para el algoritmo

1.3 Algoritmos de bsqueda en el espacio de estados

11

Optimalidad: Si es capaz de encontrar la mejor solucin segn algn criterio de preferencia o coste. Atendiendo a estos criterios podemos clasicar los algoritmos principales que estudiaremos en: Algoritmos de bsqueda no informada: Estos algoritmos no tienen en cuenta el coste de la solucin durante la bsqueda. Su funcionamiento es sistemtico, siguen un orden de visitas de nodos jo, establecido por la estructura del espacio de bsqueda. Los principales ejemplos de estos algoritmos son el de anchura prioritaria, el de profundidad prioritaria y el de profundidad iterativa. Algoritmos de bsqueda heurstica y bsqueda local: Estos algoritmos utilizan una estimacin del coste o de la calidad de la solucin para guiar la bsqueda, de manera que se basan en algn criterio heurstico dependiente del problema. Estos algoritmos no son sistemticos, de manera que el orden de exploracin no lo determina la estructura del espacio de bsqueda sino el criterio heurstico. Algunos de ellos tampoco son exhaustivos y basan su menor complejidad computacional en ignorar parte del espacio de bsqueda. Existen bastantes algoritmos de este tipo con funcionamientos muy diferentes, no siempre garantizan el encontrar la solucin ptima, ni tan siquiera el hallar una solucin. Los principales ejemplos de estos algoritmos son A , IDA , Branch & Bound, Hill-climbing. Desarrollaremos estos algoritmos en los captulos siguientes.
STOP

Este es un buen momento para repasar los diferentes algoritmos de recorrido de rboles y grafos y de bsqueda de caminos en grafos que se te han explicado en otras asignaturas. A pesar de que traten con estructuras nitas los principios bsicos son muy parecidos.

2. Bsqueda no informada

2.1 Bsqueda independiente del problema


Los algoritmos de bsqueda no informada (tambin conocidos como algoritmos de bsqueda ciega) no dependen de informacin propia del problema a la hora de resolverlo. Esto quiere decir que son algoritmos generales y por lo tanto se pueden aplicar en cualquier circunstancia. Estos algoritmos se basan en la estructura del espacio de estados y determinan estrategias sistemticas para su exploracin. Es decir, siguen una estrategia ja a la hora de visitar los nodos que representan los estados del problema. Se trata tambin de algoritmos exhaustivos, de manera que pueden acabar recorriendo todos los nodos del problema para hallar la solucin. Existen bsicamente dos polticas de recorrido de un espacio de bsqueda, en anchura y en profundidad. Todos los algoritmos que se explicarn a continuacin se basan en una de las dos. Al ser algoritmos exhaustivos y sistemticos su coste puede ser prohibitivo para la mayora de los problemas reales, por lo tanto solo ser aplicables en problemas pequeos. Su ventaja es que no nos hace falta obtener ningn conocimiento adicional sobre el problema, por lo que siempre son aplicables.

2.2 Bsqueda en anchura prioritaria


La bsqueda en anchura prioritaria intenta explorar el espacio de bsqueda haciendo un recorrido por niveles, de manera que un nodo se visita solamente cuando todos sus predecesores y sus hermanos anteriores en orden de generacin ya se han visitado. Para obtener este algoritmo solo hemos de instanciar en el algoritmo que vimos en el captulo anterior la estructura que guarda los nodos abiertos a una cola en el algoritmo general de bsqueda que hemos visto en el captulo anterior. Esta estructura nos consigue que se visiten los nodos en el orden que hemos establecido. Si nos jamos en las propiedades que hemos escogido para clasicar los algoritmos: Completitud: El algoritmo siempre encuentra una solucin de haberla. Complejidad temporal: Si tomamos como medida del coste el nmero de nodos explorados, este crece de manera exponencial respecto al factor de ramicacin y la profundidad de la solucin O(rp ). Complejidad espacial: Dado que tenemos que almacenar todos los nodos pendientes por explorar, el coste es exponencial respecto al factor de ramicacin y la profundidad de la solucin O(rp ). Optimalidad: La solucin obtenida es ptima respecto al nmero de pasos desde la raz, si los operadores de bsqueda tienen coste uniforme,el coste de la solucin sera el ptimo. Respecto al tratamiento de nodos repetidos, si nos jamos en la gura 2.1 podemos ver los diferentes casos con los que nos encontramos. 13

14

Captulo 2. Bsqueda no informada

Figura 2.1: Tratamiento de repetidos en bsqueda en anchura

El nodo de color negro sera el nodo generado actual, los nodos en cuadrcula son nodos cerrados y los nodos rayados son nodos abiertos. Si el nodo generado actual est repetido en niveles superiores (ms cerca de la raz), su coste ser peor ya que su camino desde la raz es ms largo, si est al mismo nivel, su coste ser el mismo. Esto quiere decir que para cualquier nodo repetido, su coste ser peor o igual que algn nodo anterior visitado o no, de manera que lo podremos descartar, ya que o lo hemos expandido ya o lo haremos prximamente. El coste espacial de guardar los nodos cerrados para el tratamiento de repetidos es tambin O(rp ). No hacer el tratamiento de nodos repetidos no supone ninguna ganancia, ya que tanto la cola de nodos abiertos como la de nodos repetidos crecen exponencialmente.

2.3 Bsqueda en profundidad prioritaria


La bsqueda en profundidad prioritaria intenta seguir un camino hasta la mayor profundidad posible, retrocediendo cuando acaba el camino y retomando la ltima posibilidad de eleccin disponible. Para obtener este algoritmo solo hemos de instanciar la estructura que guarda los nodos abiertos a una pila en el algoritmo genrico. Esta estructura nos consigue que se visiten los nodos en el orden que hemos establecido. El principal problema de este algoritmo es que no acaba si existe la posibilidad de que hayan caminos innitos. Una variante de este algoritmo que evita este problema es el algoritmo de profundidad limitada, ste impone un lmite mximo de profundidad que impone la longitud mxima de los caminos recorridos. Esta limitacin garantiza que el algoritmo acaba, pero no garantiza la solucin ya que sta puede estar a mayor profundidad que el lmite impuesto. El algoritmo de profundidad limitada se puede ver en el algoritmo 2.1. La nica diferencia en la implementacin de esta variante con el algoritmo general es que se dejan de generar sucesores cuando se alcanza la profundidad lmite. Si nos jamos en las propiedades que hemos escogido para clasicar los algoritmos: Completitud: El algoritmo encuentra una solucin si se impone una profundidad lmite y existe una solucin dentro de ese lmite. Complejidad temporal: Si tomamos como medida del coste el nmero de nodos explorados, el coste es exponencial respecto al factor de ramicacin y la profundidad del lmite de exploracin O(rp ).

2.3 Bsqueda en profundidad prioritaria Algoritmo 2.1 Algoritmo de profundidad limitada Procedimento: Busqueda en profundidad limitada (limite: entero) Est_abiertos.insertar(Estado inicial) Actual Est_abiertos.primero() mientras no es_nal?(Actual) y no Est_abiertos.vacia?() hacer Est_abiertos.borrar_primero() Est_cerrados.insertar(Actual) si profundidad(Actual) limite entonces Hos generar_sucesores (Actual) Hos tratar_repetidos (Hos, Est_cerrados, Est_abiertos) Est_abiertos.insertar(Hos) n Actual Est_abiertos.primero() n

15

Figura 2.2: Tratamiento de repetidos en bsqueda en profundidad Complejidad espacial: El coste es lineal respecto al factor de ramicacin y el lmite de profundidad O(rp). Si hacemos una implementacin recursiva del algoritmo el coste es O(p), ya que no nos hace falta generar todos los sucesores de un nodo, pudindolos tratar uno a uno. Si tratamos los nodos repetidos el coste espacial es igual que en anchura ya que tendremos que guardar todos los nodos cerrados. Optimalidad: No se garantiza que la solucin sea ptima, la solucin que se retornar ser la primera en el orden de exploracin.

Las implementaciones recursivas de los algoritmos permiten por lo general un gran ahorro de espacio. En este caso la bsqueda en profundidad se puede realizar recursivamente de manera natural (ver algoritmo 2.2). La recursividad permite que las alternativas queden almacenadas en la pila de ejecucin como puntos de continuacin del algoritmo sin necesidad de almacenar ninguna informacin. En este caso el ahorro de espacio es proporcional al factor de ramicacin que en la prctica en problemas difciles no es despreciable. Lo nico que perdemos es la capacidad de buscar repetidos en los nodos pendientes que tenemos en el camino recorrido, pero habitualmente la limitacin de memoria es una restriccin bastante fuerte que impide solucionar problemas con longitudes de camino muy largas. Respecto al tratamiento de nodos repetidos, si nos jamos en la gura 2.2 podemos ver los

' ( $ # $$# ('(( '' ((( '' ((' $$ ## ''(' 12 2 2 2 '((' 11211112 2 # ('('(' 1 #$#$ $ #$# 2222212 122221 211122 21221 1 1 1 212121221 1221 11221 12212121 1221121 12121 1 2121212122 21 11112121 22122 1212121 22211222 1111 !" 212212112 12112 12112 "!"" " !! "" ! !"! !"!

                                                                  &  & %% %& & & %% %& ) ) ) ) ) ) ) 000000 00000000 & & ))))))) %% 000000 %& ))))))0 )0000000) ))))))0 )0000000) ))))))0 )0)0)0)0)0)0)00)0) ))))))))0) 0)0000000 )0)0)0)0)0)0)0 00000000 ))))))) )0))0

16 Algoritmo 2.2 Algoritmo de profundidad limitada recursivo

Captulo 2. Bsqueda no informada

Funcin: Busqueda en profundidad limitada recursiva (actual:nodo, limite: entero) si profundidad(Actual) limite entonces para todo nodo generar_sucesores (Actual) hacer si es_nal?(nodo) entonces retorna (nodo) sino resultado Busqueda en profundidad limitada recursiva(nodo,limite) si es_nal?(resultado) entonces retorna (resultado) n n n sino retorna () n

diferentes casos con los que nos encontramos. El nodo de color negro sera el nodo generado actual, los nodos en cuadrcula son nodos cerrados y los nodos rayados son nodos abiertos. Si el nodo generado actual est repetido en niveles superiores (ms cerca de la raz), su coste ser peor ya que su camino desde la raz es ms largo, si est al mismo nivel, su coste ser el mismo. En estos dos casos podemos olvidarnos de este nodo. En el caso de que el repetido corresponda a un nodo de profundidad superior, signica que hemos llegado al mismo estado por un camino ms corto, de manera que deberemos mantenerlo y continuar su exploracin, ya que nos permitir llegar a mayor profundidad que antes. En el caso de la bsqueda en profundidad, el tratamiento de nodos repetidos no es crucial ya que al tener un lmite en profundidad los ciclos no llevan a caminos innitos. No obstante, este caso se puede tratar comprobando los nodos en el camino actual ya que est completo en la estructura de nodos abiertos. Adems, no tratando repetidos mantenemos el coste espacial lineal, lo cual es una gran ventaja. El evitar tener que tratar repetidos y tener un coste espacial lineal supone una caracterstica diferenciadora de hace muy ventajosa a la bsqueda en profundidad. Este algoritmo ser capaz de obtener soluciones que se encuentren a gran profundidad. En un problema concreto, el algoritmo de bsqueda en anchura tendr una estructura de nodos abiertos de tamao O(rp ), lo que agotar rpidamente la memoria impidiendo continuar la bsqueda, pero solo habiendo alcanzado una profundidad de camino de p. En cambio el algoritmo en profundidad solo tendr O(rp) nodos abiertos al llegar a esa misma profundidad. Esto quiere decir que en problemas difciles la estrategia en profundidad ser la nica capaz de hallar una solucin con un espacio de memoria limitado.

2.4 Bsqueda en profundidad iterativa


Este algoritmo intenta obtener las propiedades ventajosas de la bsqueda en profundidad y en anchura combinadas, es decir, un coste espacial lineal y asegurar que la solucin ser ptima respecto a la longitud del camino. Para obtener esto lo que se hace es repetir sucesivamente el algoritmo de profundidad limitada, aumentando a cada iteracin la profundidad mxima a la que le permitimos llegar.

2.4 Bsqueda en profundidad iterativa Algoritmo 2.3 Algoritmo de profundidad iterativa (Iterative Deepening) Procedimento: Busqueda en profundidad iterativa (limite: entero) prof 1 Actual Estado inicial mientras no es_nal?(Actual) y prof<limite hacer Est_abiertos.inicializar() Est_abiertos.insertar(Estado inicial) Actual Est_abiertos.primero() mientras no es_nal?(Actual) y no Est_abiertos.vacia?() hacer Est_abiertos.borrar_primero() Est_cerrados.insertar(Actual) si profundidad(Actual) prof entonces Hos generar_sucesores (Actual) Hos tratar_repetidos (Hos, Est_cerrados, Est_abiertos) Est_abiertos.insertar(Hos) n Actual Est_abiertos.primero() n prof prof+1 n

17

Este algoritmo obtendra el mismo efecto que el recorrido en anchura en cada iteracin, ya que a cada paso recorremos un nivel ms del espacio de bsqueda. El coste espacial ser lineal ya que cada iteracin es un recorrido en profundidad. Para que el algoritmo acabe en el caso de que no haya solucin se puede imponer un lmite mximo de profundidad en la bsqueda. Aparentemente podra parecer que este algoritmo es ms costoso que los anteriores al tener que repetir en cada iteracin la bsqueda anterior, pero si pensamos en el nmero de nodos nuevos que recorremos a cada iteracin, estos son siempre tantos como todos los que hemos recorrido en todas las iteraciones anteriores, por lo que las repeticiones suponen un factor constante respecto a los que recorreramos haciendo solo la ltima iteracin. El algoritmo de profundidad iterativa se puede ver en el algoritmo 2.3. Si nos jamos en las propiedades que hemos escogido para clasicar los algoritmos: Completitud: El algoritmo siempre encontrar la solucin Complejidad temporal: La misma que la bsqueda en anchura. El regenerar el rbol en cada iteracin solo aade un factor constante a la funcin de coste O(rp ) Complejidad espacial: Igual que en la bsqueda en profundidad Optimalidad: La solucin es ptima igual que en la bsqueda en anchura Igual que en el caso del algoritmo en profundidad, el tratar repetidos acaba con todas las ventajas espaciales del algoritmo, por lo que es aconsejable no hacerlo. Como mximo se puede utilizar la estructura de nodos abiertos para detectar bucles en el camino actual. Si el algoritmo en profundidad limitada es capaz de encontrar soluciones a mayor profundidad, este algoritmo adems nos garantizar que la solucin ser ptima. Por lo tanto este es el algoritmo ms ventajoso de los tres.

18

Captulo 2. Bsqueda no informada

3 Figura 2.3: Ejemplo de grafo

2.5 Ejemplos
En esta seccin vamos a ver ejemplos de ejecucin de los algoritmos vistos en estos captulos. En la gura 2.3 podemos ver el grafo que vamos a utilizar en los siguientes ejemplos. Este grafo tiene como nodo inicial el 1 y como nodo nal el 8, todos los caminos son dirigidos y tienen el mismo coste. Utilizaremos los algoritmos de bsqueda ciega para encontrar un camino entre estos dos nodos. Supondremos que hacemos un tratamiento de los nodos repetidos durante la ejecucin del algoritmo. Hay que tener en cuenta tambin que para poder recuperar el camino, los nodos deben tener un enlace al padre que los ha generado. Bsqueda en anchura 1. Este algoritmo comenzara encolando el nodo inicial (nodo 1). 2. Los nodos sucesores del primer nodo son los nodos 2 y 3, que pasaran a ser encolados 3. El siguiente nodo extrado de la cola sera el 2, que tiene como sucesores el 4 y el 6. 4. El siguiente nodo extrado de la cola sera el 3, que tiene como sucesores el 4, el 5 y el 7. Como el 4 est repetido no se encolara al ser de la misma profundidad que el nodo repetido. 5. El siguiente nodo extrado de la cola sera el 4, que tiene como sucesor el 5. Como el 4 est repetido no se encolara al tener profundidad mayor que el nodo repetido. 6. El siguiente nodo extrado de la cola sera el 6, que tiene como sucesores el 7 y el 8. Como el 7 est repetido no se encolara al tener profundidad mayor que el nodo repetido. 7. El siguiente nodo extrado de la cola sera el 5, que tiene como sucesores el 6 y el 7. Como los dos nodos corresponden a nodos repetidos con profundidad menor, no se encolaran. 8. El siguiente nodo extrado de la cola sera el 7, que tiene como sucesor el 8. Como el 8 est repetido no se encolara al tener la misma profundidad que el nodo repetido. 9. El siguiente nodo extrado de la cola sera el 8 que es el nodo solucin y por tanto acabara la ejecucin. En la gura 2.4 se puede ver el rbol de bsqueda que se genera. En el caso de los nodos cerrados necesitamos una estructura adicional para controlar los nodos repetidos. resultado) Bsqueda en profundidad 1. Este algoritmo comenzara empilando el nodo inicial (nodo 1).

2.5 Ejemplos 2. Los nodos sucesores del primer nodo son los nodos 2 y 3, que pasaran a ser empilados 3. El siguiente nodo extrado de la pila sera el 2, que tiene como sucesores el 4 y el 6. 4. El siguiente nodo extrado de la pila sera el 4, que tiene como sucesor el 5.

19

5. El siguiente nodo extrado de la pila sera el 5, que tiene como sucesores el 6 y el 7. Como el nodo 6 est en la pila en con nivel superior descartaramos este nodo. 6. El siguiente nodo extrado de la pila sera el 7, que tiene como sucesor el 8. 7. El siguiente nodo extrado de la pila sera el 8 que es el nodo solucin y por tanto acabara la ejecucin. En la gura 2.5 se puede ver el rbol de bsqueda que se genera. Faos que en este caso el camino es ms largo que el encontrado con el algoritmo anterior. De hecho es el primer camino solucin que se encuentra en la exploracin segn la ordenacin que se hace de los nodos. Para el control de repetidos, si se quiere ahorrar espacio, pueden solo tenerse en cuenta los nodos que hay en la pila como se ha hecho en el ejemplo, esto evitar que podamos entrar en bucle y que tengamos que tener una estructura para los nodos cerrados. Bsqueda en profundidad iterativa 1. Primera iteracin (profundidad 1) 1.1 Se comenzara empilando el nodo inicial (nodo 1). 1.2 Al extraer este nodo de la pila habramos visitado todos los caminos de profundidad 1 y con eso acabaramos la iteracin. 2. Segunda Iteracin (profundidad 2) 2.1 Se comenzara empilando el nodo inicial (nodo 1). 2.2 Los nodos sucesores del primer nodo son los nodos 2 y 3, que pasaran a ser empilados. 2.3 El siguiente nodo extrado de la pila sera el 2, los nodos sucesores estaran a mayor profundidad que el lmite actual, no los empilaramos. 2.3 El siguiente nodo extrado de la pila sera el 3, los nodos sucesores estaran a mayor profundidad que el lmite actual, no los empilaramos. Al extraer este nodo de la pila habramos visitado todos los caminos de profundidad 2 y con eso acabaramos la iteracin. 3. Tercera Iteracin (profundidad 3) 3.1 Se comenzara empilando el nodo inicial (nodo 1). 3.2 Los nodos sucesores del primer nodo son los nodos 2 y 3, que pasaran a ser empilados. 3.3 El siguiente nodo extrado de la pila sera el 2, que tiene como sucesores el 4 y el 6. 3.4 El siguiente nodo extrado de la pila sera el 4, los nodos sucesores estaran a mayor profundidad que el lmite actual, no los empilaramos. 3.5 El siguiente nodo extrado de la pila sera el 6, los nodos sucesores estaran a mayor profundidad que el lmite actual, no los empilaramos. 3.6 El siguiente nodo extrado de la pila sera el 3, que tiene como sucesores el 4, el 5 y el 7. 3.7 El siguiente nodo extrado de la pila sera el 4, los nodos sucesores estaran a mayor profundidad que el lmite actual, no los empilaramos.

20

Captulo 2. Bsqueda no informada 3.8 El siguiente nodo extrado de la pila sera el 5, los nodos sucesores estaran a mayor profundidad que el lmite actual, no los empilaramos. 3.4 El siguiente nodo extrado de la pila sera el 7, los nodos sucesores estaran a mayor profundidad que el lmite actual, no los empilaramos. Al extraer este nodo de la pila habramos visitado todos los caminos de profundidad 3 y con eso acabaramos la iteracin. 4. Cuarta Iteracin (profundidad 4) 4.1 Se comenzara empilando el nodo inicial (nodo 1). 4.2 Los nodos sucesores del primer nodo son los nodos 2 y 3, que pasaran a ser empilados. 4.3 El siguiente nodo extrado de la pila sera el 2, que tiene como sucesores el 4 y el 6. 4.4 El siguiente nodo extrado de la pila sera el 4, que tiene como sucesor el 5. 4.5 El siguiente nodo extrado de la pila sera el 5, los nodos sucesores estaran a mayor profundidad que el lmite actual, no los empilaramos. 4.6 El siguiente nodo extrado de la pila sera el 6, que tiene como sucesores el 7 y el 8. 4.7 El siguiente nodo extrado de la pila sera el 7, los nodos sucesores estaran a mayor profundidad que el lmite actual, no los empilaramos. 4.8 El siguiente nodo extrado de la pila sera el 8 que es el nodo solucin y por tanto acabara la ejecucin. En la gura 2.6 se puede ver el rbol de bsqueda que se genera. En este caso encontramos el camino mas corto, ya que este algoritmo explora los caminos en orden de longitud como la bsqueda en anchura. Para mantener la ganancia en espacio en este caso no se han guardado los nodos cerraros, es por ello que no se ha tratado en nodo 4 en el paso 3.7 como repetido.

2.5 Ejemplos

21

Figura 2.4: Ejecucin del algoritmo de bsqueda en anchura

8 Figura 2.5: Ejecucin del algoritmo de bsqueda en profundidad

22

Captulo 2. Bsqueda no informada

1 Primera iteracin

2 Segunda iteracin 1

4 Tercera iteracin 1

Cuarta iteracin Figura 2.6: Ejecucin del algoritmo de bsqueda IDA

3. Bsqueda heurstica

3.1 El conocimiento importa


Es evidente que los algoritmos de bsqueda no informada sern incapaces de encontrar soluciones en problemas en los que el tamao del espacio de bsqueda sea grande. Todos estos algoritmos tienen un coste temporal que es una funcin exponencial del tamao de la entrada, por lo tanto el tiempo para encontrar la mejor solucin a un problema no es asumible en problemas reales. La manera de conseguir reducir este tiempo de bsqueda a algo ms razonable es intentar hacer intervenir conocimiento sobre el problema que queremos resolver dentro del funcionamiento del algoritmo de bsqueda. El problema que tendremos es que este conocimiento ser particular para cada problema, por lo tanto no ser exportable a otros. Perderemos en generalidad, pero podremos ganar en eciencia temporal. En este captulo nos centraremos en los algoritmos que buscan la solucin ptima. Este objetivo solo es abordable hasta cierto tamao de problemas, existir todo un conjunto de problemas en los que la bsqueda del ptimo ser imposible por el tamao de su espacio de bsqueda o por la imposibilidad de encontrar informacin que ayude en la bsqueda.

3.2 El ptimo est en el camino


Para poder plantear la bsqueda del ptimo siempre hemos que tener alguna medida del coste de obtener una solucin. Este coste lo mediremos sobre el camino que nos lleva desde el estado inicial del problema hasta el estado nal. No todos los problemas se pueden plantear de esta forma tal y como veremos en el prximo captulo. Por lo tanto, supondremos que podemos plantear nuestra bsqueda como la bsqueda de un camino y que de alguna manera somos capaces de saber o estimar cul es la longitud o coste de ste. Por lo general, tendremos un coste asociado a los operadores que nos permiten pasar de un estado a otro, por lo que ese coste tendr un papel fundamental en el clculo del coste del camino. Los algoritmos que veremos utilizarn el clculo del coste de los caminos explorados para saber que nodos merece la pena explorar antes. De esta manera, perderemos la sistematicidad de los algoritmos de bsqueda no informada, y el orden de visita de los estados de bsqueda no vendr determinado por su posicin en el grafo de bsqueda, sino por su coste. Dado que el grafo va siendo generado a medida que lo exploramos, podemos ver que tenemos dos elementos que intervienen en el coste del camino hasta la solucin que buscamos. 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 segundo lugar, tendremos el coste ms difcil, que es el del camino que nos queda por recorrer hasta el estado nal. Dado que lo desconocemos, tendremos que utilizar el conocimiento del que disponemos del problema para obtener una aproximacin. Evidentemente, la calidad de ese conocimiento que nos permite predecir el coste futuro, har ms o menos exitosa nuestra bsqueda. Si nuestro conocimiento fuera perfecto, podramos dirigirnos rpidamente hacia el objetivo descartando todos los caminos de mayor coste, en este extremo podramos 23

24

Captulo 3. Bsqueda heurstica

Algoritmo 3.1 Algoritmo Greedy Best First Algoritmo: Greedy Best First Est_abiertos.insertar(Estado inicial) Actual Est_abiertos.primero() mientras no es_nal?(Actual) y no Est_abiertos.vaca?() hacer Est_abiertos.borrar_primero() Est_cerrados.insertar(Actual) hos generar_sucesores (Actual) hos tratar_repetidos (Hos, Est_cerrados, Est_abiertos) Est_abiertos.insertar(Hos) Actual Est_abiertos.primero() n

encontrar nuestra solucin en tiempo lineal. En el otro extremo, si estuviramos en la total ignorancia, tendramos que explorar muchos caminos antes de hallar la solucin ptima, todos en el peor caso. Esta ltima situacin es en la que se encuentra la bsqueda no informada y desgraciadamente la primera situacin es rara. Quedar pues como labor fundamental en cada problema, obtener una funcin que nos haga el clculo del coste futuro desde un estado al estado solucin. Cuanto ms podamos ajustarlo al coste real, mejor funcionarn los algoritmos que veremos a continuacin.

3.3 T primero y t despus


El fundamento de los algoritmos de bsqueda heurstica ser el cmo elegir qu nodo explorar primero, para ello podemos utilizar diferentes estrategias que nos darn diferentes propiedades. Una primera estrategia que se nos puede ocurrir es utilizar la estimacin del coste futuro para decidir qu nodos explorar primero. De esta manera supondremos que los nodos que aparentemente estn ms cerca de la solucin formarn parte del camino hasta la solucin ptima y, por lo tanto, la encontraremos antes si los exploramos en primer lugar. Esta estrategia se traduce en el algoritmo primero el mejor avaricioso (greedy best rst). La nica diferencia respecto a los algoritmos que hemos visto es el utilizar como estructura para almacenar los nodos abiertos una cola con prioridad. La prioridad de los nodos la marca la estimacin del coste del camino del nodo hasta el nodo solucin. El algoritmo 3.1 es su implementacin. El explorar antes los nodos ms cercanos a la solucin probablemente nos har encontrarla antes, pero el no tener en cuenta el coste del camino recorrido hace que no se garantice la solucin ptima, ya que a pesar de guiarnos hacia el nodo aparentemente ms cercano a la solucin, estamos ignorando el coste del camino completo.

3.4 El algoritmo A
Dado que nuestro objetivo no es solo llegar lo mas rpidamente a la solucin, sino encontrar la de menor coste tendremos que tener en cuenta el coste de todo el camino y no solo el camino por recorrer. Para poder introducir el siguiente algoritmo y establecer sus propiedades tenemos primero que dar una serie de deniciones. Denominaremos el coste de un arco entre dos nodos ni y nj al coste del operador que nos

3.4 El algoritmo A Algoritmo 3.2 Algoritmo A Algoritmo: A* Est_abiertos.insertar(Estado inicial) Actual Est_abiertos.primero() mientras no es_nal?(Actual) y no Est_abiertos.vaca?() hacer Est_abiertos.borrar_primero() Est_cerrados.insertar(Actual) hos generar_sucesores (Actual) hos tratar_repetidos (Hos, Est_cerrados, Est_abiertos) Est_abiertos.insertar(Hos) Actual Est_abiertos.primero() n

25

permite pasar de un nodo al otro, y lo denotaremos como c(ni , nj ). Este coste siempre ser positivo. Denominaremos el coste de un camino entre dos nodos ni y nj a la suma de los costes de todos los arcos que llevan desde un nodo al otro y lo denotaremos como
j1

C(ni , nj ) =
x=i

c(nx , nx+1 )

Denominaremos el coste del camino mnimo entre dos nodos ni y nj al camino de menor coste de entre los que llevan desde un nodo al otro y lo denotaremos como
l

K(ni , nj ) = m Ck (ni , nj ) n
k=1

Si nj es un nodo terminal, llamaremos h (ni ) a K(ni , nj ), es decir, el coste del camino mnimo desde un estado cualquiera a un estado solucin. Si ni es un nodo inicial, llamaremos g (nj ) a K(ni , nj ), es decir, el coste del camino mnimo desde el estado inicial a un estado cualquiera. Esto nos permite denir el coste del camino mnimo que pasa por cualquier nodo como una combinacin del coste del camino mnimo desde el nodo inicial al nodo mas el coste del nodo hasta el nodo nal: f (n) = g (n) + h (n) Dado que desde un nodo especco n el valor de h (n) es desconocido, lo substituiremos por una funcin que nos lo aproximar, a esta funcin la denotaremos h(n) y le daremos el nombre de funcin heurstica. Esta funcin tendr siempre un valor mayor o igual que cero. Denominaremos g(n) al coste del camino desde el nodo inicial al nodo n, evidentemente ese coste es conocido ya que ese camino lo hemos recorrido en nuestra exploracin. De esta manera tendremos una estimacin del coste del camino mnimo que pasa por cierto nodo: f (n) = g(n) + h(n) Ser este valor el que utilicemos para decidir en nuestro algoritmo de bsqueda cul es el siguiente nodo a explorar de entre todos los nodos abiertos disponibles. Para realizar esa bsqueda utilizaremos el algoritmo que denominaremos A (algoritmo 3.2). Como se observar, el algoritmo es el mismo que el primero el mejor avaricioso, lo nico que cambia es que ahora la ordenacin de los nodos se realiza utilizando el valor de f . Como criterio de ordenacin, consideraremos que a igual valor de f los nodos con h ms pequea se explorarn antes

26

Captulo 3. Bsqueda heurstica

(simplemente porque si la h es ms pequea es que son nodos mas cerca de la solucin), a igual h se consideraran en el orden en el que se introdujeron en la cola. Nunca est de ms el remarcar que el algoritmo solo acaba cuando se extrae una solucin de la cola. Es posible que en cierto momento ya haya en la estructura de nodos abiertos nodos solucin, pero hasta que no se hayan explorado los nodos por delante de ellos, no podemos asegurar que realmente sean soluciones buenas. Siempre hay que tener en mente que los nodos estn ordenados por el coste estimado del camino total, si la estimacin es menor es que podran pertenecer a un camino con una solucin mejor. Hay que considerar que el coste de este algoritmo es tambin O(rp ) en el caso peor. Si por ejemplo, la funcin h(n) fuera siempre 0, el algoritmo se comportara como una bsqueda en anchura gobernada por el coste del camino recorrido. Lo que hace que este algoritmo pueda tener un coste temporal inferior es la bondad de la funcin h. De hecho, podemos interpretar las funciones g y h como las que gobiernan el comportamiento en anchura o profundidad del algoritmo. Cuanto ms cercana al coste real sea h, mayor ser el comportamiento en profundidad del algoritmo, pues los nodos que aparentemente estn ms cerca de la solucin se explorarn antes. En el momento en el que esa informacin deje de ser able, el coste del camino ya explorado har que otros nodos menos profundos tengan un coste total mejor y, por lo tanto, se abrir la bsqueda en anchura. Si pensamos un poco en el coste espacial que tendr el algoritmo podemos observar que como ste puede comportarse como un algoritmo de bsqueda en anchura, el coste espacial en el caso peor tambin ser O(rp ). Igual nos pasa con el coste temporal, no obstante, si la funcin heurstica es sucientemente buena no llegaremos a necesitar tanto tiempo, ni espacio antes de llegar a la solucin. Un resultado a tener en cuenta es que el coste del algoritmo A crece exponencialmente a no ser que se cumpla que: |h(n) h (n)| < O(log(h (n)) Esto pondr el lmite respecto a cuando podemos obtener una solucin ptima para un problema. Si no podemos encontrar una funcin heurstica sucientemente buena, deberemos usar algoritmos que no busquen el ptimo, pero que nos garanticen que nos acercaremos lo suciente a l para obtener una buena solucin. El tratamiento de nodos repetidos en este algoritmo se realiza de la siguiente forma: Si es un nodo repetido que est en la estructura de nodos abiertos Si su coste es menor substituimos el coste por el nuevo, esto podr variar su posicin en la estructura de abiertos Si su coste es igual o mayor nos olvidamos del nodo Si es un nodo repetido que est en la estructura de nodos cerrados Si su coste es menor reabrimos el nodo insertndolo en la estructura de abiertos con el nuevo coste, no hacemos nada con sus sucesores, ya se reabrirn si hace falta Si su coste es mayor o igual nos olvidamos del nodo Mas adelante veremos que si la funcin h cumple ciertas condiciones podemos evitar el tratamiento de repetidos. A continuacin podemos ver un pequeo ejemplo de ejecucin del algoritmo A

3.5 Pero, encontrar el ptimo?


1
0+2

27

2
1+1 1+1

3
1+3

4
2+1 2+1

5
2+2

6
3+1 3+1

7
3+2

10
4+1 4+1 3+1 4+1

11
5+0 Objetivo 4+0 Objetivo 5+0 Objetivo

Figura 3.1: Ejemplo de ejecucin del algoritmo A

Ejemplo 3.1 Si consideramos el rbol de bsqueda de la gura 3.1, donde en cada nodo tenemos descompuesto el coste en g y h y marcado el orden en el que el algoritmo ha visitado cada nodo. La numeracin en los nodos indica el orden en que el algoritmo A los ha expandido (y por lo tanto el orden en el que han sido extrados de la cola). Podemos observar tambin que hay un nodo abierto que es revisitado por otro camino con un coste inferior que substituye al encontrado con anterioridad.

3.5 Pero, encontrar el ptimo?


Hasta ahora no hemos hablado para nada sobre como garantizar la optimalidad de la solucin. Hemos visto que en el caso degenerado tenemos una bsqueda en anchura guiada por el coste del camino explorado, eso nos debera garantizar el ptimo en este caso. Pero como hemos comentado, la funcin h nos permite obtener un comportamiento de bsqueda en profundidad y sabemos que en este caso no se nos garantiza el ptimo. El saber si encontraremos o no el ptimo mediante el algoritmo A recae totalmente en las propiedades que cumple la funcin heurstica, si esta cumple ciertos criterios sabremos que encontraremos la solucin ptima, si no los cumple, no lo podremos saber.

3.5.1 Admisibilidad
La propiedad clave que nos garantizar el hallar la solucin ptima es la que denominaremos admisibilidad. Diremos que una funcin heurstica h es admisible siempre que se cumpla que su valor en cada nodo sea menor o igual que el valor del coste real del camino que nos falta por recorrer hasta la solucin: n 0 h(n) h (n) Esto quiere decir que la funcin heurstica ha de ser un estimador optimista del coste que falta para llegar a la solucin.

28

Captulo 3. Bsqueda heurstica

Ejemplo 3.2 En la gura 3.2 podemos ver en este ejemplo dos grafos de bsqueda, uno con una funcin admisible y otra que no lo es. En este primer caso, la funcin heurstica siempre es admisible, pero en la primera rama el coste es ms pequeo que el real, por lo que pierde cierto tiempo explorndola (el efecto en profundidad que hemos comentado), pero al nal el algoritmo pasa a la segunda rama hallando la solucin. En el segundo caso el algoritmo acabara al encontrar la solucin en G, a pesar de que haya una solucin con un coste ms pequeo en H. Esto es as porque el coste estimado que da en el nodo D es superior al real y eso le relega en la cola de nodos abiertos.
1 A 2 B
(1+2)

1 A

5 C
(1+3)

D
(1+5)

2 B
(1+2)

C
(1+4)

D
(1+5)

3
(2+2)

6 E
(2+2)

3
(2+2)

H
(2+0) Objetivo

7 F 8

4
(3+1)

(3+1)

(3+1)

I
(4+1)

(4+0) Objetivo

(4+0) Objetivo

Figura 3.2: Efecto de la admisibilidad del heurstico Esta propiedad implica que, si podemos demostrar que la funcin de estimacin h que utilizamos en nuestro problema la cumple, siempre encontraremos una solucin ptima. El problema radica en hacer esa demostracin, pues cada problema es diferente. Por ello, no podemos dar un mtodo general para demostrar la admisibilidad de una funcin heurstica. Lo que s podemos establecer, es que para demostrar que una funcin heurstica no es admisible basta con encontrar un nodo que incumpla la propiedad. Esto se puede observar simplemente comprobando si alguno de los nodos que estn en el camino solucin tiene un coste mayor que el real, pues solo disponemos del coste real para los nodos de ese camino. Hay que remarcar tambin que la propiedad de admisibilidad es un propiedad de la funcin heurstica, y es independiente del algoritmo que la utiliza, por lo que si la funcin es admisible cualquier algoritmo de los que veamos que la utilice nos hallar la solucin ptima. Para una discusin sobre tcnicas para construir heursticos admisibles se puede consultar el captulo 4, seccin 4.2, del libro Inteligencia Articial: Un enfoque moderno de S. Russell y P. Norvig .

3.5.2 Consistencia
Podemos denir la propiedad de consistencia como una extensin de la propiedad de admisibilidad. Si tenemos el coste h (ni ) y el coste h (nj ) y el coste ptimo para ir de ni a nj , o sea K(ni , nj ), se ha de cumplir la desigualdad triangular: h (ni ) h (nj ) + K(ni , nj )

3.6 Mi memoria se acaba La condicin de consistencia exige pedir lo mismo al estimador h: h(ni ) h(nj ) K(ni , nj )

29

Es decir, que la diferencia de las estimaciones sea menor o igual que la distancia ptima entre nodos. Si esta propiedad se cumple esto quiere decir que h es un estimador uniforme de h . Es decir, la estimacin de la distancia que calcula h disminuye de manera uniforme. Si h es consistente adems se cumple que el valor de g(n) para cualquier nodo es g (n), por lo tanto, una vez hemos llegado a un nodo sabemos que hemos llegado a l por el camino ptimo desde el nodo inicial. Si esto es as, no es posible que nos encontremos el mismo nodo por un camino alternativo con un coste menor y esto hace que el tratamiento de nodos cerrados duplicados sea innecesario, lo que nos ahorra tener que guardarlos. Habitualmente las funciones heursticas admisibles suelen ser consisitentes y, de hecho, hay que esforzarse bastante para consequir que no sea as.

3.5.3 Heurstico ms informado


Otra propiedad interesante es la que nos permite comparar heursticos entre si y nos permite saber cul de ellos har que A encuentre ms rpido una solucin ptima. Diremos que el heurstico h1 es ms informado que el heurstico h2 si se cumple la propiedad: n 0 h2 (n) < h1 (n) h (n) Se ha de observar que esta propiedad incluye que los dos heursticos sean admisibles. Si un heurstico es mas informado que otro seguro que A expandir menos nodos durante la bsqueda, ya que su comportamiento ser ms en profundidad y habr ciertos nodos que no se explorarn. Esto nos podra hacer pensar que siempre tenemos que escoger el heurstico ms informado. Hemos de pensar tambin que la funcin heurstica tiene un tiempo de clculo que afecta al tiempo de cada iteracin. Evidentemente, cuanto ms informado sea el heurstico, mayor ser ese coste. Nos podemos imaginar por ejemplo, que si tenemos un heurstico que necesita por ejemplo 10 iteraciones para llegar a la solucin, pero tiene un coste de 100 unidades de tiempo por iteracin, tardar ms en llegar a la solucin que otro heurstico que necesite 100 iteraciones pero que solo necesite una unidad de tiempo por iteracin. Esto nos hace pensar en que tenemos que encontrar un equilibrio entre el coste del clculo de la funcin heurstica y el nmero de expansiones que nos ahorramos al utilizarla. Es posible que una funcin heurstica peor nos acabe dando mejor resultado. Todo esto es evidentemente dependiente del problema, incluso nos podemos encontrar con que una funcin no admisible nos permita hallar mas rpidamente la solucin, a pesar de que no nos garantice la optimalidad. Esto ha llevado a proponer variantes de A donde se utilizan heursticos cerca de la admisibilidad ( -admisibilidad) que garantizan una solucin dentro de un rango del valor del coste ptimo.

3.6 Mi memoria se acaba


El algoritmo A tiene sus limitaciones de espacio impuestas en primer lugar por poder acabar degenerando en una bsqueda en anchura si la funcin heurstica no es demasiado buena. Adems, si la solucin del problema est a mucha profundidad o el tamao del espacio de bsqueda es muy grande, no hace falta mucho para llegar a necesidades de espacio prohibitivas. Esto nos lleva a plantearnos algoritmos alternativos con menores necesidades de espacio.

30 Algoritmo 3.3 Algoritmo IDA

Captulo 3. Bsqueda heurstica

Algoritmo: IDA* (limite entero) prof f (Estado inicial) Actual Estado inicial mientras no es_nal?(Actual) y prof<limite hacer Est_abiertos.incializa() Est_abiertos.insertar(Estado inicial) Actual Est_abiertos.primero() mientras no es_nal?(Actual) y no Est_abiertos.vaca?() hacer Est_abiertos.borrar_primero() Est_cerrados.insertar(Actual) Hos generar_sucesores (Actual, prof) Hos tratar_repetidos (Hos, Est_cerrados, Est_abiertos) Est_abiertos.insertar(Hos) Actual Est_abiertos.primero() prof prof+1

3.6.1 El algoritmo IDA

La primera solucin viene de la mano del algoritmo en profundidad iterativa que hemos visto en el captulo anterior. En este caso lo replanteamos para utilizar la funcin f como el valor que controla la profundidad a la que llegamos en cada iteracin. Esto quiere decir que hacemos la bsqueda imponiendo un lmite al coste del camino que queremos hallar (en la primera iteracin, la f del nodo raz), explorando en profundidad todos los nodos con f igual o inferior a ese lmite y reiniciando la bsqueda con un coste mayor si no encontramos la solucin en la iteracin actual. Es el algoritmo 3.3. La funcin generar_sucesores solo retorna los nodos con un coste inferior o igual al de la iteracin actual.

Este algoritmo admite varias optimizaciones, como no aumentar el coste de uno en uno, sino averiguar cual es el coste ms pequeo de los nodos no expandidos en la iteracin actual y usarlo en la siguiente iteracin. El bucle interior es el que realiza la bsqueda en profundidad limitada y tambin se podra optimizar utilizando una implementacin recursiva. Este algoritmo, al necesitar solo una cantidad de espacio lineal, permite hallar soluciones a ms profundidad. El precio que hemos de pagar es el de las reexpansiones de nodos ya visitados. Este precio extra depender de la conectividad del grafo del espacio de estados, si existen muchos ciclos este puede ser relativamente alto ya que a cada iteracin la efectividad de la exploracin real se reduce con el nmero de nodos repetidos que aparecen.

3.6 Mi memoria se acaba


(1,3,8)

31

0+2

(2,4,9)

1+1

1+2

(6,12)

(5,10)

2+1

2+1

(7,13)

(11)

3+1

3+1

(14)

4+1

4+0
Objetivo

(15)

5+0
Objetivo

Figura 3.3: Ejemplo de ejecucin del algoritmo IDA

Si consideramos el cociente entre los nodos nuevos que se expanden en un nivel y los nodos que se han reexpandido, podemos ver que este tiende a 0 al aumentar el factor de ramicacin, por lo que el trabajo de reexpandir los nodos es despreciable cuando el problema es complejo. Siendo r el factor de ramicacin del problema, si consideramos que rn+1 ser en nmero de nodos que visitaremos en el nivel n + 1 y n ri es la suma de nodos que revisitamos en ese i=1 nivel:
n i i=1 r rn+1

r + r2 + r3 + + rn 1 + r + r2 + r3 + + rn1 1 1 1 1 = = n + n1 + + = n+1 n r r r r r r1

Ejemplo 3.3 Si consideramos el rbol de bsqueda de la gura 3.3, donde en cada nodo tenemos descompuesto el coste en g y h y marcado el orden en el que el algoritmo ha visitado cada nodo. La numeracin en los nodos indica el orden en que el algoritmo IDA los ha expandido. Podemos observar que los nodos se reexpanden varias veces siguiendo la longitid del camino estimado impuesta en cada iteracin del algoritmo-

3.6.2 Otras alternativas


Las reexpansiones del IDA pueden llegar a ser un problema, e incrementar bastante el tiempo de bsqueda. Estas reexpansiones se deben fundamentalmente a que estamos imponiendo unas restricciones de espacio bastantes severas. Si relajramos esta restriccin mantenindola en lmites razonables podramos guardar informacin suciente para no tener que realizar tantas reexpansiones. Una primera alternativa es el algoritmo primero el mejor recursivo (recursive best rst). El elemento clave es la implementacin recursiva, que permite que el coste espacial se mantenga lineal (O(rp)) al no tener que guardar mas que los nodos que pertenecen al camino actual y sus hermanos en cada nivel. Este algoritmo intenta avanzar siempre por la rama ms prometedora (segn la funcin heurstica f ) hasta que alguno de los nodos alternativos del camino tiene un coste mejor. En este momento el

32 Algoritmo 3.4 Algoritmo Best First Recursivo

Captulo 3. Bsqueda heurstica

Procedimento: BFS-recursivo (nodo,c_alternativo,ref nuevo_coste,ref solucion) si es_solucion?(nodo) entonces solucion.aadir(nodo) sino sucesores generar_sucesores (nodo) si sucesores.vacio?() entonces nuevo_coste +; solucion.vacio() sino n falso mientras no n hacer mejor sucesores.mejor_nodo() si mejor.coste() > c_alternativo entonces n cierto; solucion.vacio(); nuevo_coste mejor.coste() sino segundo sucesores.segundo_mejor_nodo() BFS-recursivo(mejor,min(c_alternativo,segundo.coste()),nuevo_coste, solucion) si solucion.vacio?() entonces mejor.coste(nuevo_coste) sino solucion.aadir(mejor); n cierto

camino del nodo actual es olvidado, pero modicando la estimacin de los ascendientes con la del nodo mas profundo al que se ha llegado. Se podra decir que con cada reexpansin estamos haciendo el heurstico ms informado. Manteniendo esta informacin sabremos si hemos de volver a regenerar esa rama olvidada, si pasa a ser la de mejor coste. El efecto que tiene esta exploracin es ir renando la estimacin que se tiene de la funcin heurstica en los nodos que se mantienen abiertos, de manera que el nmero de reexpansiones se ir reduciendo paulatinamente ya que el coste guardado ser cada vez ms cercano al coste real. Se puede ver en algoritmo 3.4. Ejemplo 3.4 En la gura 3.4 se puede ver como evoluciona la bsqueda en un ejemplo sencillo, en cada nodo aparece el valor de la funcin f : Podemos ver que cuando llega a la tercera iteracin el nodo con mejor coste es el de 12 y por lo tanto la recursividad vuelve hasta ese nodo borrando la rama explorada, pero actualizando cada padre con el mejor coste encontrado, en este caso 17. En la cuarta iteracin se encuentra que ahora es el nodo con coste 17 el de mejor coste, por lo que el camino vuelve a regenerarse. Por lo general, el nmero de reexpansiones de este algoritmo es menor que el de IDA , pero puede depender de las caractersticas del espacio de bsqueda como por ejemplo la longitud de los ciclos que pueda haber. Este algoritmo tambin impone un coste lineal al espacio, por lo que tambin se pueden generar bastantes reexpansiones. Otra alternativa diferente viene de una modicacin del A , es el algoritmo llamado A con memoria limitada (memory bound A ). Este algoritmo utiliza la estrategia de exploracin de A pero siguiendo una estrategia de memorizacin de caminos parecida al best rst recursivo. ste almacena todos los caminos que le caben en el tamao de memoria que se impone y no solo el actual, de manera que se ahorra regenerar ciertos caminos. Cuanta ms memoria permitamos, menos regeneraciones de caminos haremos ya que nos los encontraremos almacenados.

3.6 Mi memoria se acaba


1 1 2
18 8 12 18 8 12 18 8

33
1 2
12

3
18 11 19 18 11 19

17

20

2
18 8 12 18 17

2
12

4
18 17

5
20

6
18 17 19 20 21 18 17 19

7
17 20

8
17

Figura 3.4: Ejemplo de ejecucin del algoritmo BF-recursivo El algoritmo elimina los caminos peores en el momento en el que ya no caben ms, guardando en los nodos la informacin suciente que le permita saber cuando se han de regenerar. El aporte extra de memoria permite reducir bastante las reexpansiones, con el consiguiente ahorro de tiempo. El algoritmo es capaz de hallar una solucin, si el camino completo cabe en la cantidad de memoria que hemos impuesto. Esto quiere decir que, si tenemos una idea aproximada de la longitud de la solucin podemos ajustar a priori la cantidad de memoria que permitiremos usar al algoritmo. Este algoritmo es mucho mas complejo que los anteriores y existen diferentes versiones. Principalmente la complejidad viene de como se han de reorganizar los caminos memorizados cuando se han de borrar la memoria y la propagacin de los costes a los nodos ascendientes que se mantienen.

4. Bsqueda local

4.1 El tamao importa, a veces


Los algoritmos que hemos visto en el capitulo anterior nos sirven siempre que podamos plantear el problema como la bsqueda de un camino en un espacio de estados. Pero nos podemos encontrar con problemas en los que: Este planteamiento es demasiado articial, ya que no tenemos realmente operadores de cambio de estado, o no hay realmente una nocin de coste asociada a los operadores del problema La posibilidad de hallar la solucin ptima est fuera de toda posibilidad, dado que el tamao del espacio de bsqueda es demasiado grande y nos conformamos con una solucin que podamos considerar buena. En este tipo de problemas puede ser relativamente fcil hallar una solucin inicial, aunque no sea demasiado buena. Esto hace que nos podamos plantear el problema como una bsqueda dentro del espacio de soluciones, en lugar de en el de caminos. Tambin es posible que sea muy difcil crear una solucin inicial (aunque sea mala) y podamos iniciar la bsqueda desde el espacio de no soluciones (soluciones no vlidas) suponiendo que la bsqueda nos llevar al nal al espacio de soluciones. El comenzar desde el espacio de soluciones o desde el de no soluciones depender de las caractersticas del problema. A veces el nmero de soluciones vlidas es muy reducido debido a que lo que exigimos para ser una solucin es muy estricto y es imposible generar una solucin inicial sin realizar una bsqueda. Si sabemos que partiendo desde una solucin invlida podremos alcanzar el espacio de soluciones, no habr problema, el algoritmo har esa bsqueda inicial guiado por la funcin heurstica. Si no es as, deberemos usar otros algoritmos ms exhaustivos que nos aseguren hallar una solucin. En este planteamiento lo que suponemos es que podemos navegar dentro del espacio de posibles soluciones realizando operaciones sobre ellas que nos pueden ayudar a mejorarlas. El coste de estas operaciones no ser relevante ya que lo que nos importa es la calidad de la solucin1 , en este caso lo que nos importar es esa la calidad. Deberemos disponer de una funcin que segn algn criterio (dependiente del dominio) nos permita ordenarlas. El planteamiento de los problemas es parecido al que consideramos al hablar del espacio de estados, tenemos los siguientes elementos: Un estado inicial, que en este caso ser una solucin completa. Esto nos plantear el problema adicional de como hallarla con un coste relativamente bajo y el evaluar desde donde emperaremos a buscar, si desde una solucin relativamente buena, desde la peor, desde una al azar, ... Unos operadores de cambio de la solucin, que en este caso manipularn soluciones completas y que no tendrn un coste asociado.
1 De hecho muchas veces estas operaciones no se reeren a operaciones reales en el problema, sino a formas de manipular la solucin.

35

36

Captulo 4. Bsqueda local Una funcin de calidad, que nos medir lo buena que es una solucin y nos permitir guiar la bsqueda, pero teniendo en cuenta que este valor no nos indica cuanto nos falta para encontrar la solucin que buscamos. Ya que no representa un coste, es una manera de comparar la calidad entre las soluciones vecinas e indicarnos cual es la direccin que lleva a soluciones mejores.

El saber cuando hemos acabado la bsqueda depender totalmente del algoritmo, que tendr que decidir cuando ya no es posible encontrar una solucin mejor. Por lo tanto no tendremos un estado nal denido. Para buscar una analoga con un tema conocido, se puede asimilar la bsqueda local con la bsqueda de ptimos en funciones. En este caso la funcin a optimizar2 ser la funcin de calidad de la solucin, la funcin se denir en el espacio de soluciones generado por la conectividad que inducen los operadores entre ellas. Desafortunadamente, las funciones que aparecern no tendrn una expresin analtica global, ni tendrn las propiedades que nos permitiran aplicar los algoritmos de bsqueda de ptimos en funciones. Estas funciones pueden ser de cualquier tipo, y no estn limitadas de la manera que lo estn las funciones usadas por los algoritmos de bsqueda heurstica. Sus valores pueden ser tanto positivos, como negativos y, obviamente, su valor en la solucin no tiene por que ser cero. El planteamiento ser pues bastante diferente. Ya que no tenemos una expresin analtica global, deberemos explorar la funcin de calidad utilizando solamente lo que podamos obtener de los vecinos de una solucin, sta deber permitir decidir por donde seguir buscando el ptimo. El nombre de bsqueda local viene precisamente de que solo utilizamos informacin local durante el proceso de hallar la mejor solucin.

4.2 Tu s, vosotros no
Enfrentados a problemas con tamaos de espacio de bsqueda inabordables de manera exhaustiva, nos hemos de plantear estrategias diferentes a las utilizadas hasta ahora. En primer lugar, tendremos pocas posibilidades de guardar informacin para recuperar caminos alternativos dado el gran nmero de alternativas que habr. Esto nos obligar a imponer unas restricciones de espacio limitadas, lo que nos llevar a tener que decidir que nodos debemos explorar y cuales descartar sin volver a considerarlos. Esto nos lleva a la familia de algoritmos conocida como de ramicacin y poda (branch and bound). Esta familia de algoritmos limita el nmero de elementos que guardamos como pendientes de explotar olvidando los que no parecen prometedores. Estos algoritmos permiten mantener una memoria limitada, ya que desprecian parte del espacio de bsqueda, pero se arriesgan a no hallar la mejor solucin, ya que esta puede estar en el espacio de bsqueda que no se explora. De entre los algoritmos de ramicacin y poda, los ms utilizados son los denominados de ascenso de colinas (Hill-climbing). Existen diferentes variantes que tienen sus ventajas e inconvenientes. Por ejemplo, el denominado ascenso de colinas simple, que consiste en elegir siempre el primer operador que suponga una mejora respecto al nodo actual, de manera que no exploramos todas las posibilidades accesibles, ahorrndonos el explorar cierto nmero de descendientes. La ventaja es que es ms rpido que explorar todas las posibilidades, la desventaja es que hay ms probabilidad de no alcanzar las soluciones mejores. El ms utilizado es el ascenso de colinas por mxima pendiente (steepest ascent hill climbing). Esta variante expande todos los posibles descendientes de un nodo y elige el que suponga la mxima mejora respecto al nodo actual. Con esta estrategia suponemos que la mejor solucin la
2 Hablamos de optimizar, y no de minimizar o maximizar, ya que la diferencia entre ellas es simplemente un cambio de signo en la funcin a optimizar.

4.2 Tu s, vosotros no Algoritmo 4.1 Algoritmo Steepest Ascent Hill Climbing Algoritmo: Hill Climbing Actual Estado_inicial n falso mientras no n hacer Hos generar_sucesores(Actual) Hos ordenar_y_eliminar_peores(Hos, Actual) si no vacio?(Hos) entonces Actual Escoger_mejor(Hos) sino n cierto n n
max max

37

Figura 4.1: El ptimo depende del punto de inicio

encontraremos a travs del sucesor que mayor diferencia tenga respecto a la solucin actual, siguiendo una poltica avariciosa. Como veremos ms adelante esta estrategia puede ser arriesgada. El algoritmo que implementa este ltimo es el algoritmo 4.1. En este algoritmo la utilizacin de memoria es nula, ya que solo tenemos en cuenta el nodo mejor3 . Se pueden hacer versiones que guarden caminos alternativos que permitan una vuelta atrs en el caso de que consideremos que la solucin a la que hemos llegado no es sucientemente buena, pero hemos de imponer ciertas restricciones de memoria, si no queremos tener un coste espacial demasiado grande. Comentaremos estos algoritmos ms adelante. La estrategia de este algoritmo hace que los problemas que tiene, vengan principalmente derivados por las caractersticas de las funciones heursticas que se utilizan. Por un lado, hemos de considerar que el algoritmo parar la exploracin en el momento en el que no se encuentra ningn nodo accesible mejor que el actual. Dado que no mantenemos memoria del camino recorrido nos ser imposible reconsiderar nuestras decisiones, de modo que si nos hemos equivocado, la solucin a la que llegaremos ser la ptima. Esta circunstancia es probable, ya que seguramente la funcin heurstica que utilicemos tendr ptimos locales y, dependiendo de por donde empecemos a buscar, acabaremos encontrando uno u otro, como se puede ver en la gura 4.1. Si iniciamos la bsqueda desde el punto A o el B, el mximo que alcanzaremos ser diferente. Esta circunstancia se puede mejorar mediante la ejecucin del algoritmo cierto nmero de veces desde distintos puntos escogidos aleatoriamente y quedndonos con la mejor exploracin. A esta
3 Hay que recordar que en este tipo de bsqueda el camino no nos importa, por lo que el gasto en espacio es constante.

38

Captulo 4. Bsqueda local

Figura 4.2: Mesetas y escalones en bsqueda local estrategia se la denomina bsqueda por ascenso con reinicio aleatorio (random restarting hill climbing). Muchas veces esta estrategia es ms efectiva que mtodos ms complejos que veremos a continuacin y resulta bastante barata. La nica complicacin est en poder generar los distintos puntos iniciales de bsqueda, ya que en ocasiones el problema no permite hallar soluciones iniciales con facilidad. Otro problema con el que se encuentran estos algoritmos son zonas del espacio de bsqueda en las que la funcin heurstica no es informativa. Un ejemplo son las denominadas mesetas y las funciones en escaln (gura 4.2), en las que los valores de los nodos vecinos al actual tienen valores iguales, y por lo tanto una eleccin local no nos permite decidir el camino a seguir. Evitar estos problemas requiere extender la bsqueda a ms all de los vecinos inmediatos para obtener la informacin suciente para encaminar la bsqueda. Desgraciadamente esto supone un coste adicional en cada iteracin. Una alternativa es permitir que el algoritmo guarde parte de los nodos visitados para proseguir la bsqueda por ellos en el caso de que el algoritmo se que de atascado en un ptimo local. El algoritmo ms utilizado es el denominado bsqueda en haces (beam search). En este algoritmo se van guardando un nmero N de las mejores soluciones, expandiendo siempre la mejor de ellas. De esta manera no se sigue un solo camino sino N . Las variantes del algoritmo estn en cmo se escogen esas N soluciones que se mantienen. Si siempre se substituyen las peores soluciones de las N por los mejores sucesores del nodo actual, caemos en el peligro de que todas acaben estando en el mismo camino, reduciendo la capacidad de volver hacia atrs, as que el poder mantener la variedad de las soluciones guardadas es importante. Est claro que cuantas mas soluciones guardemos ms posibilidad tendremos de encontrar una buena solucin, pero tendremos un coste adicional tanto en memoria como en tiempo, ya que tendremos que calcular con que sucesores nos quedamos y que soluciones guardadas substituimos. Su implementacin se puede ver en el algoritmo 4.2. El algoritmo acaba cuando ninguno de los sucesores mejora a las soluciones guardadas, esto quiere decir que todas las soluciones son un ptimo local. Como veremos ms adelante esta tcnica de bsqueda tiene puntos en comn con los algoritmos genticos.

4.3 Un mundo de posibilidades


La estrategia de bsqueda del algoritmo hill climbing y sus variantes es la ms simple que se puede utilizar. El mayor problema es que es demasiado optimista y asume que hay un camino ms o menos directo (siempre ascendente) a los ptimos locales. En problemas difciles esto no tiene por que ser as, y hacen falta estrategias un poco ms exhaustiva, explorando ms nodos que solo el camino directo y que sepan aprovechar la informacin que vamos encontrando por el camino. Varias son las estrategias que podemos aadir a la estrategia bsica del hill climbing que pueden mejorar sustancialmente sus resultados. La primera es explorar no solo los vecinos mejores, sino tambin otros que pueden se peores, pero que pueden ocultar un camino que es mejor que el que

4.3 Un mundo de posibilidades Algoritmo 4.2 Algoritmo Beam Search Algoritmo: Beam Search Actual Estado_inicial Soluciones_actuales.aadir(Estado_inicial) n falso mientras no n hacer Hos generar_sucesores(Actual) soluciones_actuales.actualizar_mejores(Hos) si soluciones_actuales.algun_cambio?() entonces Actual soluciones_actuales.escoger_mejor() sino n cierto n n

39

podemos encontrar si seguimos directamente la pendiente ascendente de la funcin heurstica. Para decidir qu nodos peores visitar necesitamos una estrategia de decisin, una posibilidad es la que plantea el algoritmo simulated annealing que veremos en la siguiente seccin. Otra posibilidad es usar informacin de ms alto nivel que podamos ir encontrando durante la bsqueda, como por ejemplo, qu operaciones son las que consiguen mejorar ms las soluciones (o no lo consiguen) de manera que podamos concentrarnos ms en algunas operaciones que en otras (reduciendo as el espacio de bsqueda, o que partes de la descripcin de la solucin aportan ms a la calidad de la solucin o qu partes nunca la mejoran, de manera que nos podamos concentrar en operaciones que se centren en esos elementos de la solucin. Estas y otras estrategias parecidas son las que utiliza el algoritmo tab search, este algoritmo puede prohibir o permitir operaciones sobre la solucin en funcin de la informacin que se vaya obteniendo durante la bsqueda. Una ltima posibilidad que ha dado lugar a muchos algoritmos es el uso de una poblacin de soluciones en lugar de una sola solucin, siguiendo la idea del algoritmo beam search. El tener una poblacin de soluciones nos permite ver ms parte del espacio de bsqueda, siendo ms exhaustivos y, ademas, obtener ms informacin que nos permitir concentrarnos ms en soluciones con ciertas caractersticas o el evitar parte del espacio de bsqueda que no tenga soluciones buenas. Muchos de los mtodos que siguen esta estrategia estn inspirados en analogas biolgicas o fsicas. Los ms conocidos son los algoritmos evolutivos, que incluyen a los algoritmos genticos que veremos en la ltima seccin, pero que tambin incluyen a otros algoritmos que se basan en conceptos inspirados en la evolucin de las especies y ecologa. Otra familia de algoritmos que usan tambin una estrategia de poblacin es la denominada swarm intelligence, incluye algoritmos que estn inspirados en biologa como el algoritmo Particle Swarm Optimization, que se inspira en el comportamiento de las bandadas de pjaros y los bancos de peces, el Ant Colony Optimization que se inspira en la forma que usan las hormigas de solucionar problemas (son buenos para la resolucin de problemas que se pueden representar como caminos en grafos), ademas de algoritmos inspirados en el comportamiento de abejas, lucirnagas, cucos, monos, el sistema inmunitario... Tambin hay algoritmos inspirados en fenmenos fsicos como Intelligent Water Drops que simula la interaccin de las gotas de agua, River formation dynamics, que usa la estrategia de formacin de los ros, Gravitational search algorithm, que usa la interaccin de la fuerza de gravedad entre partculas, ... La aplicacin de todos estos algoritmos se ha ido extendiendo ms all de los problemas de inteligencia articial y se aplican a cualquier problema que involucre la optimizacin de una funcin y que no se pueda resolver por mtodos clsicos. De hecho, todos estos algoritmos se incluyen en un

40 rea de computacin conocida como metaheursticas

Captulo 4. Bsqueda local

4.4 Demasiado calor, demasiado fro


Se han planteado algoritmos alternativos de bsqueda local que se han mostrado efectivos en algunos dominios en los que los algoritmos de bsqueda por ascenso se quedan atascados enseguida en ptimos no demasiado buenos. El primero que veremos es el denominado templado simulado (simulated annealing). Este algoritmo est inspirado en un fenmeno fsico que se observa en el templado de metales y en la cristalizacin de disoluciones. Todo conjunto de tomos o molculas tiene un estado de energa que depende de cierta funcin de la temperatura del sistema. A medida que lo vamos enfriando, el sistema va perdiendo energa hasta que se estabiliza. El fenmeno fsico que se observa es que dependiendo de como se realiza el enfriamiento, el estado de energa nal es muy diferente. Por ejemplo, si una barra de metal se enfra demasiado rpido la estructura cristalina a la que se llega al nal est poco cohesionada (un nmero bajo de enlaces entre tomos) y sta se rompe con facilidad. Si el enfriamiento se realiza ms lentamente, el resultado nal es totalmente diferente, el nmero de enlaces entre los tomos es mayor y se obtiene una barra mucho ms difcil de romper. Durante este enfriamiento controlado, se observa que la energa del conjunto de tomos no disminuye de manera constante, sino que a veces la energa total puede ser mayor que en un momento inmediatamente anterior. Esta circunstancia hace que el estado de energa nal que se alcanza sea mejor que cuando el enfriamiento se hace rpidamente. A partir de este fenmeno fsico, podemos derivar un algoritmo que permitir en ciertos problema hallar soluciones mejores que los algoritmos de bsqueda por ascenso. En este algoritmo el nodo siguiente a explorar no ser siempre el mejor descendiente, sino que lo elegiremos aleatoriamente en funcin de los valores de unos parmetros entre todos los descendientes (los buenos y los malos). Una ventaja de este algoritmo es que no tenemos por que generar todos los sucesores de un nodo, basta elegir un sucesor al azar y decidir si continuamos por l o no. El algoritmo de templado simulado se puede ver como una versin estocstica del algoritmo de bsqueda por ascenso. El algoritmo de templado simulado intenta transportar la analoga fsica al problema que queremos solucionar. En primer lugar denominaremos funcin de energa a la funcin heurstica que nos mide la calidad de una solucin. Tendremos un parmetro de control que denominaremos temperatura, que nos permitir controlar el funcionamiento del algoritmo. Tendremos una funcin que depender de la temperatura y de la diferencia de calidad entre el nodo actual y un sucesor. sta gobernar la eleccin de los sucesores, su comportamiento ser el siguiente: Cuanta mayor sea la temperatura, ms probabilidad habr de que al generar como sucesor un estado peor ste sea elegido La eleccin de un estado peor estar en funcin de su diferencia de calidad con el estado actual, cuanta ms diferencia, menos probabilidad de elegirlo. El ltimo elemento es la estrategia de enfriamiento. El algoritmo realizar un nmero total de iteraciones jo y cada cierto nmero de ellas el valor de la temperatura disminuir en cierta cantidad, partiendo desde una temperatura inicial y llegando a cero en la ltima fase. De manera que, la eleccin de estos dos parmetros (nmero total de iteraciones y nmero de iteraciones entre cada bajada de temperatura) determinarn el comportamiento del algoritmo. Habr que decidir

4.4 Demasiado calor, demasiado fro Algoritmo 4.3 Algoritmo Simulated Annealing Algoritmo: Simulated Annealing Partimos de una temperatura inicial mientras la temperatura no sea cero hacer // Paseo aleatorio por el espacio de soluciones para un numero prejado de iteraciones hacer Enuevo Genera_sucesor_al_azar(Eactual) E f (Eactual) f (Enuevo) si E > 0 entonces Eactual Enuevo sino con probabilidad eE/T : Eactual Enuevo n n Disminuimos la temperatura n

41

HC SA

Figura 4.3: Estrategia de exploracin del simulated annealing experimentalmente cual es la temperatura inicial ms adecuada y forma ms adecuada de hacer que vaya disminuyendo. Como en la analoga fsica, si el nmero de pasos es muy pequeo, la temperatura bajar muy rpidamente, y el camino explorado ser relativamente aleatorio. Si el nmero de pasos es ms grande, la bajada de temperatura ser ms suave y la bsqueda ser mejor. El algoritmo que implementa esta estrategia es el algoritmo 4.3. En la gura 4.3 podemos ver el comportamiento que tendra el simulated annealing comparado con el de hill climbing. Este algoritmo se adapta muy bien a problemas de optimizacin combinatoria (conguracin ptima de elementos) y continua (punto ptimo en un espacio N-dimensional). Est indicado para problemas con un espacio de bsqueda grande en los que el ptimo est rodeado de muchos ptimos locales4 , ya que a este algoritmo le ser ms fcil escapar de ellos. Se puede utilizar tambin para problemas en los que encontrar una heurstica discriminante es difcil (una eleccin aleatoria es tan buena como otra cualquiera), ya que el algoritmo de ascenso
4

Un rea en la que estos algoritmos han sido muy utilizados es la del diseo de circuitos VLSI.

42

Captulo 4. Bsqueda local

de colinas no tendr mucha informacin con la que trabajar y se quedar atascado enseguida. En cambio el templado simulado podr explorar ms espacio de soluciones y tendr mayor probabilidad de encontrar una solucin buena. El mayor problema de este algoritmo ser determinar los valores de los parmetros, y requerir una importante labor de experimentacin que depender de cada problema. Estos parmetros variarn con el dominio del problema e incluso con el tamao de la instancia del problema.

4.5 Cada oveja con su pareja


Otra analoga que ha dado lugar un conjunto de algoritmos de bsqueda local bastante efectivos es la seleccin natural como mecanismo de adaptacin de los seres vivos. Esta analoga se ja en que los seres vivos se adaptan al entorno gracias a las caractersticas heredadas de sus progenitores, en que las posibilidades de supervivencia y reproduccin son proporcionales a la bondad de esas caractersticas y en que la combinacin de buenos individuos puede dar lugar a individuos mejor adaptados. Podemos trasladar estos elementos a la bsqueda local identicando las soluciones con individuos y donde una funcin de calidad indicar la bondad de la solucin, es decir, su adaptacin a las caractersticas del problema. Dispondremos de unos operadores de bsqueda que combinarn buenas soluciones con el objetivo de obtener soluciones mejores como resultado. El ejemplo que veremos de algoritmos que utilizan esta analoga es el de los algoritmos genticos5 . Se trata de una familia bastante amplia de algoritmos, nosotros solo veremos el esquema bsico. Estos algoritmos son bastante ms complejos que los algoritmos que hemos visto hasta ahora y requieren ms elementos y parmetros, por lo que su utilizacin requiere cierta experiencia y mucha experimentacin. Los requisitos bsicos para usarlos son: Dar una codicacin a las caractersticas de las soluciones. Las soluciones se representan de una manera especial para que despus se puedan combinar. Por lo general se utilizan cadenas binarias que codican los elementos de la solucin, por analoga a esta codicacin se la denomina gen6 . Tener una funcin que mida la calidad de la solucin. Se tratar de la funcin heurstica que se utiliza en todos los algoritmos que hemos visto. En el rea de algoritmos genticos a esta funcin se la denomina funcin de adaptacin (tness). Disponer de operadores que combinen las soluciones para obtener nuevas soluciones. Los operadores que utilizan los algoritmos genticos son bastante jos y estn inspirados en las formas de reproduccin celular. Decidir el nmero de individuos inicial. Un algoritmo gentico no trata un solo individuo, sino una poblacin, se ha de decidir cuan numerosa ha de ser. Decidir una estrategia para hacer la combinacin de individuos. Siguiendo la analoga de la seleccin natural, solo se reproducen los individuos ms aptos, hemos de decidir un criterio para emparejar a los individuos de la poblacin en funcin de su calidad.
5 Existen tambin los denominados algoritmos evolutivos, son menos conocidos, pero suelen ser bastante efectivos en ciertas aplicaciones. 6 Esta no tiene por que ser siempre la representacin ms adecuada y de hecho a veces una representacin binaria hace que el problema no se pueda solucionar ecientemente.

4.5 Cada oveja con su pareja Vamos a detallar un poco ms cada uno de estos elementos.

43

El uso de los algoritmos genticos presenta ciertas ventajas prcticas respecto a los algoritmos anteriores. Estamos redeniendo como se representan los problemas, todos tendrn una representacin comn independientemente de su naturaleza, por lo que solo nos deberemos de preocupar de como codicar el estado, su implementacin viene determinada por esa codicacin. Tampoco tendremos que preocuparnos de los operadores ya que esa representacin comn nos determina los posibles operadores que podremos usar y sern comunes para todos los problemas.

4.5.1 Codicacin
Como hemos mencionado, la forma ms habitual de codicar los individuos para utilizar un algoritmo gentico es transformarlos a una cadena de bits. Cada bit o grupo de bits codicar una caracterstica de la solucin. Evidentemente, no existe un criterio preestablecido sobre como realizarla. La ventaja de esta codicacin es que los operadores de modicacin de la solucin son muy sencillos de implementar. En la siguiente gura se puede ver un ejemplo de codicacin para el problema de las N reinas siendo N igual a 4:
0 1 2 3 [0,3,2,1] [00 11 10 01]

En la codicacin binaria se ha asignado una pareja de bits a cada una de las reinas, representando la la en la que estn colocadas y se han concatenado. Alternativamente se podra utilizar una representacin no binaria utilizando simplemente el nmero de la y haciendo una lista con los valores. Como se ha comentado, no siempre la codicacin binaria es la ms adecuada, ya que las caractersticas del problema pueden hacer que el cambio de representacin haga ms complicado el problema. Una ventaja de la codicacin binaria es que nos da una aproximacin del tamao del espacio de bsqueda, ya que el nmero de soluciones posibles corresponder al mayor nmero binario que podamos representar con la codicacin. A veces es importante pensar bien como codicamos los estados, hay que tener en cuenta que la codicacin binaria impone la conectividad entre los estados y que, al hacer la transformacin, estados que antes eran vecinos ahora no lo sern. Puede ser interesante hacer que la codicacin mantenga esa vecindad para obligar a que el algoritmo haga la exploracin del espacio de bsqueda de cierta manera. Tambin a veces nos interesa que diferentes partes de la codicaciones correspondan a partes especcas del estado y as obtener patrones que puedan mantenerse y propagarse de manera ms sencilla.

4.5.2 Operadores
Los operadores que utilizan estos algoritmos para la exploracin del espacio de bsqueda se pueden agrupar en dos tipos bsicos. Los operadores de cruce (crossover) y los de mutacin (mutation).

44

Captulo 4. Bsqueda local

Los operadores de cruce se aplican a una pareja de individuos, su efecto consiste en intercambiar parte de la informacin de la codicacin entre los individuos. Existe una gran variedad de formas en las que se puede realizar este intercambio. La ms sencilla es la denominada cruce por un punto (one point crossover). Se aplica solo a codicaciones binarias, este operador consiste en elegir un punto al azar en la codicacin e intercambiar los bits de los dos individuos a partir de ese punto. En la siguiente gura hay un ejemplo de cruce por un punto en el problema de las N reinas:

[000 101 010 001 100 100]

[010 001 100 000 011 101]

[000 101 100 000 011 101]

Otra variante muy utilizada es el cruce por dos puntos (two points cross over), en el que el intercambio se realiza eligiendo dos puntos en la codicacin e intercambiando los bits entre esos dos puntos. Aparte de estos dos operadores existen muchos otros que tienen efectos especcos y que funcionan mejor en ciertas circunstancias (uniform crossover, random crossover, ...). Si la codicacin no es binaria, los operadores se han de disear de manera especca para la representacin escogida. Tambin hay que pensar a veces en la eciencia de la aplicacin de los operadores, cuando tenemos que procesar muchas soluciones nos puede interesar operadores que puedan traducirse a operacioens aritmticas simples entre tiras de bits (or, and, xor, shifts, ...). Los operadores de mutacin se aplican a un solo individuo y consisten en cambiar parte de la codicacin de manera aleatoria. El ms sencillo es elegir un bit al azar y cambiar su signo. Estos operadores tienen una probabilidad de aplicacin asociada que ser un parmetro del algoritmo. Tendremos una probabilidad de cruce que indicar cuando una pareja elegida de individuos intercambia su informacin y una probabilidad de mutacin. Por lo general la probabilidad de mutacin es mucho ms pequea que la probabilidad de cruce. La eleccin de estos valores es crtica para el correcto funcionamiento del algoritmo y muchas veces depende del problema. La probabilidad de aplicacin de los operadores puede ser algo muy delicado, ya que cambia la forma en la que se hace la exploracin al cambiar las caractersticas de la poblacin. Si la probabilidad de cruce es muy alta, cada generacin tendr muchos individuos nuevos, esto puede hacer que la exploracin vaya ms deprisa, pero tambin puede hacer que los patrones que llevan a soluciones mejores no puedan estabilizarse. Si la probabilidad es muy pequea, la exploracin ser mas lenta y puede tardar mucho en converger. Con al mutacin pasa algo parecido. Esta es esencial para que el algortimo pueda explorar en partes del espacio de bsqueda que no son alcanzables con la combinacin de las soluciones iniciales, pero una probabilidad muy alta puede hacer que la exploracin no converja al introducir demasiado ruido en la poblacin.

4.5.3 Combinacin de individuos


Estos algoritmos no tratan las soluciones de manera individual, sino en grupo. Denominaremos poblacin al conjunto de soluciones que tenemos en un momento especco. El efecto de mantener un conjunto de soluciones a la vez es hacer una exploracin en paralelo del espacio de bsqueda desde diferentes puntos.

4.5 Cada oveja con su pareja

45

Un parmetro ms que deberemos decidir es el tamao de la poblacin de soluciones. Este es crtico respecto a la capacidad de exploracin. Si el nmero de individuos es demasiado grande, el coste por iteracin puede ser prohibitivo, pero si el tamao es demasiado pequeo, es posible que no lleguemos a una solucin demasiado buena, al no poder ver suciente espacio de bsqueda. Cada iteracin de un algoritmo gentico es denominada una generacin, a cada generacin los individuos se emparejan y dan lugar a la siguiente generacin de individuos. Es clave la manera en la que decidimos como se emparejan los individuos. La forma habitual de pasar de una generacin a otra, es crear lo que se denomina una generacin intermedia que estar compuesta por las parejas que se van a combinar. El nmero de individuos de esta poblacin es igual al del tamao original de la poblacin. La eleccin de los individuos que forman parte de esta generacin intermedia se puede hacer de muchas maneras, por ejemplo: Escoger un individuo de manera proporcional a su valor de evaluacin de la funcin de tness, de manera que los individuos mejores tendrn ms probabilidad de ser elegidos. Esto puede tener el peligro de que unos pocos individuos pueden ser elegidos muchas veces. Se establecen N torneos entre parejas de individuos escogidas al azar, el ganador de cada emparejamiento es el individuo con mejor valor en la funcin de tness. Esta opcin equilibra mejor la aparicin de los mejores individuos. Se dene un ranking lineal entre individuos segn su funcin de calidad, estableciendo un mximo de posibles apariciones de un individuo, de esta manera que la probabilidad de aparicin de los individuos no est sesgada por los individuos mejores. Con estos mecanismos de eleccin habr individuos que aparezcan ms de una vez e individuos que no aparezcan7 . Cada mecanismo de seleccin de individuos tiene sus ventajas e inconvenientes. El primero es el ms simple, pero corre el peligro de degenerar en pocas generaciones a una poblacin homognea, acabando en un ptimo local. Los otros dos son algo ms complejos, pero aseguran cierta diversidad de individuos en la poblacin. Se ha visto experimentalmente que el asegurar la variedad en la poblacin permite encontrar mejores soluciones8 .

4.5.4 El algoritmo gentico cannico


Existe una gran variedad de algoritmos genticos, pero todos parten de un funcionamiento bsico que llamaremos el algoritmo gentico cannico, los pasos que realiza este algoritmo bsico son estos: 1. Se parte de una poblacin de N individuos generada aleatoriamente 2. Se escogen N individuos de la generacin actual para la generacin intermedia (segn el criterio escogido) 3. Se emparejan los individuos y para cada pareja a) Con una probabilidad Pcruce se aplica el operador de cruce a cada pareja de individuos y se obtienen dos nuevos individuos que pasarn a la nueva generacin. Con una probabilidad 1 Pcruce se mantienen la pareja original en la siguiente generacin b) Con una probabilidad Pmutacion se mutan los individuos cruzados
7 Esto reeja lo que sucede en la seleccin natural, los ms aptos tienen una mayor probabilidad de tener descendencia y los menos aptos pueden no llegar a reproducirse. 8 Tambin es algo que se observa en la naturaleza, las poblaciones aisladas o las especies muy especializadas tienen un pobre acervo gentico y no pueden adaptarse a cambios en su entorno.

46

Captulo 4. Bsqueda local 4. Se substituye la poblacin actual con los nuevos individuos, que forman la nueva generacin 5. Se itera desde el segundo paso hasta que la poblacin converge (la funcin de tness de la poblacin no mejora) o pasa un nmero especco de generaciones

La probabilidad de cruce inuir en la variedad de la nueva generacin, cuanto ms baja sea, ms parecida ser a la generacin anterior y harn falta ms iteraciones para converger. Si sta es muy alta, cada generacin ser muy diferente, por lo que puede degenerar en una bsqueda aleatoria. La mutacin es un mecanismo para forzar la variedad en la poblacin, pero una probabilidad de mutacin demasiado alta puede dicultar la convergencia.

4.5.5 Cuando usarlos


Los algoritmos genticos han demostrado su ecacia en mltiples aplicaciones, pero es difcil decir si sern efectivos o no en una aplicacin concreta. Por lo general suelen funcionar mejor que los algoritmos de bsqueda por ascenso cuando no se tiene una buena funcin heurstica para guiar el proceso. Pero si se dispone de una buena heurstica, estos algoritmos no nos obtendrn mejores resultados y el coste de congurarlos adecuadamente no har rentable su uso. Su mayor inconveniente es la gran cantidad de elementos que hemos de ajustar para poder aplicarlos, la codicacin del problema, el tamao de la poblacin, la eleccin de los operadores, las probabilidades de cruce y mutacin, la forma de construir la siguiente generacin, ... Siempre nos encontraremos con la duda de si el algoritmo no funciona porque el problema no se adapta al funcionamiento de estos algoritmos, o es que no hemos encontrado los parmetros adecuados para hacer que funcionen bien.

5. Bsqueda con adversario

5.1 T contra mi o yo contra ti


Hasta ahora habamos supuesto problemas en los que un solo agente intenta obtener un objetivo, en nuestro caso la resolucin de un problema. Pero existen casos en los que diferentes agentes compiten por un objetivo que solamente uno de ellos puede alcanzar. Este tipo de problemas los englobaremos dentro de la categora de juegos1 . No veremos algoritmos para cualquier tipo de juego, sino que nos restringiremos a los que cumplen un conjunto de propiedades: Son bipersonales, es decir, solo hay dos agentes involucrados, y estos juegan alternativamente. Todos los participantes tienen conocimiento perfecto, no hay ocultacin de informacin por parte de ninguno de ellos. El juego es determinista, no interviene el azar en ninguno de sus elementos. Los elementos que intervienen en este tipo de problemas se pueden representar de manera parecida a la bsqueda en espacio de estados, tendremos: Un estado, que indica las caractersticas del juego en un instante especco Un estado inicial, que determinar desde donde se empieza a jugar y quin inicia el juego Un estado nal, o unas caractersticas que debe cumplir, que determinarn quin es el ganador Unos operadores de transformacin de estado que determinarn las jugadas que puede hacer un agente desde el estado actual. Supondremos que los dos jugadores disponen de los mismos operadores Identicaremos a cada jugador como el jugador MAX y el jugador MIN. MAX ser el jugador que inicia el juego, nos marcaremos como objetivo el encontrar el conjunto de movimientos que ha de hacer el jugador MAX para que llegue al objetivo (ganar) independientemente de lo que haga el jugador MIN2 . Se puede observar que este escenario es bastante diferente del que se plantean los algoritmos de los captulos anteriores. Nos veremos obligados a revisar el concepto de solucin y de ptimo. De hecho estamos pasando de un escenario en el que poseemos todo el conocimiento necesario para resolver un problema desde el principio hasta el n sin tener que observar la reaccin del entorno, a un escenario donde nuestras decisiones se ven inuidas por el entorno. En los algoritmos que veremos supondremos que podemos prever hasta cierto punto como reaccionar ese entorno, pero evidentemente no siempre tendr por que ser ese el caso.
1 La competicin no solamente aparece en el caso de los juegos, pero los algoritmos que veremos tambin son aplicables. 2 No es que nos caiga mal el jugador MIN, lo que pasa es que los algoritmos sern los mismos para los dos, ya que desde la perspectiva de MIN, l es MAX y su oponente es MIN.

47

48

Captulo 5. Bsqueda con adversario

5.2 Una aproximacin trivial


Para poder obtener el camino que permite a MAX llegar a un estado ganador, no tenemos ms que explorar todas las posibles jugadas que puede hacer cada jugador, hasta encontrar un camino que lleve a un estado nal. Para poder obtenerlo podemos utilizar un algoritmo de bsqueda en profundidad que explore exhaustivamente todas las posibilidades. Usamos un algoritmo de bsqueda en profundidad ya que sus restricciones de espacio son lineales. El algoritmo explorar hasta llegar a una solucin evalundola a +1 si es un estado en el que gana MAX, o a -1 si es un estado en el que gana MIN, este valor se propagar hasta el nivel superior. A medida que se acaben de explorar los descendientes de un nivel el valor resultante de su exploracin se seguir propagando a los niveles superiores. Cada nivel elegir el valor que propaga a su ascendiente dependiendo de si corresponde a un nivel del jugador MAX o del jugador MIN. En los niveles de MAX se elegir el valor mayor de todos los descendientes, en los niveles de MIN se elegir el mnimo. En el momento en el que se propague un +1 a la raz signicar que hemos encontrado el camino que permite ganar a MAX independientemente de las jugadas de MIN. En este momento podemos parar la exploracin ya que hemos cubierto su objetivo, encontrar una secuencia de pasos ganadora. En la gura 5.1 podemos ver el espacio de bsqueda que generara un juego hipottico (los cuadrados corresponden a niveles de MAX y los crculos a niveles de MIN), se han marcado con +1 las jugadas en las que gana el jugador MAX y con 1 las jugadas en la que gana el jugador MIN Si hacemos el recorrido en profundidad propagando los valores de las jugadas terminales, tendramos el resultado que se muestra en la gura 5.2. En ella podemos ver marcado el camino que permite ganar a MAX. Desgraciadamente este algoritmo solo lo podemos aplicar a juegos triviales, ya que el tiempo que necesitaramos para hacer la exploracin completa sera exponencial respecto al nmero de posibles jugadas en cada nivel (r) y la profundidad de la solucin (p) (O(rp )). En cualquier juego real este valor es una cifra astronmica, por ejemplo, el factor de ramicacin del ajedrez es aproximadamente de 35 y el del go esta alrededor de 300.

5.3 Seamos un poco ms inteligentes


Es evidente que no podemos explorar todo el espacio de bsqueda para obtener el mejor conjunto de jugadas, as que debemos de echar mano del conocimiento que tenemos del juego para reducir la exploracin. Tendremos que introducir una funcin heurstica que en este caso no medir la bondad de un estado respecto a su distancia hasta una jugada ganadora. La losofa de esta funcin heurstica es diferente de las que hemos visto hasta ahora, ya que no existe ninguna nocin de coste, ni tampoco de optimalidad, pues todas las jugadas ganadoras son igual de buenas. Esto har que construir esta funcin sea todava mas difcil que en las ocasiones anteriores, habr que determinar cul es la ventaja de cada jugador en cada estado3 y esto puede ser bastante difcil de determinar. Tambin hemos de tener en cuenta que el coste de calcular la funcin heurstica tambin inuir en el coste de la exploracin. Para este tipo de problemas, esta funcin nos podr dar valores positivos y negativos, indicndonos qu jugador es el que tiene la ventaja. Consideraremos que si el valor es positivo la jugada es ventajosa para el jugador MAX, y si es negativo la ventaja es para MIN. Por convenio, las jugadas ganadoras de MAX tienen un valor de + y las ganadoras de MIN de .
3

Ntese que la funcin heurstica no solo evaluar los estados ganadores.

5.3 Seamos un poco ms inteligentes

49

+1

+1

+1

+1

Figura 5.1: Ejemplo de rbol de jugadas

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

Figura 5.2: Propagacin de los valores del rbol de la gura 5.1

50

Captulo 5. Bsqueda con adversario

Adems de utilizar una funcin heurstica para guiar la bsqueda, usaremos una estrategia distinta para explorar el conjunto de jugadas. Ya que es imposible hacer una exploracin exhaustiva, haremos una bsqueda en profundidad limitada, esto reducir lo que podremos ver del espacio de bsqueda. Decidiremos un nivel de profundidad mximo para la bsqueda, evaluaremos los estados que estn en ese nivel y averiguaremos cul es la mejor jugada a la que podemos acceder desde el estado actual. Hay que tener claro que con este procedimiento solo decidimos una jugada, y que repetimos la bsqueda en cada movimiento que tenemos que decidir. A pesar de que repitamos la bsqueda a cada paso, el nmero de nodos explorados es mucho menor que si explorramos todo el rbol de bsqueda completo. La calidad del juego vendr determinada por la profundidad a la que llegamos en cada exploracin. Cuanto ms profunda sea la exploracin mejor jugaremos, ya que veremos ms porcin del espacio de bsqueda. Evidentemente, cuanto ms exploremos, ms coste tendr la bsqueda. El algoritmo que realiza esta exploracin recibe el nombre de minimax4 y es un recorrido en profundidad recursivo. El que sea un recorrido en profundidad hace que el coste espacial sea lineal, pero evidentemente el coste temporal ser exponencial (depender de la profundidad mxima de exploracin). El algoritmo 5.1 es su implementacin. El algoritmo tiene una funcin principal (MiniMax) que es la que retorna la mejor jugada que se puede realizar, y dos funciones recursivas mutuas (valorMax y valorMin) que determinan el valor de las jugadas dependiendo de si el nivel es de MAX o de MIN. La funcin estado_terminal(g) determina si el estado actual es una solucin o pertenece al nivel mximo de exploracin. La funcin evaluacion(g) calcula el valor de la funcin heurstica para el estado actual.

5.4 Seamos an ms inteligentes


Un punto clave que hemos de tener en cuenta es que cuanto ms profunda sea la exploracin, mejor podremos tomar la decisin sobre qu jugada debemos escoger. Para juegos en los que el factor de ramicacin sea muy grande, no podremos llegar a mucha profundidad, ya que el tiempo que necesitaremos para cada decisin ser prohibitivo. Para reducir este tiempo de exploracin se han estudiado las propiedades que tienen estos rboles de bsqueda y se han desarrollado heursticas que permiten no explorarlos en su totalidad y obtener el mismo resultado que obtendramos con la exploracin completa. La heurstica que veremos se denomina poda alfa-beta ( pruning). Esta heurstica aprovecha que el algoritmo del minimax hace una exploracin en profundidad para guardar informacin sobre cul es el valor de las mejores jugadas encontradas hasta cierto punto de la bsqueda para el jugador MAX y para el jugador MIN. Lo que hace esta heurstica es evitar seguir explorando nodos que sabemos que no van a variar la decisin que se va a tomar en niveles superiores, eliminndolos de la bsqueda y ahorrando tiempo. Podemos ver por ejemplo el siguiente rbol de exploracin:
8

12

16

13

10

4 El nombre minimax proviene del teorema del Minimax del rea de teora de juegos enunciado por John von Neumann en 1928.

5.4 Seamos an ms inteligentes

51

Algoritmo 5.1 Algoritmo minimax Funcin: MiniMax (g) movr:movimiento; max,maxc:entero max para cada mov movs_posibles(g) hacer cmax valor_min(aplicar(mov,g)) si cmax > max entonces max cmax movr mov n n retorna movr Funcin: valorMax (g) vmax:entero si estado_terminal(g) entonces retorna valor(g) sino vmax para cada mov movs_posibles(g) hacer vmax max(vmax, valorMin(aplicar(mov,g)) n retorna vmax n Funcin: valorMin (g) vmin:entero si estado_terminal(g) entonces retorna value(g) sino vmin + para cada mov movs_posibles hacer vmin min(vmin, valorMax(aplicar(mov,g)) n retorna vmin n

52 Algoritmo 5.2 Algoritmo minimax con poda Funcin: valorMax (g,,) si estado_terminal(g) entonces retorna valor(g) sino para cada mov movs_posibles(g) hacer max(,valoeMin(aplicar(mov,g) ,,)) si entonces retorna n n retorna n Funcin: valorMin (g,,) si estado_terminal(g) entonces retorna valor(g) sino para cada mov movs_posibles(g) hacer min(,valorMax(apply(mov,g) ,,)) si entonces retorna n n retorna n

Captulo 5. Bsqueda con adversario

Podemos ver que el valor que propagara el algoritmo del minimax a nodo raz sera 8. Pero si nos jamos en el nodo marcado, el segundo descendiente de la raz ya sabe que el mejor nodo del primer descendiente tiene valor 8, y su primer descendiente vale 6. Dado que la raz es un nodo MAX, este preferir el valor 8 al 6. Dado que el segundo descendiente es un nodo MIN, ste siempre escoger un valor que como mximo ser 6. Esto nos hace pensar que, una vez hemos visto que el valor del nodo marcado es 6, el valor que salga de esa exploracin no se elegir (ya que tenemos un valor mejor de la exploracin anterior). Esto lleva a la conclusin de que seguir explorando los nodos del segundo descendiente de la raz no merece la pena, ya que el valor resultante ya no es elegible. Podemos observar tambin que esta circunstancia se repite en el tercer descendiente al explorar su ltimo nodo, pero al no quedar ms descendientes esta heurstica no nos ahorra nada. Esto querr decir que la efectividad de esta heurstica depender del orden de exploracin de los nodos, pero desgraciadamente es algo que no se puede establecer a priori. En el caso medio, el coste asinttico p del tiempo de exploracin pasa de ser O(rp ) a ser O(r 2 ). Esta heurstica modica el algoritmo del minimax introduciendo dos parmetros en las llamadas de las funciones, y , y representarn el lmite del valor que pueden tomar las jugadas que exploramos. Una vez superado ese lmite sabremos que podemos parar la exploracin porque ya tenemos el valor de la mejor jugada accesible. La funcin minimax se mantiene igual, solo varan las funciones que hacen la exploracin de cada nivel, su cdigo el el del algoritmo 5.2. La llamada que har la funcin MiniMax a la funcin valorMax le pasar como valor de alfa y + como valor de beta. En la funcin valorMax, alfa es el valor que se actualiza y beta se mantiene constante represen-

5.4 Seamos an ms inteligentes

53

tando el valor de la mejor jugada encontrada hasta ahora. En la funcin valorMin, beta es el valor que se actualiza y alfa se mantiene constante representando el valor de la mejor jugada encontrada hasta ahora. En la siguiente gura se ve como explorara el algoritmo de minimax con poda alfa beta el ejemplo anterior:
=inf,8 =+inf =inf =+inf,8

=8 =+inf,6

=8 =+inf,10,9,7

12

16

13

10

La ventaja de utilizar la poda alfa beta es que podemos permitirnos ampliar el lmite de profundidad de exploracin, ya que nos ahorramos la exploracin de parte del rbol de bsqueda, y as podemos conseguir mejores resultados. Dado que la ordenacin de los descendientes es crucial para obtener una poda efectiva se suelen utilizar heursticas adicionales que permiten aproximar esa ordenacin con el objetivo de aumentar las podas. Obviamente esto no es gratis, a veces es necesario repetir expansiones y memorizar nodos para obtenerlo. Una estrategia habitual es utilizar un algoritmo de profundidad iterativa en lugar del de profundidad limitada para hacer una exploracin por niveles. A cada nivel se pueden memorizar las evaluaciones que se obtienen para cada nodo y utilizar esa evaluacin en la siguiente iteracin. Esto permitir que en la siguiente iteracin se puedan ordenar los descendientes conocidos y explorar primero la rama ms prometedora y poder podar con mayor probabilidad el resto de descendientes. Como ya hemos visto el ratio de reexpansiones respecto a nodos nuevos para la profundidad iterativa tiende a cero con el aumento del factor de ramicacin (en estos problemas suele ser muy grande), por lo que el precio que hay que pagar en nodos extras explorados es reducido, si p tenemos ms posibilidades de llegar a alcanzar la complejidad media de O(r 2 ).

6. Satisfaccin de restricciones

6.1 De variables y valores


Existen problemas especcos que, por sus propiedades, se pueden resolver ms fcilmente utilizando algoritmos adaptados a ellos que utilizando algoritmos generales. Este es el caso de los problemas denominados de satisfaccin de restricciones (constraint satisfaction1 ). Las caractersticas de un problema de satisfaccin de restricciones son las siguientes: El problema se puede representar mediante un conjunto de variables. Cada variable tiene un dominio de valores (un conjunto nito de valores discretos o intervalos de valores continuos) Existen restricciones de consistencia entre las variables (binarias, n-arias) Una solucin es una asignacin de valores a esas variables Esto quiere decir que todo problema de satisfaccin de restricciones se puede denir a partir de una tripleta de elementos P = X, D, R , donde X es una lista de variables, D es una lista de los dominios que corresponden a las variable y R es una lista de relaciones entre conjuntos de variables que denen las restricciones que debe cumplir el problema. A partir de esta formulacin genrica se pueden denir especializaciones y generalizaciones. Por ejemplo, si restringimos los dominios de las variables a valores binarios y las relaciones entre variables son disyunciones lgicas, tenemos problemas de satisfactibilidad (si restringimos el nmero de variables por relacin a como mucho 3, tenemos el problema 3-SAT, un ejemplo tpico de problema NP-completo). Tambin podemos generalizar el problema admitiendo por ejemplo la posibilidad de aadir costes a las variables de manera que tengamos como objetivo optimizar su valor. El inters de este tipo de problemas viene de su estrecha relacin con otras reas, como satisfactibilidad, lgebra relacional, teora de base de datos, visin o grcos y de que muchos problemas reales se pueden plantear como problemas de satisfaccin de restricciones, como por ejemplo la planicacin de tareas, logstica (localizacin o asignacin de recursos, personas, vehculos, ...), gestin de redes (electricidad, comunicaciones, ...), diseo/conguracin, reconocimiento de formas en imgenes, razonamiento (temporal, espacial, ...), ... Estas aplicaciones hacen que sea un rea bastante interesante desde un punto de vista prctico. Todos los algoritmos de resolucin de problemas de satisfaccin de restricciones que veremos estn pensados para el caso de que las restricciones sean binarias ya que se pueden representar mediante grafos (grafos de restricciones) en los que los nodos son las variables, las restricciones son los arcos, y los dominios de las variables son los diferentes valores que pueden tomar los nodos. Esto no supone ninguna limitacin, dado que la mayor parte de los problemas con restricciones no binarias se pueden convertir en problemas con restricciones binarias introduciendo variables articiales o transformando el grafo en un hipergrafo. Ejemplo 6.1 Un ejemplo clsico de problema de satisfaccin de restricciones es el de coloreado de mapas (gura 6.1). El problema consiste en asignar colores a los pases de un mapa de manera que dos pases adyacentes no tengan el mismo color.
1

En la literatura los encontrareis abreviados como CSP (constraint satisfaction problems).

55

56
Colores={rojo,verde,amarillo,azul}

Captulo 6. Satisfaccin de restricciones

P1 P1 P2 P2 P3

P3

P4

P4

P5

P6 P5

P6

Figura 6.1: Problema de coloreado de mapas y su grafo de restricciones

El problema se puede representar como un grafo donde cada nodo es un pas y los arcos entre nodos representan las fronteras comunes. Los nodos del grafo seran las variables del problema, los arcos representaran las restricciones entre pares de variables (sus valores han de ser diferentes) y los colores disponibles seran los dominios de las variables.

6.2 Buscando de manera diferente


Se puede plantear un problema de satisfaccin de restricciones como un problema de bsqueda general. Dado que una solucin es una asignacin de valores a las variables del problema, solo hara falta enumerar de alguna manera todas las posibilidades hasta encontrar alguna que satisfaga las restricciones. Evidentemente, esta aproximacin es irrealizable ya que el conjunto de posibles asignaciones a explorar es muy grande. Suponiendo n variables y m posibles valores, tendramos un espacio de bsqueda de O(mn ). Un problema adicional es que no hay ninguna nocin de calidad de solucin, ya que todas las asignaciones son igual de buenas y lo nico que las diferencia es si satisfacen las restricciones o no, por lo que no podemos conar en una funcin heurstica que nos indique que combinaciones debemos mirar primero, o como modicar una asignacin para acercarla a la solucin. Esto nos deja con que los nicos algoritmos que podremos utilizar son los de bsqueda no informada, lo que har que tengamos que estudiar con ms profundidad el problema para poder solucionarlo de una manera eciente. Esto no es completamente cierto, ya que siempre podemos utilizar el nmero de restricciones que no se cumplen como funcin heurstica. Desgraciadamente este nmero no suele ser muy informativo respecto a lo buenos o malos que pueden ser los vecinos de una no solucin, ya que habr no soluciones con pocas restricciones incumplidas, pero que hagan falta muchas modicaciones para hacerlas solucin y al revs, soluciones que a pesar de inclumplir varias restricciones, con unas pocas modicaciones se conviertan en solucin. Una ventaja con la que nos encontraremos es que, las propiedades que tienen estos problemas permiten derivar heursticas que reducen el espacio de bsqueda de manera considerable. Veremos tres aproximaciones a la resolucin de problemas de satisfaccin de restricciones, la primera se basar en bsqueda no informada, la segunda se basar en la reduccin de espacio de bsqueda del problema y la tercera intentar combinar ambas.

6.2 Buscando de manera diferente

57

6.2.1 Bsqueda con backtracking


La primera aproximacin se basar en un algoritmo de bsqueda no informada. Plantearemos el problema de manera que podamos explorar el conjunto de posibles asignaciones de valores a las variables como una bsqueda en profundidad. Podemos observar que, dada una asignacin parcial de valores a las variables de un problema, sta podra formar parte de una solucin completa si no viola ninguna restriccin, por lo tanto solo tendramos que encontrar el resto de valores necesarios para completarla. Esto nos hace pensar que podemos plantear la bsqueda ms fcilmente si exploramos en el espacio de las soluciones parciales, que si lo planteamos como una bsqueda en el espacio de las soluciones completas como habamos comentado antes. Esto nos puede indicar un algoritmo para hacer la exploracin. Podemos establecer un orden jo para las variables y explorar de manera sistemtica el espacio de soluciones parciales, asignando valores a las variables de manera consecutiva en el orden que hemos jado. En el momento en el que una solucin parcial viole alguna de las restricciones del problema, sabremos que no formar parte de ninguna solucin completa, por lo que replantearemos las asignaciones que hemos realizado. A este tipo de bsqueda se la denomina bsqueda con bactracking cronolgico. Se puede ver su implementacin en el algoritmo 6.1. Deniremos tres conjuntos con las variables del problema. Por un lado tendremos las variables pasadas, que sern las que ya tienen un valor asignado y forman parte de la solucin parcial. Tendremos la variable actual, que ser a la que debemos asignarle un valor. Y por ltimo tendremos las variables futuras, que sern las que an no tienen valor. El algoritmo hace un recorrido en profundidad de manera recursiva por todas las asignaciones posibles de valores a cada una de las variables del problema. El parmetro vfuturas contiene todas las variables del problema en orden, el parmetro solucin ir guardando las soluciones parciales. El hacer el recorrido en profundidad hace que el coste espacial de la bsqueda sea lineal. El caso base de la recursividad es que el conjunto de variables futuras se haya agotado, el caso recursivo es iterar para todos los valores de la variable actual. El algoritmo continua las llamadas recursivas cuando consigue una asignacin de valor a la variable actual que cumpla las restricciones del problema (solucion.vlida()). En el caso de que ninguna asignacin d una solucin parcial vlida, el algoritmo permite que se cambie el valor de la variable anterior retornando la solucin en un estado de fallo. Ejemplo 6.2 Otro problema clsico de satisfaccin de restricciones es el de la N reinas que ya hemos comentado en el primer captulo. ste se puede plantear como un problema de satisfaccin de restricciones en el que las reinas seran las variables, el dominio de valores sera la columna en la que se coloca la reina y las restricciones seran que las posiciones en las que colocamos las reinas no hagan que se maten entre si. En la gura 6.2 podemos ver como explorara el algoritmo de backtracking cronolgico el problema en el caso de 4 reinas. En el ejemplo se puede ver como el algoritmo va probando asignaciones para cada una de las reinas, avanzando en el momento que encuentra una asignacin compatible con las asignaciones previas. En el caso de no haber ninguna asignacin compatible, el algoritmo retrocede hasta la primera variable a la que le quedan valores por probar. El algoritmo de backtracking cronolgico puede hacer bastante trabajo innecesario a veces si la variable que provoca la vuelta atrs del algoritmo no es precisamente la ltima asignada, haciendo que se tengan que probar todas las combinaciones posibles de las variables que hay entre el primer punto donde se encuentra la violacin de la restriccin y la variable que la provoca. Esto ha hecho desarrollar variantes ms inteligentes del backtracking cronolgico, la mas sencilla es la denominada backjumping, que intenta que el backtracking no sea a la variable anterior, sino que, teniendo en

58

Captulo 6. Satisfaccin de restricciones

Algoritmo 6.1 Algoritmo de backtracking cronolgico Funcin: backtracking_cronologico(vfuturas, solucion) si vfuturas.es_vacio?() entonces retorna solucion sino vactual vfuturas.primero() vfuturas.borrar_primero() para cada v vactual.valores() hacer vactual.asignar(v) solucion.anadir(vactual) si solucion.valida() entonces solucion backtracking_cronologico(vfuturas,solucion) si no solucion.es_fallo?() entonces retorna solucion sino solucion.borrar(vactual) sino solucion.borrar(vactual) retorna solucion.fallo()

R1=1

R1=2

R2=1 NO R2=2 NO R2=3

R2=4

R2=1 NO R2=2 NO R2=3 NO R2=4

R3=1 NO R3=2 NO R3=3 NO R3=4 NO

R3=1 NO R3=2 NO R3=3 NO R3=4 NO R4=1 NO R4=2 NO R4=3 NO R4=4 NO Backtracking a R3

R3=1

Backtracking a R2

R4=1 NO R4=2 NO R4=3

Solucion (R1=2,R2=4,R3=1,R4=3)

Figura 6.2: 4 reinas mediante backtracking cronolgico

6.2 Buscando de manera diferente Algoritmo 6.2 Algoritmo de arco-consistencia Algoritmo: Arco consistencia R conjunto de arcos del problema /* ambos sentidos mientras se modiquen los dominios de las variables hacer r extraer_arco(R) /* ri es la variable del origen del arco /* rj es la variable del destino del arco para cada v en el dominio de ri hacer si v no tiene ningn valor en el dominio de rj que cumpla r entonces borrar v del dominio de ri aadir todos los arcos que tengan como destino ri menos el (rj ri ) n n n

59

*/

*/ */

cuenta las restricciones involucradas, vuelva a la variable que tiene alguna restriccin con la variable actual. Esto consigue evitar todas las pruebas de valores entre la variable actual y esa variable.

6.2.2 Propagacin de restricciones


Otras vas a travs de las que atacar este tipo de problemas son las denominadas tcnicas de propagacin de restricciones. Mediante stas se pretende reducir el nmero de combinaciones que hay que probar, descartando todas aquellas que contengan asignaciones de valores que sabemos a priori que no pueden aparecer en ninguna solucin. Esta tcnicas tambin sirven para reducir el nmero de vueltas atrs intiles que realiza el algoritmo de backtracking cronolgico como veremos en la siguiente seccin, eliminando el mayor nmero posible de incompatibilidades entre los valores de las variables, de manera que no tengan que ser exploradas. Estas tcnicas se han desarrollado a partir de heursticas derivadas de propiedades que tienen los grafos de restricciones. Las ms utilizadas son las que se derivan de la propiedad denominada k-consistencia. Se dice que un grafo de restricciones es k-consistente si para cada variable Xi del grafo, cada conjunto de k variables que la incluya y cada valor del dominio de Xi , podemos encontrar una combinacin de k valores de estas variables que no viola las restricciones entre ellas. La ventaja de estas propiedades es que se pueden comprobar con algoritmos de coste polinmico. Esta propiedad la podemos denir para cualquier valor de k, pero tpicamente se utiliza el caso de k igual a 2, al que se denomina arco-consistencia. Diremos que un grafo de restricciones es arco-consistente, si para cada pareja de variables del grafo, para cada uno de los valores de una de las variables, podemos encontrar otro valor de la otra variable que no viola las restricciones entre ellas. Esta propiedad permite eliminar valores del dominio de una variable. Si dado un valor de una variable y dada otra variable con la que tenga una restriccin, no podemos encontrar algn valor en la otra variable que no viole esa restriccin, entonces podemos eliminar el valor, ya que no puede formar parte de una solucin. El objetivo ser pues, a partir de un grafo de restricciones, eliminar todos aquellos valores que no hagan arco consistente el grafo, de manera que reduzcamos el nmero de posibles valores que pueden tener las variables del problema y por lo tanto el nmero de combinaciones a explorar. El algoritmo 6.2 que convierte un grafo de restricciones en arco-consistente. Este algoritmo es

60

Captulo 6. Satisfaccin de restricciones


X1
{Azul,Rojo}

X2
{Azul}

X3
{Azul,Rojo,Verde} {Azul,Verde}

X4

Figura 6.3: Ejemplo de coloreado de grafos conocido como AC3, su coste temporal es O(rd3 ) y su coste espacial es O(r), siendo r el nmero de restricciones del problema (contando los dos sentidos) y d es el tamao de los dominios, existen algoritmos ms ecientes, a costa de usar ms espacio que tienen complejidad temporal O(rd2 ) y complejidad espacial O(rd) . Ejemplo 6.3 En la gura 6.3 tenemos un problema de coloreado de grafos donde en cada uno de los nodos se indica el dominio de cada variable. El objetivo ser colorear el grafo de manera que ningn nodo adyacente tenga el mismo color, por lo que cada arco es una restriccin de desigualdad. El conjunto de arcos con los que comenzara el algoritmo son: {X1 X2 , X2 X1 , X2 X3 , X3 X2 , X2 X4 , X4 X2 , X3 X4 , X4 X3 } La ejecucin del algoritmo sera la siguiente: 1. Seleccionamos X1 X2 Eliminamos Azul del dominio de X1 2. Seleccionamos X2 X1 Todos los valores son consistentes 3. Seleccionamos X2 X3 Todos los valores son consistentes 4. Seleccionamos X3 X2 Eliminamos Azul del dominio de X3 Tendramos que aadir el arco X4 X3 pero ya est 5. Seleccionamos X2 X4 Todos los valores son consistentes 6. Seleccionamos X4 X2 Eliminamos Azul del dominio de X4 Tendramos que aadir el arco X3 X4 pero ya est 7. Seleccionamos X3 X4 Eliminamos Verde del dominio de X3 Aadimos el arco X2 X3 8. Seleccionamos X4 X3 Todos los valores son consistentes 9. Seleccionamos X2 X3 Todos los valores son consistentes Casualmente, al hacer arco-consistente el grafo hemos hallado la solucin, pero no siempre tiene por que ser as. La arco-consistencia no siempre nos asegura una reduccin en los dominios del problema, por ejemplo, si consideramos el grafo del problema de las 4 reinas que hemos visto en el ejemplo 6.2, ste es arco-consistente, por lo que no se puede eliminar ninguno de los valores de las variables. La k-consistencia para el caso de k igual a 3 se denomina camino consistencia, y permite eliminar ms combinaciones, pero con un coste mayor. Existe la propiedad que se denomina kconsistencia fuerte, que se cumple cuando un grafo cumple la propiedad de consistencia desde 2 hasta k. Esta propiedad asegura que si el grafo tiene anchura2 k y es k-consistente fuerte, encontraremos una solucin sin necesidad de hacer backtracking, desgraciadamente probar esto necesita un tiempo muy elevado (O(rk dk )). Un resultado interesante es que, si el grafo de restricciones es un rbol, este se puede resolver sin backtracking si se convierte en arco consistente.
2

Se puede calcular la anchura de un grafo en coste cuadrtico.

6.2 Buscando de manera diferente Algoritmo 6.3 Algoritmo de forward checking Funcin: forward checking (vfuturas, solucion) si vfuturas.es_vacio?() entonces retorna solucion sino vactual vfuturas.primero() vfuturas.borrar_primero() para cada v vactual.valores() hacer vactual.asignar(v) solucion.anadir(vactual) vfuturas.propagar_restricciones(vactual) /* forward checking si no vfuturas.algun_dominio_vacio?() entonces solucion forward_checking(vfuturas, solucion) si no solucion.es_fallo?() entonces retorna solucion sino solucion.borrar(vactual) sino solucion.borrar(vactual) retorna solucion.fallo()

61

*/

6.2.3 Combinando bsqueda y propagacin


La combinacin de la bsqueda con backtracking y la propagacin de restricciones es la que da resultados ms exitosos en estos problemas. La idea consiste en que cada vez que asignemos un valor a una variable realicemos la propagacin de las restricciones que induce esa asignacin, eliminando de esta manera valores de las variables que quedan por asignar. Si con esta propagacin, alguna de las variables se queda sin valores, deberemos hacer backtracking. La ventaja de este mtodo es que podremos hacer backtracking antes de que lleguemos a la variable que acabar provocndolo. De esta manera nos ahorraremos todos los pasos intermedios. Existen diferentes algoritmos que combinan bsqueda y propagacin, dependiendo de que tipo de consistencia se evale en cada paso de bsqueda. El algoritmo ms sencillo es el denominado de forward checking. Este algoritmo aade a cada paso de asignacin de variables una prueba de arco-consistencia entre las variables futuras y la variable actual. Esta prueba de arco consistencia consigue que todos los valores de las variables futuras que no sean consistentes con la asignacin a la variable actual sean eliminados, de manera que si algn dominio de alguna variable futura queda vaco podemos reconsiderar la asignacin actual o hacer backtracking. El algoritmo es muy parecido al que hemos visto para el backtracking cronolgico, ahora incluiramos la reduccin de dominios mediante la prueba de arco consistencia tras hacer la asignacin de valor a la variable actual (vfuturas.propagar_restricciones(vactual)) y la comprobacin de la validez de la solucin parcial se hara mediante la comprobacin de que todas las variables futuras tienen an valores (vfuturas.algun_dominio_vacio?()). La implementacin se puede ver en el algoritmo 6.3. Ejemplo 6.4 En la gura 6.4 podemos ver de nuevo el ejemplo 6.2 utilizando el algoritmo de forward checking. Se puede comprobar que el nmero de asignaciones que se realizan es menor, ya que los

62

Captulo 6. Satisfaccin de restricciones

R1=1

R1=2 R2={3,4} R3={2,4} R4={2,3} Back a R1 R2={4} R3={1,3} R4={1,3,4}

R2=3 R3={} R4={2,3}

R2=4

R3={2} R4={3}

R2=4 R3={1} R4={1,3}

R3=2 R4={}

R3=1 R4={3}

Backtracking a R2

R4=3

Solucion (R1=2,R2=4,R3=1,R4=3)

Figura 6.4: 4 reinas mediante forward checking valores no compatibles son eliminados por las pruebas de consistencia. Ahora el coste ha pasado a las pruebas de consistencia que se realizan en cada iteracin. En este caso a cada paso el algoritmo asigna un valor a la reina actual y elimina de los dominios de las reinas futuras las asignaciones que son incompatibles con la actual. Esto nos permite hacer backtracking antes que en el ejemplo previo, reduciendo el nmero de asignaciones exploradas. Hay que tener en cuenta que la prueba de arco consistencia de cada iteracin incluye la comprobacin de los valores que quedan en las variables futuras, por lo que dependiendo del problema el ahorro puede no existir. Existen algoritmos que realizan pruebas de consistencia mas fuertes, como por ejemplo el algoritmo RFL (Real Full Lookahead) que adems comprueba la arco-consistencia entre todas las variables futuras, o el algoritmo MAC (Maintaining Arc Consistency) que convierte el problema en arco consistente a cada paso. Evidentemente, esta reduccin de los dominios de las variables no sale gratis, el nmero de comprobaciones a cada paso incrementa el coste por iteracin del algoritmo. Dependiendo del problema, el coste de propagacin puede hacer que el coste de hallar una solucin sea mayor que utilizar el algoritmo de backtracking cronolgico.

6.3 Otra vuelta de tuerca


Muchas veces estas heursticas no son son sucientes para reducir el coste de encontrar una solucin, por lo que se combinan con otras que tambin se han mostrado efectivas en este tipo de problemas. Hasta ahora siempre hemos mantenido un orden jo en la asignacin de las variables, pero este puede no ser el ms adecuado a la hora de realizar la exploracin. Se utilizan diferentes heursticas de ordenacin dinmica de variables de manera que siempre se escoja la que tenga ms probabilidad de llevarnos antes a darnos cuenta de si una solucin parcial no nos llevar a una solucin.

6.4 Ejemplo: El Sudoku Las heursticas ms utilizadas son:

63

Dominios mnimos (Dynamic value ordering), escogemos la variable con el menor nmero de valores. Min width ordering, escogemos la variable conectada al menor nmero de variables no instanciadas. Max degree ordering, escogemos la variable ms conectada en el grafo original. No es despreciable el ahorro que se puede obtener mediante este tipo de heursticas, por ejemplo, para el problema de las 20 reinas, hallar la primera solucin con backtracking cronolgico necesita alrededor de 2.5 107 asignaciones, utilizando forward checking se reduce a alrededor de 2.4 106 asignaciones, y si utilizamos la heurstica de dominios mnimos combinada con el forward checking hacen falta alrededor de 4 103 asignaciones.

6.4 Ejemplo: El Sudoku


Muchos de los rompecabezas que aparecen habitualmente en la seccin de pasatiempos son problemas de satisfaccin de restricciones. Esto quiere decir que se pueden formular como un conjunto de variables a las que les corresponde un dominio de valores y un conjunto de restricciones sobre ellas. Uno de estos rompecabezas es el sudoku (gura 6.5) para este problema el espacio de bsqueda es de 9!9 2.3 1033 posibles tableros, de los que aproximadamente 6.7 1024 son solucin. En este caso tenemos una matriz de 9 9, lo que nos da un total de 81 variables, cada variable puede contener un nmero del 1 a 9. Las restricciones aparecen primero entre las variables segn las las y columnas, de manera que para una la o columna un nmero puede aparecer solamente una vez y ademas hay una restriccin adicional entre las variables de las nueve submatrices que forman el problema, dentro de cada submatriz no puede haber dos variables con el mismo nmero. En el caso de este problema, el entretenimiento no viene de encontrar una solucin, sino de obtener una solucin dado que hemos dado ya ciertos valores a algunas de las variables. La dicultad de encontrar la solucin se puede variar estableciendo el nmero de variables a las que damos el valor.

64

Captulo 6. Satisfaccin de restricciones

1 4 7 2 5 8 3 6 9

2 5 8 3 6 9 1 4 7

3 6 9 1 4 7 2 5 8

4 7 1 5 8 2 9 3 6

5 8 2 6 9 3 7 1 4

6 9 3 4 7 1 8 2 5

7 1 4 8 2 5 6 9 3

8 2 5 9 3 6 4 7 1

9 3 6 7 1 4 5 8 2

Figura 6.5: Una solucin al juego del sudoku

18

CAP ITULO 2. RESOLUCION DE PROBLEMAS 2. La bsqueda de soluciones en los dominios apetecidos por la IA se realiza u a travs de procesos heur e sticos1 en los que los pasos hacia la solucin sueo len ir impl citos. Por el contrario, los programas convencionales emplean procedimientos algor tmicos de bsqueda, con pasos expl u citos hacia la solucin. o 3. En los programas convenicionales la informacin y el control se encueno tran f sicamente integrados en una misma estructura, mientras que en los programas de IA el conocimiento del dominio y las estructuras de control suelen estar f sicamente separados, dando como resultado arquitecturas mucho ms modulares. a

Como siempre ocurre, la diferencia no es lo sucientemente evidente como para permitirnos establecer una frontera clara entre los problemas de la IA (aqullos para cuya e resolucin est indicada la aplicacin de tcnicas de IA) y los problemas convencionales o a o e (aqullos para cuya resolucin estn indicadas las tcnicas de programacin convencional). e o a e o Sin embargo, un anlisis cuidadoso del dominio nos puede dar pistas a la hora de elegir a una u otra losof y evitar as errores provocados por el hecho de no ajustar la tcnica a, e al tipo de problema que queremos resolver. Supongamos que podemos denir a priori un conjunto de situaciones posibles y unas reglas del juego potencialmente utiles, y tambin que podemos disear unas estrategias e n generales, que investiguen la aplicabilidad de las reglas del juego sobre los estados para obtener otros estados, de forma que sea el ordenador quien encuentre por s mismo la solucin al problema. Ntese que este enfoque es de naturaleza no determin o o stica, y que un programa que siguiese este planteamiento ser muy general, podr utilizarse para a a resolver un nmero ilimitado de problemas, ya que slo cambiar las reglas del juego u o an aplicables, en funcin del estado del problema en cada momento. Para conseguir esto, en o IA se dene el espacio de estados del problema.

2.1.

Espacio de Estados

En IA es util denir el dominio del problema que queremos resolver como un espacio de estados, que es una descripcin formal del universo de discurso y est constituido por o a los siguientes elementos: Un conjunto de estados iniciales I. Un conjunto de operadores O que denen operaciones permitidas entre estados. En el espacio de estados no todas las operaciones denidas van a ser aplicables siempre: en un momento dado, el conjunto de estados que representa la situacin actual de nuestro problema es quien determina o el subconjunto de operadores aplicables (o relevantes) del conjunto
El conocimiento heur stico es un conocimiento dif cilmente formalizable, fruto de la experiencia y que se establece impl citamente para tratar de encontrar respuestas ms o menos correctas, pero siempre a vlidas, a problemas de dominios concretos. a
1

2.1. ESPACIO DE ESTADOS de operadores previamente denido. Para que un operador pueda ser considerado relevante debe cumplir un conjunto de requisitos m nimos. Un conjunto de metas M (objetivos) que cumplen los requisitos sucientes para ser consideradas soluciones aceptables de nuestro problema2 . La solucin no es la meta, sino la trayectoria de bsqueda, la secuencia de o u estados que conduce del inicial al nal.

19

Llamaremos nodo a un punto concreto del espacio de estados y estado a la secuencia de pasos que se ha seguiro para llegar a un nodo. El espacio de estados (I, O, M ) es util porque permite describir formalmente un pro blema como un conjunto de transformaciones desde unas situaciones dadas hasta unas situaciones deseadas, a travs de un conjunto de operaciones permitidas. Ms concretae a mente, nos permite contemplar el proceso global de solucin de un problema como: o la aplicacin de un conjunto de tcnicas conocidas, cada una de ellas o e denida como un paso simple en el espacio de estados, y un proceso de bsqueda o estrategia general de exploracin del espacio u o de estados. Formalmente: Si I = [i1 , i1 , . . . , in ] dene al conjunto de estados iniciales, O = [o1 , o2 , . . . , om ] dene al conjunto de operadores potencialmente utiles y M = [m1 , m2 , . . . , mt ] dene al conjunto de metas o estados nales, la bsqueda se dene como el u proceso de exploracin del espacio de estados que produce O : (I M ), o una evolucin desde los estados iniciales hasta los estados nales obtenida o tras la aplicacin de un conjunto de operadores. En este mismo contexto, una o transicin simple en el espacio de estados puede representarse o ox : (iz iw ) con iz , iw I, iz , iw M y ox O. / Si iw M , entonces iw representa una solucin aceptable para nuestro probleo ma. La llamada prueba de meta o test de realizacin aplicada a la descripcin o o de un estado permitir decidir si alguno de los nuevos estados generados se a trata de un estado meta. Cualquier otro estado alcanzado durante la bsqueda u que no pertenezca al conjunto de metas puede ser considerado como un nuevo estado inicial del problema. Este formalismo de resolucin normalmente se traduce en la creacin de programas o o menos ecientes que los convencionales, pero mucho ms exibles y generales. En cuala quier caso, la resolucin de problemas en IA requiere siempre una descripcin formal y o o manejable del problema, esto es, la elaboracin de un modelo computacional del universo o
2

En IA se habla de soluciones aceptables, no de mejor solucin. o

20 de discurso o dominio del problema.

CAP ITULO 2. RESOLUCION DE PROBLEMAS

El espacio de estados, aunque imprescindible para la representacin formal de un proo blema de IA, tan slo nos proporciona lo que podr o amos llamar el soporte f sico del dominio. El aspecto ms dinmico de obtencin de soluciones se materializa a travs de a a o e los llamados procesos de bsqueda, mecanismos generales de exploracin del E.E. u o El concepto de bsqueda est u a ntimamente ligado a la aplicacin de operadores relevano tes. Ms generalmente, la bsqueda se puede asimilar a los procesos de control qe gu a u an la ejecucin de un programa de IA, segn los cuales el sistema debe ser capaz de decidir o u en todo momento cul ser su prximo movimiento en el espacio de estados. Conviene a a o que la bsqueda sea sistemtica (para evitar rodeos innecesarios) y que la aplicacin u a o de cada operador provoque un movimiento que genere la aparicin de un estado nuevo o (que no haya sido generado ya, para evitar hacer y deshacer continuamente). As nos , encontramos con diversas estrategias: Estrategia 1 A priori, una buena posibilidad podr ser la de aplicar el primer operador, a segn un orden establecido, que cumpla los requisitos del estado actual, y vericar si u el nuevo estado es meta. Esta estrategia de bsqueda es sistemtica, pero no observa u a la condicin de generar estados nuevos, con lo cual puede caer en un bucle. Adems, o a hay operadores cuya aplicacin se repite, lo cual no es deseable tampoco. o Estrategia 2 Intentando evitar la aplicacin repetitiva de operadores, pero manteniendo o el criterio de sistematicidad, podr seguirse este otro esquema: a 1. seleccionar los operadores que veriquen las precondiciones del estado actual 2. descartar aqullos que ya hayan sido aplicados e 3. aplicar el primero de los restantes3 . 4. test de realizacin para el nuevo estado o Ntese que esta estrategia nos obliga a denir estructuras adicionales que nos pero mitan comprobar si un operador ha sido aplicado ya o no; adems, an no evita la a u generacin de estados ya generados, y puede no encontrar solucin. o o Estrategia 3 Tratando de impedir de forma expl cita los inconvenientes sealados en la n primera estrategia, podr denirse el esquema siguiente: a 1. seleccionar los operadores que veriquen las precondiciones del estado actual 2. descartar los que ya hayan sido aplicados 3. descartar aqullos cuya aplicacin no genere un estado nuevo e o 4. aplicar el primero de los restantes 5. prueba de meta
Si en este punto los operadores se ordenasen aleatoriamente podr amos llegar a una solucin por o casualidad o conseguir diferentes soluciones para los mismos estados inicial y nal.
3

2.2. CARACTER ISTICAS DE LOS PROCESOS DE BUSQUEDA

21

Nuevamente precisar amos denir estructuras adicionales (aparte de saber qu opee radores hemos aplicado ya, debemos comprobar si un estado es nuevo o no), y podemos an no encontrar solucin. Parece evidente que hemos de sacricar algo si u o queremos encontrarla. Estrategia 4 Seguir los pasos: a 1. seleccin de los operadores que veriquen las precondiciones del estado actual o 2. descarte de los que no generen estados nuevos 3. aplicacin del primero de los restantes o 4. test de realizacin o Ahora s se encuentra una solucin, pero parece claro que no es una forma ptima o o de proceder. El motivo por el cual se ha ilustrado de este modo el hipottico proceso que el sistema e ha seguido para encontrar una solucin es tratar de evidenciar las diferencis existentes o entre los programas convencionales y los programas de IA. El conocimiento del sistema (operadores, precondiciones) se dene de manera totalmente independiente de la forma de utilizarlo (estrategias, mecanismos de control del conocimiento). Adems, a medida a que vamos explorando diversas estrategias de resolucin, vamos encontrando la necesidad o de denir estructuras auxiliares. Y, por ultimo, la solucin encontrada por el sistema es o aceptable (cumple los requisitos para ser meta), pero puede no ser la mejor. La validez de la solucin encontrada depender mucho del tipo de problema planteado. o a Las distintas estrategias de bsqueda que se presentan en este cap u tulo tratarn de a resolver este tipo de problemas.

2.2.

Caracter sticas Generales de los Procesos de B squeda u

Como ya hemos mencionado, los programas de IA deben ser exibles y generales, de forma que, independientemente del universo de discurso, permitan la utilizacin de o tcnicas aplicables a la resolucin de cualquier problema, y que sean de una eciencia, e o por lo menos, aceptable. Surgen as las llamadas tcnicas de b squeda de propsito e u o general, conocidas tambin como mtodos dbiles de exploracin del E.E. Estas e e e o tcnicas derivan de la idea de bsqueda heur e u stica, y pueden denirse independientemente de cualquier tarea particular, o del dominio concreto considerado4 . Cada tcnica de bsqueda tiene sus ventajas, inconvenientes e idiosincrasia particular. e u Antes de decidirnos por una u otra, es conveniente estudiar su idoneidad en relacin al o tipo de problema y dominio planteado. Esta idoneidad puede establecerse analizando un conjunto de caracter sticas esenciales que condicionan el proceso de bsqueda: u
Evidentemente, esta armacin no debe tomarse al pie de la letra: el tipo de tarea a resolver y el o dominio del problema inuyen claramente en la eleccin de una u otra tcnica; aunque conceptualmente o e todas son igualmente aplicables, unas son ms apropiadas que otras. a
4

22

CAP ITULO 2. RESOLUCION DE PROBLEMAS direccin del proceso de bsqueda o u topolog del proceso de bsqueda a u representacin de los estados por los que discurre la resolucin del proo o blema criterios establecidos y procedimiento denido para la seleccin sistemtio a ca de los operadores relevantes en funcin de los estados alcanzados o posibilidad de optimizar los procesos de bsqueda mediante el empleo de u 5 funciones heursticas (usar conocimientos sobre la propia bsqueda) u

2.2.1.

Direccin del proceso de b squeda o u

Existen dos direcciones fundamentales que podemos denir a la hora de congurar un proceso de bsqueda determinado: u desde los estados iniciales hacia los estados meta, mediante la generacin o de estados intermedios obtenidos tras la aplicacin sucesiva de operadores o relevantes (postura: qu hago con lo que tengo? ): e EE(I, O, M ) O : (I M )

desde los estados meta hacia los estados iniciales, investigando qu estae dos previos al estado (o estados) meta, y qu operadores aplicables, nos e producen una transicin deseada (postura: qu tendr que haber hecho o e a para llegar aqu? ): EE(I, O, M ) O : (M I)

La primera direccin denida congura un razonamiento progresivo o dirigido por o los datos, mientras que la segunda congura un razonamiento regresivo o dirigido por los objetivos. Entre ambas situaciones l mite, encontramos cierto tipo de problemas para los cuales es conveniente emplear estrategias mixtas de bsqueda. As en algunos casos es conveu , niente iniciar un proceso dirigido por los datos y, llegado un punto, cambiar la direccin o de la bsqueda, o viceversa, iniciar un proceso dirigido por los objetivos, que permita el u establecimiento de un conjunto de hiptesis razonables, y luego confrontar las hiptesis o o con los datos, a travs de un proceso progresivo. e Sea como fuere, parece claro que la direccin del proceso condiciona, al menos en parte, o los resultados y la eciencia del sistema, pero. . . cundo es aconsejable optar por una u a otra? Existe algn criterio que nos permita discriminar entre ambas opciones? u La eleccin sobre la direccin de bsqueda ms conveniente debe considerar tres aso o u a pectos diferentes:
5

La mejor funcin heur o stica nos dar idealmente, la mejor solucin en tiempo 0. a, o

2.2. CARACTER ISTICAS DE LOS PROCESOS DE BUSQUEDA tamao relativo de los conjuntos I y M (es preferible explorar el espacio n de estados de forma que progresemos desde un conjunto inicialmente pequeo de informacin de partida hacia un conjunto mayor de estados) n o factor de ramicacin (nmero promedio estimacin de estados que o u o se pueden alcanzar desde uno dado, nmero de operadores aplicables u llegados a un momento dado profundidad; inuye en la ecacia del proceso de bsqueda, de modo que trataremos de explorar el espacio de u estados segn la direccin del menor factor de ramicacin6 ) u o o inclusin de estructuras explicativas como requisito inicial en el diseo de o n nuestro sistema inteligente (si el programa debe ser capaz de explicar su proceso de razonamiento, es conveniente que lo realice en la direccin o que concuerde ms aproximadamente con la forma de razonar del usuario a humano)

23

2.2.2.

Topolog del proceso de b squeda a u

Una forma sencilla de explorar el espacio de estados es generar dinmicamente 7 un a rbol, partiendo de un determinado estado, inicial o nal, y expandirlo tras la ejecucin a o 8 de uno o varios operadores relevantes . Es totalmente viable que un mismo estado sea generado durante la exploracin de o diversos caminos, lo que supone un esfuerzo adicional de computacin que se traduce o en una menor eciencia del proceso de bsqueda. Este inconveniente puede mitigarse u cambiando la topolog del proceso y convirtiendo el rbol en un grafo dirigido. a a En la tabla 2.1 (pgina 24) se expone un mecanismo de conversin completo de rbol a o a de bsqueda a grafo de bsqueda, ya que, adems de cambiar la topolog del proceso, u u a a registra el mejor camino cada vez que se genera un nuevo estado. La utilizacin de grafos de bsqueda reduce los esfuerzos de exploracin del espacio de o u o estados, aunque tiene el inconveniente de que obliga a comprobar si cada nuevo estado generado pertenece ya al conjunto de estasod generados en pasos anteriores. Las topolog en rbol suelen causar problemas de memoria, pero la bsqueda puede as a u ser ms rpida. Las topolog en grafo, aparte de ser conceptualmente ms correctas, a a as a minimizan los problemas de memoria, aunque pueden hacer disminuir la eciencia al tener que efectuar comprobaciones frecuentes. As pues, ambos esquemas tienen ventajas e inconvenientes, de modo que en ultimo trmino la eleccin depende del dominio del e o problema planteado.
Aunque, por desgraca, suele ir normalmente en la direccin contraria a la que indica el primer punto o (tamao relativo de I y M ). n 7 En IA los rboles de decisin son siempre impl a o citos, slo se materializan cuando se ejecuta un o determinado proceso inferencial. 8 El nmero de operadores relevantes ejecutados depende de la tcnica de exploracin elegida, como u e o veremos.
6

24

CAP ITULO 2. RESOLUCION DE PROBLEMAS


(a) Generar (uno o ms) estados a tras la aplicacin de (uno o ms) operadores relevantes o a (b) Examinar el conjunto de estados generados; para cada uno: (b.1) Si el estado es nuevo a~adirlo y volver a (a) n (b.2) Si ya exista descartarlo e ir a (c) (c) A~adir un enlace entre el nodo que se est expandiendo n a y su sucesor (d) Recorrer el nuevo camino desde el principio (d.1) Si es ms corto a insertarlo como mejor camino y propagar el cambio reorganizar el grafo si es necesario volver a (a) (d.2) Si no es ms corto a volver a (a)

Cuadro 2.1: Algoritmo de transformacin de rbol a grafo. o a

2.2.3.

El problema de la representacin o

De acuerdo con las estructuras denidas en el espacio de estados, el problema de la representacin puede estudiarse desde tres perspectivas diferentes: o Representacin de los objetos, entidades relevantes o hechos del dominio o (estructura del conocimiento) naturaleza esttica. a Representacin de las relaciones entre objetos, entidades relevantes o heo chos del dominio (estructuras que nos permiten transitar por el espacio de estados: operadores) naturaleza dinmica. a Representacin de las secuencias de estados surgidas durante los procesos o de bsqueda (de la estrategia y los mecanismos de control necesarios u para organizar la bsqueda convenientemente, representacin dinmica u o a del proceso de bsqueda de soluciones). u La representacin de los nodos y la representacin de las relaciones entre los nodos o o denen el problema de la representacin del conocimiento, que veremos ms adelante. o a Aunque de las tres perspectivas la ms relacionada con la bsqueda es la representacin a u o de las secuencias de estados, todas ellas estn estrechamente relacionadas y, normalmente, a la eleccin de determinados esquemas de representacin para entidades y relaciones suele o o condicionar el esquema de representacin idneo para las secuencias de estados. o o

2.2. CARACTER ISTICAS DE LOS PROCESOS DE BUSQUEDA

25

2.2.4.

Seleccin sistemtica de operadores relevantes o a

Ya hemos comentado cmo la aplicacin de un determinado operador sobre un estado o o dado produce un nuevo estado, pero. . . cmo podemos reconocer, de entre el conjunto o global de operadores potencialmente utiles, aqullos que realmente son aplicables a nuestro e estado actual? Cmo podemos extraer del conjunto global de operadores un subconjunto o de operadores relevantes? Este problema dene lo que en IA se denomina emparejamiento, que constituye una de las tareas ms costosas y lentas de los programas de IA. Existen varios tipos de empaa 9 rejamiento , cada uno con sus ventajas e inconvenientes, y la eleccin del tipo de empao rejamiento suele depender del esquema utilizado para representar el conocimiento: El emparejamiento literal realiza una bsqueda simple a travs de todos u e los operadores del conjunto O, analizando las precondiciones de cada uno en el contexto del estado actual considerado y extrayendo los que las veriquen. Este tipo de emparejamiento presenta el problema de que su eciencia est muy ligada al nmero de operadores denidos en el conjunto O; si a u consideramos que los problemas realmente interesantes en IA requieren la utilizacin de gran nmero de operadores, deducimos que este mtoo u e do suele ser intr nsecamente ineciente en los problemas reales. Por otra parte, para un estado particular no siempre es evidente que un operador determinado sea aplicable, a veces es dif saber si un estado satisfacil ce o no las precondiciones del operador (puede ocurrir que el operador empareje completamente con el estado, o que sus precondiciones sean un subconjunto de la descripcin del estado, o que coincidan slo parcialo o mente, o bien que no coincidan en absoluto), de modo que slo es util en o dominios pequeos en los que la exploracin de patrones, costosa y lenta, n o se vea compensada por lo restringido del conocimiento involucrado. Como ventaja, es un mtodo muy informativo. e El emparejamiento con variables es de naturaleza no literal, y es especialmente util cuando el problema que tratamos de resolver requiere una bsqueda extensa en la que no haya variables involucradas. Es ms desu a criptivo que el anterior, y reduce el nmero de operadores. Lo ilustraremos u con un ejemplo. Tengamos los siguientes hechos del dominio (describen la situacin actual o del problema):
HIJO HIJO HIJO HIJA HIJA HIJA
9

(Mara, Juan) (Juan, Pedro) (Pedro, Toms) a (Pedro, Rosa) (Juan, Ana) (Ana, Rosa)

Proceso de seleccin de operadores relevantes. o

26

CAP ITULO 2. RESOLUCION DE PROBLEMAS donde HIJO (A,B) signica que B es hijo de A, y los operadores:
op1 : HIJO (x,y) AND HIJO (y,z) -> NIETO (x,z) op2 : HIJA (x,y) AND HIJO (y,z) -> NIETO (x,z) op3 : HIJO (x,y) AND HIJA (y,z) -> NIETA (x,z)

Encontrar un estado meta supone encontrar un estado que incluya los mismos hechos que el estado de partida y, adems, algn hecho que india u que que realmente es meta (hecho inferido). Si quisiramos saber quin e e es nieto de Juan nos interesar aplicar los operadores 1 2, puesto a o que son los que concluyen sobre la existencia de un nieto. La meta se obtendr inmediatamente con slo sustituir x por Juan, pero para ello a o tendr amos que encontrar primero un y que vericase HIJO (Juan,y) AND HIJO (y,z) para alg n valor de z. Esto supondr comprobar todos los u a hijos de Juan y vericar que alguno de ellos tenga a su vez un hijo, o comprobar entre todos los que tengan algn hijo que alguno de ellos es a u su vez hijo de Juan. Frecuentemente, encontraremos muchos valores que satisfagan los predicados por separado, pero muy pocos que los satisfagan todos. Una vez identicados los operadores aplicables en el estado actual, y en el caso de que hayamos podido identicar ms de uno, es cuando se presenta el conicto: debemos ser a capaces de poder elegir de entre dicho conjunto de conicto la utilizacin del operador que o a priori nos ofrezca ms garant de xito en la bsqueda de un camino adecuado hacia a as e u la meta. Un enfoque correcto de este problema de resolucin de conictos es fundamental o en la construccin de sistemas inteligentes. o Aunque muchas veces los mecanismos idneos de resolucin de conictos son depeno o dientes del universo de discurso, del esquema de representacin elegido y del procedimiento o de bsqueda empleado, tambin es cierto que toda estrategia de resolucin de conictos u e o debe respetar los siguientes criterios generales: si puede evitarse, no deben aplicarse operadores que ya hayan sido utilizados deben tratar de aplicarse primero operadores que emparejen con los hechos ms recientemente incorporados a la base de hechos que describe a nuestro estado actual, de manera que utilicemos informacin ms real y o a actual (lo que obliga a ser capaces de identicar la secuencia temporal en la incorporacin de hechos; eciencia inferencial y computacional) o se tratar de aplicar primero operadores con precondiciones ms restrictia a vas, ms espec a cos (buscando mayor discriminacin, acotar el problema) o de no darse ninguna de las condiciones anteriores, se seleccionar uno (o a varios) operadores al azar

2.3. ESTRATEGIAS DE EXPLORACION DEL E.E.

27

2.2.5.

Funciones heur sticas

Se conoce como funcin heurstica a aquella funcin de carcter numrico que permite o o a e cuanticar el benecio de una transicin efectuada en el espacio de estados del dominio del o problema a resolver. Suelen resultar utiles a la hora de optimizar los procesos de bsqueda, u ya que intentan guiar la exploracin del espacio de estados en la direccin ms provechosa, o o a sugiriendo el mejor camino a seguir (a priori) cuando disponemos de varias alternativas, intentando llegar a la solucin de manera intuitiva (nos dice cun lejos estamos de llegar o a a la solucin). o

2.3.

Estrategias de Exploracin del E.E. o

La ecacia del proceso de bsqueda viene frecuentemente determinada por la estrategia u empleada y por los mecanismos diseados para controlar la aplicacin del conocimiento n o del dominio. Est claro que, para cada universo de discurso, siempre podremos establecer estrategias a espec cas (tcnicas ad-hoc, concretas, para casos concretos) de exploracin del espacio e o de estados, es decir, tcnicas de b squeda de propsito espec e u o co. No obstante, desde la perspectiva de la IA, son mucho ms interesantes las estrategias genricas que a e unen a su generalidad una eciencia razonable. Tales estrategias genricas se agrupan en e lo que habitualmente se denominan mtodos dbiles de exploracin del espacio de e e o 10 estados . Cualquier mtodo dbil de exploracin del E.E. congura una bsqueda que ser de e e o u a uno de los siguientes tipos: En anchura. En profundidad. Mixta profundidad-anchura.

2.3.1.

B squeda preferente por amplitud (anchura) u

La bsqueda preferente por amplitud o bsqueda en anchura trata de generar amplios u u y crecientes segmentos en el E.E. y en cada nuevo nivel generado verica si el objetivo ha sido alcanzado antes de pasar al siguiente. Su caracter stica fundamental es, pues, que se expanden todos los nodos de un mismo nivel antes de acceder a nodos de niveles inferiores11 . La implementacin computacional del mtodo utiliza dos listas de nodos: o e ABIERTOS, nodos que se han generado y a los que se les ha aplicado la funcin de evaluacin pero que an no han sido examinados (no se han o o u generado sus sucesores)
10 11

Se denominan as porque el conocimiento que aaden al problema es dbil. n e Puede verse, pues, como una materializacin del ars magna de Ramn Llull. o o

28

CAP ITULO 2. RESOLUCION DE PROBLEMAS CERRADOS, nodos que ya han sido examinados (esta lista tiene la nalidad de evitar la creacin de ciclos en el proceso de bsqueda) o u

Cada nodo n del rbol de bsqueda mantendr enlaces a todos sus sucesores, pero a u a slo a un unico predecesor. El algoritmo se muestra en la tabla 2.2 (pgina 28). o a

1. Colocar el nodo inicial en ABIERTOS 2. Aplicar el test de realizacin a este nodo; o Si es meta, salir e informar de la solucin o 3. Si ABIERTOS est vaca a salir e informar del fallo 4. Obtener el primer nodo (N) de ABIERTOS y a~adirlo a CERRADOS n 5. Expandir N generando todos sus sucesores aplicando todos los operadores relevantes; Si no hay sucesores, volver a 3 sino a~adir los sucesores al final de ABIERTOS n y actualizar sus enlaces para que apunten a N 6. Aplicar a los sucesores el test de realizacin; o Si alguno de ellos es meta, salir e informar de la solucin o siguiendo los enlaces hasta el nodo inicial 7. Volver a 3

Cuadro 2.2: Algoritmo de Bsqueda en Anchura. u

Los caminos que se exploran paralelamente y no resultan en solucin, se dicen no reo solutivos; nada indica que no puedan ser parte de una solucin a otro nivel. o Los procedimientos de bsqueda en anchura, por ser exhaustivos (y sistemticos, ya u a que se aplican todos los operadores que pueden emparejarse con todos y cada uno de los nodos del nivel considerado), nos permiten asegurar que, en espacios de estados nitos y bien construidos, el sistema siempre encontrar la solucin al problema, y adems, dicha a o a solucin ser la mejor. o a Desgraciadamente, los mtodos en anchura son impracticables en dominios amplios, e ya que el nmero de nodos generado en cada nivel sucesivo crece de manera exponencial u y, consecuentemente, las necesidades de memoria y el tiempo computacional empleado en la bsqueda tambin lo hacen. u e

2.3. ESTRATEGIAS DE EXPLORACION DEL E.E.

29

2.3.2.

B squeda preferente por profundidad u

A diferencia de los mtodos en anchura, los mtodos en profundidad seleccionan un e e camino determinado y siguen por l hasta agotarlo completamente. En los mtodos en e e profundidad puros el test de realizacin se efecta cada vez que se genera un nuevo nodo. o u Puede ocurrir que el camino recorrido sea resolutivo y lleve a una solucin del problema o o puede que agotemos todas las posibilidades de expansin sin haber encontrado nada. En o este ultimo caso hay que efectuar una vuelta atrs y explorar otro camino diferente (ver a algoritmo12 en tabla 2.3, pgina 29). a
1. Colocar el nodo inicial N en CAMINO 2. Aplicar el test de realizacin a este nodo. o Si es meta, salir 3. Expandir N aplicando el primer operador no aplicado para gener un sucesor S. 4. Si ningn operador es aplicable, u salir 5. En caso contrario, realizar una bsqueda en profundidad u partiendo de S

Cuadro 2.3: Algoritmo de Bsqueda en Profundidad. u Los mtodos en profundidad son sensibles a la posicin relativa de los operadores en e o una lista, ya que este es el criterio que se utiliza para la seleccin de operadores en caso o de conicto. Desde una perspectiva computacional, requieren menos recursos de memoria que los mtodos en anchura, ya que consideran un espacio de bsqueda ms limitado, pero e u a pueden tratar de explorar caminos muy largos habiendo alternativas mejores e incluso no llegar nunca a alcanzar una solucin; no est clara su sistematicidad (la bsqueda en o a u profundidad pura es un procedimiento sistemtico, pero permite que encontremos la a 13 solucin por casualidad , sin que tenga, por supuesto, que ser la mejor) y hay que o hacer un montn de comprobaciones, por lo que se es ms ineciente desde el punto de o a vista temporal. En ocasiones, los caminos generados por los mtodos en profundidad no se exploran e completamente, abandonndose la bsqueda tras alcanzarse sin xito una determinada a u e profundidad. Ello puede suponer que consideremos que un determinado camino es infructuoso cuando, en realidad, se estaba muy cerca de la solucin. o Lo normal, en la prctica, es emplear estrategias mixtas y desarrollar procedimiena tos que combinen, de una forma u otra, caracter sticas de los mtodos en anchura y e profundidad. A continuacin veremos varios de estos mtodos. o e
12 13

La ruta con la solucin en este algoritmo queda almacenada en la lista de nodos CAMINO. o Este aspecto se enfatiza si, tras cada expansin, los operadores aplicables se reordenan aleatoriamente. o

30

CAP ITULO 2. RESOLUCION DE PROBLEMAS

2.3.3.

Generacin y prueba o

El mtodo de generacin y prueba es un procedimiento de bsqueda en profundidad e o u casi puro, en el que deben recorrerse caminos completos antes de realizar ninguna comprobacin (lo que cambia, pues, es slo el lugar donde se realiza la prueba de meta, que o o se limita a responder armativa o negativamente acerca de la validez del camino generado). En su forma ms sistemtica, el mtodo de generacin y prueba es una bsqueda a a e o u exhaustiva en el espacio del problema (ver tabla 2.4, pgina 30). a
1. Generar una solucin posible o 2. Aplicarle la prueba de meta 3. Si es solucin, o parar sino volver a 1

Cuadro 2.4: Algoritmo de Bsqueda Mixta Generacin y Prueba. u o Si la generacin es sistemtica y exhaustiva, siempre encontraremos la solucin, si o a o existe. Sin embargo, si el dominio de prueba es muy amplio, la exploracin del espacio de o estados mediante este mtodo puede requerir demasiado tiempo. e Los procedimientos de bsqueda vistos hasta ahora tienen una caracter u stica comn: u forman parte de las denominadas bsquedas ciegas. Parte de los problemas que aparecen en u ellos pueden ser resueltos empleando las denominadas tcnicas heur e sticas de bsqueda, u que suelen mejorar la eciencia de los procesos de resolucin de problemas sacricano do la exhaustividad de la respuesta, dejando de considerar algunos caminos que parece improbable que conduzcan a la solucin. o Las estrategias de bsqueda informada tratan, pues, de optimizar los procesos de u bsqueda utilizando funciones heur u sticas que les permitan guiar la exploracin del E.E. o en la direccin ms provechosa, sugiriendo el mejor camino a seguir cuando se dispone o a de varias alternativas.

2.3.4.

Ascensin a colinas o

El procedimiento de ascensin a colinas es una variante del mtodo de profundidad en o e el que la seleccin del siguiente nodo a expandir se realiza de acuerdo con alguna medicin o o heur stica que permite estimar la distancia que queda por recorrer hasta la meta. En su forma ms sencilla, el algoritmo de ascensin a colinas se presenta en la tabla 2.5 (pgina a o a 31). A diferencia de la bsqueda en profundidad, con este algoritmo una rama no tiene u por qu ser explorada hasta agotarse, sino que el proceso de expansin terminar en el e o a momento en que se encuentra un nodo sucesor que no mejora el estado actual.

2.3. ESTRATEGIAS DE EXPLORACION DEL E.E.


1. Colocar el nodo inicial N en CAMINO 2. Aplicar el test de realizacin al nodo N; o Si es meta, salir 3. Repetir hasta encontrar un sucesor 3.1. Aplicar a N un operador no aplicado para generar un sucesor S 3.2. Si no hay ningn operador aplicable, u salir 3.3. En caso contrario, aplicar la funcin heurstica a S o 3.4. Si mejora la funcin heurstica del estado actual, o ir a 4 3.5. Si no, volver a 3.1 4. Continuar el proceso de bsqueda partiendo de S u

31

Cuadro 2.5: Algoritmo de Bsqueda Ascensin a colinas. u o Tambin se podr decir que el mtodo de ascensin a colinas es similar a generacin e a e o o y prueba, pero cuando se llega a una situacin en la que hay que hacer backtracking se o aplican varios operadores en el nodo predecesor, es decir, se abre una pequea componente n en anchura y se comprueba si alguno de los nodos generados es meta; si no lo es ninguno, se aplica una funcin heur o stica para continuar por alguno de ellos. Una variante util del mtodo de ascensin a colinas simple consiste en considerar todos e o los posibles movimientos a partir del estado actual y elegir el mejor de ellos como nuevo estado. Este mtodo se denomina ascensin por la mxima pendiente o b squeda e o a u del gradiente (ver tabla 2.6, pgina 32) y, contrasta con el mtodo bsico, en el que el a e a primer estado que parezca mejor que el actual se selecciona como siguiente. Tanto la ascensin a colinas bsica como la de mxima pendiente pueden no encontrar o a a una solucin si caen en un estado del que no es posible generar nuevos estados mejores que o l, pero que an no es solucin. Esto ocurre cuando el proceso de bsqueda se encuentra e u o u con un mximo local, una meseta o una cresta. Considerando el E.E. como una supercie a n-dimensional en la que cada punto est denido por los valores que denen ese estado y a su valor de la funcin heur o stica: Un mximo local es un estado puntual mejor que cualquiera de sus a vecinos pero peor que otros estados ms lejanos14 . Cuando estn prximos a a o a la solucin, los mximos locales se denominan estribaciones. o a Una meseta es un rea plana del espacio de estados en la que toos a
Llegados a uno, cualquier operacin o movimiento que hagamos nos llevar a un estado aparentemente o a peor, aunque en realidad no estemos aproximando a la solucin. o
14

32

CAP ITULO 2. RESOLUCION DE PROBLEMAS


1. Colocar el nodo inicial N en el CAMINO 2. Aplicar el test de realizacin a este nodo; o Si es meta, salir 3. Aplicar a N todos los operadores disponibles y generar todos sus sucesores Sj. 4. Si no hay ningn operador aplicable, u salir 5. En caso contrario, aplicar la funcin heurstica a todos los Sj o 6. Si la funcin heurstica de algn Sj mejora la del estado actual, o u llamar a Sj MEJORNODO e ir a 8 7. En caso contrario, salir 8. Continuar el proceso de bsqueda partiendo de MEJORNODO u

Cuadro 2.6: Algoritmo de Bsqueda Ascensin por mxima pendiente. u o a los estados individuales tienen un mismo valor de la funcin heur o stica, de suerte que no es posible determinar cul es la mejor direccin para a o continuar la bsqueda. u Una cresta es un tipo especial de mximo local, un rea del espacio de a a estados que tiene estados con mejores valores de la funcin heur o stica que los de regiones colindantes, y adems posee una inclinacin, pero la oriena o tacin de esta regin alta hace que sea imposible atravesarla mediante o o transiciones simples. Estos inconvenientes del mtodo tienen dif solucin. Como norma general, cuando e cil o aparece alguna de estas situaciones se pueden intentar las siguientes estrategias: regresar a un nodo previo e intentar una direccin diferente (mximos o a locales) realizar un gran salto en el espacio de bsqueda (mesetas) u aplicar ms de un operador antes de comparar de nuevo los valores de la a funcin heur o stica (crestas)

2.3.5.

B squeda por el mejor nodo: A u

Los mtodos de bsqueda por el mejor nodo combinan algunas de las ventajas de los e u mtodos en profundidad y en anchura. Bsicamente, se trata de organizar una bsquee a u da mixta profundidad-anchura guiada hacia el nodo ms prometedor por una funcin a o heur stica que se aplica a cada paso, con independencia de la rama del rbol a la que a pertenezca el nodo en cuestin. A esta familia de mtodos pertenecen el algoritmo A y o e

2.3. ESTRATEGIAS DE EXPLORACION DEL E.E. las Agendas que veremos a continuacin. o

33

El algoritmo A trata de expandir el nodo ms cercano a la meta, de entre los nodos a que se encuentran en las rutas menos costosas que parten del estado inicial. Para ello, utiliza una funcin de evaluacin f denida como o o f (n) = g(n) + h(n) donde g(n) es el coste de la ruta que va del nodo de partida al nodo actual n, calculada como la suma de los costes de cada una de las acciones individuales que se emprenden a lo largo de la ruta y h(n) es la funcin heur o stica, que proporciona una estimacin del o coste m nimo adicional de llegar desde el nodo actual n hasta el nodo meta. Ntese que o g no es una estimacin, se conoce exactamente su valor. o El algoritmo A utiliza un grafo dirigido para representar el E.E. En su implementacin, hace uso de las listas de nodos ABIERTOS y CERRADOS. Bsicamente se procede por o a pasos, expandiendo un nodo en cada paso hasta que se genere un nodo que corresponda a un estado meta. En cada paso, se toman los nodos ms prometedores que se han generado a hasta el momento, pero que no se han expandido (ABIERTOS). Se generan los sucesores del nodo elegido, se les aplica la funcin de evaluacin y se elige de nuevo el siguiente nodo o o a expandir. Cada nodo n en el grafo mantendr enlaces a todos sus sucesores, pero slo a o a un unico predecesor: aqul que se encuentre en el camino ptimo para llegar desde el e o nodo inicial hasta el estado n. El procedimiento Propagar Mejora(VIEJO) se utiliza para propagar la mejora obtenida sobre el coste del nodo apuntado por VIEJO. VIEJO apunta a sus sucesores. Cada sucesor, a su vez, apunta a sus sucesores, y as sucesivamente. Por tanto, para propagar el nuevo coste hacia abajo, podemos hacer una bsqueda en profundidad, empezando en u VIEJO, cambiando el valor g de cada nodo (y por tanto su valor f ). La propagacin tero mina cuando se alcanza o bien un nodo sin sucesores, o bien un nodo para el que ya se ha encontrado un camino equivalente o mejor15 . Es fcil examinar esta condicin: el enlace a o paterno de cada nodo apunta hacia atrs a su mejor predecesor conocido, de modo que a conforme propagamos a un nodo siguiente debemos mirar si su predecesor apunta al nodo del que estamos viniendo y, si lo hace, continuar, pero si no lo hace, entonces su valor g ya reeja el mejor camino del que forma parte as que la propagacin debe parar ah o . Claro que tambin es posible que al propagar un nuevo valor de g hacia abajo el camino e que estamos siguiendo se vuelva mejor para un nodo que el camino a travs del antecesor e actual. Por eso debemos comparar los dos y si el camino a travs del antecesor actual es e an mejor, detener tambin la propagacin, pero si el camino a travs del cual estamos u e o e propagando es mejor que el camino del antecesor actual debemos cambiar el antecesor y continuar la propagacin. o Es conveniente realizar algunas observaciones sobre el papel de las funciones g, h y f en
Esta segunda comprobacin garantiza que el algoritmo acabar aunque haya ciclos en el grafo. Si hay o a un ciclo, la segunda vez que visitemos un nodo veremos que el camino no es mejor que la primera vez que lo visitamos.
15

34

CAP ITULO 2. RESOLUCION DE PROBLEMAS


1. Poner el nodo inicial en ABIERTOS; asignarle g(n)=0 y el h(n) que corresponda; calcular f(n); inicializar CERRADOS a lista vaca 2. Si ABIERTOS est vaca, a informar del fallo y terminar 3. Elegir de ABIERTOS el nodo con mejor valor de f; llamarle MEJORNODO; quitarlo de ABIERTOS y meterlo en CERRADOS 4. Si MEJORNODO es meta, salir e informar de la solucin siguiendo o los enlaces que llevan del nodo meta al inicial 5. Expandir MEJORNODO generando todos sus sucesores Si no tiene sucesores, ir a 2 6. Para cada sucesor 6.1. Poner SUCESOR apuntando a MEJORNODO 6.2. Calcular g(SUCESOR)=g(MEJORNODO)+coste(MEJORNODO,SUCESOR) 6.3. Si SUCESOR est en ABIERTOS, a llamar a este nodo VIEJO; a~adir VIEJO a la lista de sucesores de MEJORNODO; n Si g(VIEJO)>g(SUCESOR), hacer que el enlace paterno de VIEJO apunte a MEJORNODO; hacer g(VIEJO)=g(SUCESOR); calcular f(VIEJO)=g(SUCESOR)+h(VIEJO); eliminar SUCESOR 6.4. Si SUCESOR est en CERRADOS, a llamar a este nodo VIEJO, a~adir VIEJO a la lista de sucesores de MEJORNODO; n Si g(VIEJO)>g(SUCESOR), hacer que el enlace paterno de VIEJO apunte a MEJORNODO; hacer g(VIEJO)=g(SUCESOR); calcular f(VIEJO)=g(SUCESOR)+h(VIEJO); eliminar SUCESOR; propagar el nuevo mejor coste realizando un recorrido en profundidad a partir de VIEJO /* Propagar_Mejora(VIEJO) */ 6.5. Si SUCESOR no est ni en ABIERTOS ni en CERRADOS, a calcular h(SUCESOR) y f(SUCESOR), introducirlo en ABIERTOS a~adirlo a la lista de sucesores de MEJORNODO n --------------------------------------------------------------------coste(MEJORNODO, SUCESOR)=coste de aplicar el operador que nos lleva de MEJORNODO a SUCESOR cuando SUCESOR existe en ABIERTOS, es que el nodo ya exista y lo que se hace es actualizarlo como hijo de MEJORNODO si g(VIEJO)>g(SUCESOR) debemos decidir si el nuevo padre que hemos encontrado para el nodo es mejor que el que tena, y si es as actualizar el coste y el enlace paterno, de modo que en el grafo queden slo caminos ptimos o o propagar el nuevo mejor coste es necesario cuando acabamos de encontrar un mejor camino a VIEJO (se propaga la mejora a todos sus sucesores)

Cuadro 2.7: Algoritmo de Bsqueda A . u

2.3. ESTRATEGIAS DE EXPLORACION DEL E.E.


1. Para cada SUCESOR Nj de VIEJO 1.1. Si el puntero al padre apunta a VIEJO, actualizar g(Nj)=g(VIEJO)+coste(VIEJO,Nj); actualizar f(Nj) 1.1.1. Si Nj est en CERRADOS, a Propagar_Mejora(Nj) 1.2. Si el puntero al padre no apunta a VIEJO, 1.2.1. Si g(VIEJO)<g(padre de Nj), poner como padre de Nj a VIEJO; g(Nj)=g(VIEJO)+coste(VIEJO,Nj) actualizar f(Nj) 1.2.1.1. Si Nj est en CERRADOS, a Propagar_Mejora(N_j)

35

Cuadro 2.8: Algoritmo Propagar Mejora(VIEJO). el algoritmo A . La funcin g nos permite escoger el nodo a expandir sobre la base, no slo o o de cun bueno es el nodo en s mismo (medido por h), sino tambin sobre la base de cun a e a bueno era el camino hasta el nodo. Al incorporar g en f , por tanto, no siempre elegiremos como nuestro siguiente nodo a expadir el nodo que parece ms cercano a la meta. Esto es a util si nos interesa minimizar el coste del camino solucin, por ejemplo. Pero si slo nos o o importa llegar a una solucin de la forma que sea, podemos denir siempre g como 0. Si o queremos encontrar un camino que tenga el menor nmero de pasos, entonces debemos u asignar una constante, usualmente 1, al coste de ir desde un nodo a su sucesor. Si, por otra parte, queremos encontrar el camino de menor coste y unos operadores cuestan ms a que otros, el coste de ir de un nodo a otro tendr que reejar los costes de los operadores. a As pues, el algoritmo A puede usarse tanto si estamos interesados en encontrar un camino de coste total m nimo, como si simplemente queremos encontrar cualquier camino de la forma ms rpida posible. a a En cuanto a h, si es un estimador perfecto del coste del camino hasta la meta, entonces A converger inmediatamente hacia la meta sin bsqueda. Si h siempre es 0, la bsqueda a u u estar controlada por g. si g tambin es 0, la estrategia de bsqueda se realizar al azar. a e u a Si g siempre es 1, se realizar una bsqueda en anchura. a u El algoritmo A es completo y admisible. Es completo porque siempre acaba encontrando un camino solucin, si existe. Es admisible porque para cualquier grafo, termina o siempre obteniendo un camino ptimo desde un estado inicial hasta un estado meta, con o tal de que exista alguno de estos caminos. Se puede demostrar que el algoritmo A es admisible siempre que la funcin heur o stica lo sea, es decir, que raramente encontrar una a solucin cuyo coste sea mayor que el de la solucin ptima si la estimacin de la funcin o o o o o heur stica sobreestima el verdadero coste del camino slo en . o Por ultimo, es importante resaltar que el algoritmo A no tiene por qu resultar ade e cuado para cualquier problema de bsqueda y su utilidad se deber evaluar dentro del u a contexto de cada problema. Por ejemplo, en un caso en el que interesase el camino que que-

36

CAP ITULO 2. RESOLUCION DE PROBLEMAS

da por recorrer, ser ms adecuado un algoritmo como el de ascensin a colinas que, ms a a o a que realizar la bsqueda global de forma efectiva, escoge bien entre los estados sucesores u del nodo actual.

2.3.6.

B squeda por el mejor nodo: Agendas u

Hasta ahora se ha asumido que el hecho de que varios caminos lleven de modo independiente al mismo estado no refuerza el mrito de ese estado. Sin embargo, esto no siempre e se cumple: existen situaciones en las que no existe una unica y simple funcin heur o stica que mida la distancia entre un nodo dado y un objetivo. Adems, el que distintos caminos a recomienden el cambio a un mismo estado mediante la realizacin de una tarea, puede o ser importante si cada uno de ellos proporciona una razn de por qu ese estado puede o e conducir a resolver el problema. Cuantas ms razones haya, aumenta la posibilidad de a que la tarea lleve a la solucin. En estos casos, es necesaria alguna estructura que nos o permita almacenar las tareas propuestas, junto a las razones que se han propuesto para ellas, y algn mecanismo que nos permita gestionar este conjunto. u Las agendas son, bsicamente, listas de tareas que puede (o debe) realizar un sistema. a Cada una de las tareas de la agenda suele llevar asociada una lista de razones por las cuales se presume que acometer esa tarea es conveniente (que sern utilizadas para elaborar a justicaciones y explicar procesos), y un valor que representa el peso total de la evidencia que sugiere que la tarea es util (as una agenda puede considerarse como un conjunto de , 16 tareas organizadas por pesos prioridades). El mtodo de b squeda conducido por agendas es un procedimiento por el mejor e u nodo en el que debe elegirse la mejor tarea de la agneda y ejecutarse, asignando para ello los recusos necesarios. El trmino tarea puede tener distintos signicados: puede entenderse e como una descripcin expl o cita de lo que debe hacerse a continuacin o simplemente ser o una mera indicacin acerca de cul debe ser el siguiente nodo a expandir. Por otra parte, o a una misma tarea puede llevar asociadas distintas justicaciones, y no todas ellas han de pesar lo mismo. Este mtodo, sin embargo, provoca el gasto de una gran cantidad de tiempo en mane tener ordenada la agenda, de modo que en la prctica se utiliza una estrategia modicada a que compara los nuevos valores de las tareas slo con algunos elementos superiores de o la agenda (entre cinco y diez, normalmente) y si es mejor se inserta el nodo en su lugar adecuado en cabeza de la lista y si no se deja donde estaba o simplemente se inserta al nal de la agenda (de vez en cuando se recorre la agenda y se reordena). Esta estrategia puede hacer que se ejecute ocasionalmente una tarea que no sea la mejor, pero su coste es signicativamente menor que el del algoritmo original. Existen algunos dominios de problemas en los que no es apropiado utilizar un mecanismo de agenda, por ejemplo, en sistemas de razonamiento no montono en los que las o razones y justicaciones que apoyan en un momento dado una tarea pueden no mantenerse un tiempo despus. e
Este orden permitir adems, la insercin ordenada de nuevas tareas; si las justicaciones de una a, a o tarea cambian, el peso debe ser recalculado y puede que tenga que ser trasladada a una nueva localizacin o en la lista.
16

2.3. ESTRATEGIAS DE EXPLORACION DEL E.E.

37

Hasta que se alcance un estado objetivo o la agenda est vaca hacer: e 1. Identificar la mejor tarea de la agenda (MEJORNODO) 2. Ejecutarla 3. Si se han generado nuvas tareas, para cada una de ellas 3.1. Si no estaba ya en la agenda, a~adirla a la lista n 3.2. Si ya estaba en la agenda, si no tiene la misma justificacin, o a~adir la nueva justificacin n o 4. Si se ha a~adido una tarea o una justificacin, n o calcular el peso asignado a estas tareas combinando la evidencia de todas sus justificaciones y recomponer la agenda

Cuadro 2.9: Algoritmo de Bsqueda conducida mediante Agenda. u