Curso: Inteligencia Artificial Unidad III: Solución de problemas por búsqueda M. en I.A. Daniel Alejandro García López 19 de enero de 2009 Resumen La resolución de problemas se describe a menudo como una búsqueda en un enorme laberinto de posibilidades, un laberinto que describe el entorno. Para resolver existosamente un problema se requiere explorar el laberinto de forma selectiva y con ello reducirlo a proporciones manejables. Las máquinas aún no pueden reducir automáticamente los problemas a proporciones manejables, es por ello que los seres humanos tienen que formular los problemas y proponer estrategias para encontrar su solución. En esta unidad se tratará temas relacionados con la búsqueda en el espacio de estados(que es como el laberinto de posibilidades). En algunos tipos de problemas lo importante es encontrar una solución, aunque esta no sea la mejor debe ser una solución aceptable, en otros casos es necesario encontrar el camino que nos lleva a esa solución. De manera general, cualquiera de las estrategias de búsqueda que se tratan en esta unidad pueden resolver ambos requisitos, sólo se requieren pequeños ajustes en sus métodos generales. La mayoría de las estrategias de búsqueda que son tratadas en esta unidad son enfocadas a ejemplos para maximizar la comprensión de las técnicas y de esta manera pueda ser llevarlo rápidamente a la implementación. Las estrategias de búsqueda clásicas que se abordarán son: búsqueda en profundidad, búsqueda en amplitud, búsqueda con retroceso, búsqueda primero el mejor y A*, además de Minimax. Índice general Índice de Tablas II Índice de Figuras III 1. Introducción 1 2. Formulación y resolución de problemas. 2.1. Definición formal del problema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2. Análisis del problema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 4 5 3. Problemas de juego y problemas reales. 3.1. Problemas de juguete . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2. Problemas del mundo real . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 8 9 4. Búsqueda en profundidad 4.1. Evaluación de una búsqueda . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2. La técnica de búsqueda primero en profundidad . . . . . . . . . . . . . . . . . . . . . . . . 11 11 12 5. Búsqueda en amplitud 5.1. La técnica de búsqueda primero en amplitud . . . . . . . . . . . . . . . . . . . . . . . . . 16 16 6. Búsqueda con retroceso(Backtracking) 6.1. La técnica de búsqueda con retroceso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 18 7. Búsqueda primero el mejor 7.1. La técnica de búsqueda primero el mejor . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 20 8. Búsqueda A* 8.1. La técnica de búsqueda A-Estrella(A*) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 23 9. Búsqueda Minimax 9.1. La técnica de búsqueda Minimax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 25 Conclusión 27 Apéndices 29 i Índice de Tablas R . . . . . . . . . . . . . . . 4.1. Distancias aproximadas entre terminales de la línea ADO-GL 12 9.1. Tabla comparativa de estrategias de búsqueda en espacios de estados . . . . . . . . . . . . 9.2. Tabla de las posibles combinaciones de tres objetos . . . . . . . . . . . . . . . . . . . . . . 27 31 ii Índice de figuras 1.1. Plano de casa del problema de las llaves perdidas . . . . . . . . . . . . . . . . . . . . . . . . . 1.2. Grafo del camino solución para encontrar las llaves perdidas . . . . . . . . . . . . . . . . . . . 4.1. 4.2. 4.3. 4.4. 1 2 R Rutas de la línea de autobuses ADO-GL . . . . . . . . . . . . . . . . . . . . . . . . . . . . R Árbol parcial de rutas de ADO-GL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Representación de la estructura de pila del problema del agente de viajes . . . . . . . . . . . . . Representación de la estructura de pila del problema del agente de viajes al agregar los estados sucesores de la terminal Salina Cruz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.5. Continuación de la representación de la estructura de pila del problema del agente de viaje para llegar a Ciudad Reynosa, este procedimiento puede seguir el camino que se muestra en la figura 4.2 13 14 14 5.1. Representación de la estructura de cola del problema del agente de viajes . . . . . . . . . . . . 5.2. Representación de la estructura de cola del problema del agente de viajes al agregar los estados sucesores de la terminal Salina Cruz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.3. Continuación de la representación de la estructura de cola del problema del agente de viaje para llegar a Ciudad Reynosa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 17 6.1. Representación de la estructura de árbol para solución por búsqueda con retroceso . . . . . . . . 19 7.1. Representación de la estructura de cola con prioridad del problema del agente de viajes . . . . . 7.2. Representación de la estructura de cola con prioridad del problema del agente de viajes al agregar los estados sucesores de la terminal Salina Cruz . . . . . . . . . . . . . . . . . . . . . . . . . . 7.3. Continuación de la representación de la estructura de cola con prioridad del problema del agente de viaje para llegar a Ciudad Reynosa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 8.1. Representación de la estructura de cola con prioridad del problema del agente de viajes para la estrategia A* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.2. Representación de la estructura de cola con prioridad del problema del agente de viajes al agregar los estados sucesores de la terminal Salina Cruz para la estrategia A* . . . . . . . . . . . . . . 8.3. Continuación de la representación de la estructura de cola con prioridad del problema del agente de viaje para llegar a Ciudad Reynosa para la estrategia A* . . . . . . . . . . . . . . . . . . . 15 15 17 21 21 24 24 24 9.1. Un árbol de juegos de dos capas. Los nodos ∆ son nodos MAX, en los que le toca mover a MAX, y los nodos ∇ son nodos MIN. Los nodos terminales muestran los valores de utilidad para MAX; los otros nodos son etiquetados por sus valores minimax. El mejor movimiento de MAX en la raíz es a1 , porque conduce al sucesor con el valor minimax más alto, y la mejor respuesta de MIN es b1 , porque conduce al sucesor con el valor minimax más bajo. . . . . . . . . . . . . . . . . iii 26 Sección 1 Introducción La resolución de problemas es fundamental para la mayoría de las aplicaciones de Inteligencia Artificial(IA). De hecho, la capacidad de resolver problemas suele usarse como una medida de la inteligencia tanto para el ser humano como para la computadora. Hay principalmente dos clases de problemas. Una primera clase puede ser resuelta usando algún tipo de procedimiento determinista cuyo éxito esté garantizado. A este procedimiento se le llama de computación. La resolución por computación normalmente sólo se aplica a aquellos tipos de problemas para los que existan tales procedimientos, como en matemáticas. Se puede con frecuencia traducir los métodos usados para resolver estos problemas de manera fácil, a un algoritmo que pueda ser ejecutado por una computadora. No obstante, a pesar de que pocos problemas reales se prestan a soluciones computables, deben ser situados en la segunda categoría, que consiste en problemas que se resuelven con la búsqueda de una solución. Este es el método de resolución de problemas del que se preocupa la IA. Figura 1.1: Plano de casa del problema de las llaves perdidas Por ejemplo, imagine que ha perdido las llaves de su coche. Sabe que están en algún lugar de la casa, cuyo plano esta en la figura 1.1 La X indica que usted está en la puerta principal. Al empezar su búsqueda primero comprueba la sala de estar. Luego va por el salón hacia el primer dormitorio, después vuelve al salón y va al segundo dormitorio, y vuele de nuevo al salón para ir al dormitorio principal. Como aún no ha encontrado las llaves, vuelve hacia atrás pasando por la sala de estar hacia la cocina, donde encontrará sus llaves. La figura 1.2 presenta un grafo del camino que se ha seguido. El hecho de que pueda representar la solución a esta clase de problemas en forma de grafos es importante 1 Figura 1.2: Grafo del camino solución para encontrar las llaves perdidas porque le ofrece una forma sencilla de observar cómo funcionan las diferentes técnicas de búsqueda [6]. Para entender este tema es necesario tener presente las siguientes definiciones: Un estado es la representación de un problema en un instante dado. Para definir el espacio de estados o espacio de búsqueda(El conjunto de todos los nodos) no es necesario hacer una exhaustiva enumeración de todos los estado válidos, sino que es posible definirlo de manera más general. El estado inicial consiste en uno o varios estados en los que puede comenzar el problema. El estado objetivo o estado meta consiste en uno o varios estados finales que se consideran solución aceptable. Las reglas describen las acciones u operadores que posibilitan un pasaje de estados. Podríamos decir que una regla tiene una parte izquierda y una derecha. La parte izquierda determina la aplicabilidad de la regla, es decir, describe los estados a los que puede aplicarse la regla. La parte derecha describe la operación que se lleva a cabo si se aplica la regla(acción). La heurística es la información acerca de la posibilidad de que un nodo específico sea mejor para intentar la próxima elección que cualquier otro nodo. El camino solución es el grafo dirigido de los nodos visitados que nos llevan a la solución. Por ejemplo, en el problema de jugar al ajedrez: Espacio de estados: La totalidad de tableros que se pueden generar en un juego de ajedrez; ` Estado Inicial: Puede ser el tablero de 8 x 8 donde cada cuadro contiene un símbolo(p.ej. corresponde a Torre) de acuerdo a las piezas situadas. Objetivo o estado final: Cualquier posición de tablero en la que el contrario no puede realizar ningún movimiento legal y su rey esté amenazado; Reglas: Son los movimientos legales, que pueden describirse mediante una parte patrón para ser contrastado con la posición actual del tablero y otra parte que describe el cambio que debe producirse en el tablero. Dado que escribir todas las posiciones del tablero, las reglas deben escribirse de manera más general posible. Heurística: Podemos elegir tableros en donde el contrincante tenga el menor número de piezas desplegadas. Camino solución: El conjunto de movimientos para llegar al estado final. La búsqueda de una solución no es tan simple como empezar en el principio y seguir su camino hasta su conclusión. En un caso extremadamente simple de las llaves perdidas, este método de búsqueda es una buena manera de llevarlo a cabo. No obstante, en la mayoría de los problemas en los que quiera usar una computadora para hallar la solución, la situación es diferente. Generalmente, usará una computadora para resolver problemas en los que le número de nodos en el espacio de búsqueda sea muy grande y, como 2 el espacio de búsqueda va creciendo, de igual modo se incrementarán el número de diferentes caminos posibles hasta la meta. El problema estriba en que cada nodo añadido al espacio de búsqueda añade más de un camino; por lo que el número de caminos hasta la meta se incrementará rápidamente con cada nuevo nodo(para mejor explicación véase Explosión combinatoria en el anexo ). Debido a que el número de posibilidades crece tan rápidamente, tan sólo los problemas más simples se prestan a búsquedas exhaustivas( Una búsqueda exhaustiva examina todos los nodos). Mientras que la técnica exhaustiva, o de fuerza bruta, teóricamente siempre funciona, normalmente no es práctica porque consume o demasiado tiempo o demasiado recursos de computación, e incluso ambos. Por esa razón, otras técnicas de búsqueda han sido desarrolladas. En la primera sección veremos los puntos básicos para formular y resolver problemas relacionados con la Inteligencia Artificial. Continuaremos con algunos problemas de juego con los cuales se han probado la eficiencia y eficacia de diversos algoritmos de IA, así como también algunos problemas reales en los que se haya aplicado las técnicas de búsqueda en IA. En las siguientes seis secciones veremos las principales técnicas de búsqueda informada y no informada que existen en la literatura. En la última sección se dará una breve conclusión de la unidad. 3 Sección 2 Formulación y resolución de problemas. Para construir un sistema de computación que resuelva un problema específico, es necesario: Definir el problema formalmente con precisión. Analizar el problema. Representar el conocimiento necesario para resolver el problema. Elegir una técnica de resolución del problema y aplicarla. 2.1. Definición formal del problema El primer paso para diseñar un programa que resuelva un problema es crear una descripción formal y manejable del propio problema. Sería adecuado contar con programas que produzcan descripciones formales a partir de descripciones informales, proceso denominado operacionalización. Dado que por ahora no se conoce la forma de construir estos programas este proceso debe hacerse manualmente. Hay problemas que por ser artificiales y estructurados son fáciles de especificar (por ej. el ajedrez, el problema de las jarras de agua, etc. ). Otros problemas naturales, como por ej. la comprensión del lenguaje, no son tan sencillos de especificar(véase sección 3). Para producir una especificación formal de un problema se deben definir: espacio de estados válidos. estado inicial del problema. estado objetivo o final. reglas que se pueden aplicar para pasar de un estado a otro. La representación como espacio de estados forma parte de la mayoría de los métodos de Inteligencia Artificial(IA)[7]. Su estructura se corresponde con la resolución de problemas porque: Permite definir formalmente el problema, mediante la necesidad de convertir una situación dada en una situación deseada mediante un conjunto de operaciones permitidas; Permite definir el proceso de resolución de un problema como una combinación de técnicas conocidas y búsqueda(la técnica general de exploración del espacio intenta encontrar alguna ruta desde el estado actual hasta un estado objetivo). 4 2.2. Análisis del problema Luego de definir el problema formalmente, el segundo paso en la resolución del problema es el análisis del mismo. A fin de poder elegir el método más apropiado para resolver un problema particular, es necesario analizar distintas cuestiones que afectan a la definición del mismo y a las caracterśticas de la solución deseada. Existen varias preguntas a responder acerca del problema: ¿Puede descomponerse el problema en subproblemas más pequeños? ¿Pueden deshacerse pasos inadecuados hacia la solución? ¿Es predecible el universo del problema? ¿Una solución es buena de manera absoluta o relativa? ¿La solución deseada es un estado o la ruta hacia un estado? ¿El conocimiento se necesita para resolver el problema o para restringir la búsqueda de la solución? El programa que soluciona el problema ¿busca la solución solo o necesita interactuar con una persona? ¿Puede descomponerse el problema en subproblemas más pequeños? Algunos problemas pueden descomponerse en subproblemas independientes, de manera que encontrar una solución global es la composición de soluciones particulares. Por ej. en la resolución de integrales, una integral puede descomponerse por partes, y resolver las partes simples directamente o descomponerlas recursivamente. Por otra parte, existen otros problemas que no pueden descomponerse y componer la solución a partir de las soluciones parciales de sus partes p. ej. problemas de planificación de rutas con restricciones o el mundo de los bloques. Por el contrario, una solución necesita considerar globalmente el problema. ¿Pueden deshacerse pasos inadecuados hacia la solución? Algunos problemas permiten deshacer uno o varios pasos hacia una solución una vez realizados(véase también la sección 6). En este aspecto, existen tres categorías en las que puede dividirse un problema: Recuperables: en un punto dado es posible deshacer todos los pasos inadecuados hacia la solución. Por ej. en el juego 8-puzzle. La estructura de control se implementa con una pila en la que se almacenan las decisiones para poder volver atrás. No recuperables: en un punto dado no es posible deshacer ningún paso realizado. Por ej. en una partida de ajedrez no se puede volver atrás una vez movidas las piezas. En estos problemas el sistema debe esforzarse en la toma de decisiones pues éstas son irrevocables. Algunos usan una planificación en la que se analiza por adelantado una secuencia de pasos antes de realizar el primer paso para descubrir a donde conduce. Ignorables: en un punto dado es posible ignorar los pasos realizados hasta el momento y comenzar de nuevo con una nueva solución. Por ej. un demostrador de teoremas puede abandonar una demostración basada en un lema dado y comenzar nuevamente. Estos problemas se resuelven con estrategias de control sencillas que nunca vuelven hacia atrás. ¿Es predecible el universo del problema? Los problemas pueden ser de: 5 Consecuencia cierta: es posible planificar una secuencia de movimientos estando seguros del resultado a obtener. Se puede realizar una planificación para generar operadores que garanticen llegar a la solución. Consecuencia incierta:no es posible planificar con certeza pues no se sabe que ocurrirá luego del siguiente movimiento. Sin embargo, se puede realizar una planificación para generar operadores que tengan una buena probabilidad de llegar a la solución. Los problemas más difíciles de resolver son los no recuperables de consecuencia incierta. Por ej. el control del brazo de un robot: es de consecuencia incierta pues alguien puede interponer un objeto en la ruta del brazo, se puede atascar, etc. ¿Una solución es buena de manera absoluta o relativa? La solución de un problema puede consistir en encontrar: Algún camino: sólo importa encontrar una solución sin importar si existen otros caminos que conducen a la solución. Generalmente se resuelven con heurísticas. Por ej. programa de respuestas a preguntas. El mejor camino: importa encontrar la ruta más corta hacia la solución. Son problemas más complicados de computar. Algunos requieren una búsqueda más exhaustiva que usando heurísticas. Por ej. en el problema del viajero importa encontrar la ruta más corta entre las ciudades a visitar. ¿La solución deseada es un estado o la ruta hacia un estado? La solución de un problema puede consistir en encontrar: Un estado final: no es necesario el registro del proceso seguido, sólo importa arribar a la solución final. Por ej. interpretar texto. Una ruta hacia un estado final: se necesita dar el camino seguido desde el estado inicial al estado final. Por ej. problema de las jarras de agua. ¿El conocimiento se necesita para resolver el problema o para restringir la búsqueda de la solución? El conocimiento puede emplearse para: Reconocer la solución: se necesita gran cantidad de conocimiento acerca del problema para poder encontrar una solución. Por ej. comprensión de texto. Acotar la búsqueda: la solución básica puede encontrarse con poco conocimiento, pero para restringir el árbol de búsqueda y encontrar la solución de manera más eficiente es necesario contar más conocimiento. Por ej. en el ajedrez se necesita básicamente poco conocimiento para conocer los movimientos legales y un mecanismo sencillo de búsqueda. Pero dado que para aumentar la eficiencia de la búsqueda ésta debe restringirse, se necesita conocimiento de heurísticas de buenas estrategias y tácticas para jugar. El programa que soluciona el problema ¿busca la solución solo o necesita interactuar con una persona? Con respecto a la relación programa-usuario, existen dos tipos de programas que solucionan el problema: Solitarios: reciben como entrada el problema y dan como salida la solución. No importa el razonamiento que haya seguido la máquina para encontrar la solución. Por ej. problema de las jarras de agua. 6 Conversacionales: existe una comunicación hombre-máquina de manera que el usuario puede ayudar a la máquina o la máquina puede informar al usuario durante la búsqueda de la solución. Para que esta comunicación sea posible debe existir una correspondencia entre el razonamiento seguido por la máquina y la forma de razonamiento humano. Por ej. en un sistema experto de diagnóstico médico, el usuario no aceptaría el veredicto de una máquina si no puede comprender el razonamiento que la llevó a él . 7 Sección 3 Problemas de juego y problemas reales. Existen dos tipos de problemas que se han estado investigando en el área de Inteligencia Artificial: Los denominados problemas de juguete y problemas del mundo real[1]. 3.1. Problemas de juguete Un problema de juguete se utiliza para ilustrar o ejercitar los métodos de resolución de problemas. Éstos se pueden describir de forma exacta y concisa. Esto significa que diferentes investigadores pueden utilizarlos fácilmente para comparar el funcionamiento de los algoritmos. Un problema del mundo real es aquel en el que la gente se preocupa por sus soluciones. Ellos tienden a no tener una sola descripción, sin embargo se podría dar la forma general de sus formulaciones. El mundo de la aspiradora es un problema de juguete, como se vio en la sección previa(Sección 2) este problema puede formularse como sigue: Espacio de estados: La aspiradora está en una de dos habitaciones, cada una de lass cuales puede o no contener suciedad(8 posibles estados del mundo); Estado Inicial: Cualquier estado puede designarse como un estado inicial. Objetivo o estado final: Cuando todos las habitaciones están limpias; Reglas: La aspiradora puede: moverse a la habitación izquierda, moverse a la habitación derecha o aspirar la habitación. Comparado con el mundo real, este problema de juguete tiene localizaciones discretas(esta o no en una habitación), suciedad discreta(esta limpio o no lo esta, no existe el termino medio), nunca se ensucia una vez que se ha limpiado(suponemos que mientras esta limpiando la habitación no se esta volviendo a ensuciar). El 8-puzle consiste en un tablero de 3 x 3 con ocho fichas numeradas y un espacio en blanco. Una ficha adyacente al espacio en blanco puede deslizarse a éste. La meta es alcanzar el estado objetivo especificado. La formulación de este problema podría ser: Espacio de estados: La descripción de un estado especifica la localización de cada una de las ocho fichas y el blanco en cada uno de los nueve cuadrados; Estado Inicial: cualquier estado puede ser un estado inicial. 8 Objetivo o estado final: Cualquier conjunto de configuraciones puede ser el objetivo; Reglas: Mover el blanco a la izquierda, a la derecha, arriba o abajo. En este juego no hemos considerado acciones como la de sacudir el tablero cuando las piezas no se puedan mover, o que se puedan extraer las piezas con un cuchillo y volverlas a poner. El 8-puzle pertenece a la familia de puzles con piezas deslizantes, los cuales a menudo se usan como problemas de prueba para los nuevos algoritmos de IA. El Problema de las 8 reinas consiste en colocar las ocho reinas en un tablero de ajedrez de manera que cada reina no ataque a ninguna otra(Una reina ataca alguna pieza si está en la misma fila, columna o diagonal). Para este problema existen dos principales formulaciones. Una formulación incremental que implica a operadores que aumenten la descripción del estado, comenzando con un estado vacío; esto significa que cada acción añade una reina al estado. Una formulación completa de estados comienza con las ocho reinas en el tablero y las mueve. Espacio de estados: La totalidad de tableros que se pueden generar con 8 reinas en el tablero; Estado Inicial: Un tablero donde esta una reina por columna. Objetivo o estado final: Un tablero de manera que cada reina no ataque a ninguna otra; Reglas: Mover una reina a otro cuadro en la misma columna. 3.2. Problemas del mundo real Los problemas de búsqueda de una ruta están definidos en términos de posiciones y transiciones a lo largo de ellas. Los algoritmos de búsqueda de rutas de han utilizando en una variedad de aplicaciones, tales como rutas en redes de computadores, planificación de operaciones militares, y en sistemas de planificación de viajes de líneas aéreas. Estos problemas son complejos de especificar[2]. Por ejemplo, los sistemas comerciales de viajes utilizan formulaciones con muchas complicaciones como son el precio que imponen las líneas aéreas. Además deben incluir planes de contingencia(tales como reserva de vuelos alternativos) hasta el punto de que éstos estén justificados por el coste y la probabilidad de la falla en el plan original. Los problemas turísticos están estrechamente relacionados con los problemas de búsqueda de una ruta, pero con una importante diferencia, el espacio de estados, en este cada estado debe incluir las ciudades que ha visitado (para conocer si ha visitado ya las demáas ciudades). El problema del viajante de comercio es un problema de ruta en la que cada ciudad es visitada exactamente una vez.La tarea principal es encontrar el viaje más corto. Un problema de distribución VLSI requiere la colocación de millones de componentes y de conexiones en un chip verificando que el área es mínima, que se reduce al mínimo el circuito, que se reduce al mínimo las capacitaciones, y se maximiza la producción de fabricación. El problema de la distribución viene después de la fase de diseño lógico, y está dividido generalmente en dos partes: distribución de celdas y dirección del canal. En la distribución de celdas, los componentes primitivos del circuito se agrupan en las celdas, cada una de las cuales realiza una cierta función. Cada celda tiene una característica fija(el tamaño y la forma) y requiere un cierto número de conexiones a cada una de las otras celdas. El objetivo principal es colocar las celdas en el chip de manera que no se superpongan y que quede espacio para que los alambres que conectan celdas puedan colocarse entre ellas. La dirección del canal encuentra una ruta específica para cada alambre por los espacios entre las celdas. 9 La navegación de un robot es una generalización del problema de encontrar una ruta. Más que un conjunto discreto de rutas, un robot puede moverse en un espacio continuo con un conjunto infinito de acciones y estados posibles. Para un robot circular que se mueve en una superficie plana, el espacio es esencialmente de dos dimensiones. Cuando el robot tiene manos y piernas o ruedas que se deben controlar también, el espacio de búsqueda llega a ser de muchas dimensiones[1][2]. La secuenciación para el ensamblaje automático por un robot de objetos complejos son factibles. En los problema de ensamblaje, lo principal es encontrar el orden en los objetos a ensamblar. Si se elige un orden equivocado, no habrá forma de añadir posteriormente una parte de la secuencia sin deshacer el trabajo ya hecho. Verificar un paso para la viabilidad de la sucesión es un problema de búsqueda geométrico difícil muy relacionado con la navegación del robot. Así, la generación de sucesores legales es la parte costosa de la secuenciación para el ensamblaje. El diseño de proteínas, es otro problema de ensamblaje en el que el objetivo es encontrar una secuencia de aminoácidos que se plegarán en una proteína de tres dimensiones con las propiedades adecuadas para curar alguna enfermedad. 10 Sección 4 Búsqueda en profundidad 4.1. Evaluación de una búsqueda La evaluación de la eficiencia de una técnica de búsqueda esta fuera del alcance de este curso ya que puede ser muy complicada. De hecho, esta evaluación se lleva gran parte de la investigación en IA. Sin embargo, veremos dos medidas elementales que son importantes para obtener una idea de las ventajas y desventajas de utilizar una u otra técnica: 1. La rápidez con que se encuentra la solución. 2. La calidad de la solución. Hay varios tipos de problemas para los cuales lo principal es encontrar una solución con el mínimo esfuerzo. Para ese tipo de problemas, la primera medida es importante. Sin embargo, en otras situaciones, lo más importante es que la solución sea lo más aproximado a una solución óptima. Tanto la longitud del camino para la solución como el número real de nodos que atraviesa, determina la velocidad de búsqueda. Es importante entender la diferencia entre encontrar una solución óptima y una solución buena. La diferencia radica en el hecho de que encontrar una solución óptima a menudo nos exige una búsqueda exhaustiva porque puede que sea este el único camino para determinar si hemos encontrado o no la mejor solución. No obstante, encontrar una buena solución significa encontrar una que esté inmersa en un conjunto de restricciones(sin importar si hay o no una mejor solución) Describiremos un ejemplo que utilizaremos en varias de las técnicas de búsqueda que veremos en las siguientes secciones. Se trata del problema de un agente de viajes. Imagine que usted es agente de viajes y un cliente bastante molesto quiere que le reserve un boleto de Salina Cruz a Ciudad Reynosa con la línea R A pesar de que usted le dice al cliente que la línea de autobuses ADO GLno R de autobuses ADO-GL. R Mirando la lista(supuesta) de tiene rutas directas, éste insiste en viajar exclusivamente con ADO-GL. R encuentra que es posible(véase tabla 4.1). rutas de ADO-GL, Entonces puede verse que hay una forma de llegar de Salina Cruz a Ciudad Reynosa con la línea de R autobuses ADO-GLusando trasbordos. Así pues reserva un boleto para el cliente. R La información extraída del libro de rutas del ADO-GLpuede ser trasladada al grafo no dirigido mostrado en la figura 4.1. Puede encontrarse la información de las rutas más fácil si se dibuja de nuevo el grafo como un árbol, como se muestra en la figura 4.2. Ciudad Reynosa, aparece en un círculo, y algunas ciudades no aparecen en el árbol para simplificar su construcción. 11 R Tabla 4.1: Distancias aproximadas entre terminales de la línea ADO-GL Origen Salina Cruz Tehuantepec Juchitán Juchitán Ixtepec Juchitán Tonalá Pijijiapan Huixtla Tonalá Tuxtla Gutiérrez Comitán San Cristóbal Ocosingo Palenque Salina Cruz Huatulco Oaxaca Villahermosa Villahermosa Ciudad del Carmen Campeche Mérida Cancún Playa del Carmen Campeche Cárdenas Coatzacoalcos Minatitlán Acayucan Acayucan Cordoba Orizaba Puebla Acayucan Veracruz Veracruz Poza Rica Tuxpan Tampico Matamoros 4.2. Destino Tehuantepec Oaxaca Tehuantepec Ixtepec Ixtaltepec Tonalá Pijijiapan Huixtla Tapachula Tuxtla Gutiérrez Villahermosa San Cristóbal Ocosingo Palenque Villahermosa Huatulco Puerto Escondido Puebla Cárdenas Ciudad del Carmen Campeche Mérida Cancún Playa del Carmen Chetumal Chetumal Coatzacoalcos Minatitlán Acayucan Cordoba Juchitan Orizaba Puebla Ciudad de México Veracruz Xalapa Poza Rica Tuxpan Tampico Matamoros Reynosa Distancia 23 Kms 248 Kms 26 Kms 19 Kms 4 Kms 172 Kms 76 Kms 93 Kms 42 Kms 173 Kms 252 Kms 88 Kms 88 Kms 103 Kms 145 Kms 153 Kms 106 Kms 342 Kms 49 Kms 170 Kms 206 Kms 174 Kms 310 Kms 68 Kms 328 Kms 372 Kms 128 Kms 22 Kms 52 Kms 251 Kms 206 Kms 26 Kms 149 Kms 124 Kms 255 Kms 102 Kms 249 Kms 52 Kms 180 Kms 508 Kms 86 Kms Kms en línea recta de Origen a Ciudad Reynosa 1181 Kms 1160 Kms 1120 kms 1120 Kms 1115 Kms 1120 Kms 1240 Kms 1300 Kms 1340 Kms 1240 Kms 1237 Kms 1296 Kms 1260 Kms 1242 Kms 1200 Kms 1181 Kms 1175 Kms 1022 Kms 1077 Kms 1077 Kms 1120 Kms 1178 Kms 1172 Kms 1378 Kms 1350 Kms 1168 Kms 930 Kms 1040 Kms 1050 Kms 1100 Kms 1100 Kms 758 Kms 770 Kms 804 Kms 1100 Kms 915 Kms 915 Kms 720 Kms 690 Kms 420 Kms 84 Kms La técnica de búsqueda primero en profundidad Una búsqueda primero en profundidad explora cada camino posible hasta su conclusión(meta) antes de intentar otro camino. Esta técnica de búsqueda pertenece a las estrategias de búsqueda no informada, es decir la búsqueda no utiliza más que la información proporcionada por la definición del problema. En cambio existen otros tipos de búsqueda(véase por ejemplo sección 7) en la cual las estrategias saben si un estado no objetivo es mas prometedor que otro, a este último se le conoce como búsquedas informadas o búsquedas heurísticas[1]. Esta estrategia de búsqueda en profundidad puede implementarse a través de una estructura de tipo pila(último en entrar primero en salir) o alternativamente puede aplicarse como una función recursiva que se llama en cada uno de sus hijos. La búsqueda primero en profundidad tiene unos requisitos muy modestos de memoria. Necesita almacenar sólo un camino desde la raíz a un nodo hoja, junto con los nodos hermanos restantes no expandidos para cada nodo del camino. Una vez que un nodo se ha expandido, se puede quitar de la memoria tan pronto como todos sus descendientes han sido explorados. 12 R Figura 4.1: Rutas de la línea de autobuses ADO-GL El inconveniente de la búsqueda primero en profundidad es que puede hacer una elección equivocada y obtener un camino muy largo(o infinito) a un cuando una elección diferente llevaría a una solución cerca de la raíz del árbol de búsqueda. Utilicemos como ejemplo el problema descrito anteriormente, el problema del agente de viajes, si queremos llegar de Salina Cruz a Ciudad Reynosa, y para simplificar el problema, suponemos que no hay perdida de tiempo entre trasbordo y trasbordo. La formulación de nuestro problema es de la siguiente manera: R Espacio de estados: Todas las terminales de ADO-GL Estado Inicial: La terminal de Salina Cruz Objetivo o estado final: La terminal de Ciudad Reynosa; Reglas: Moverse a alguna ciudad adyacente desde la terminal en la que se encuentre el cliente en ese momento Si tenemos una estructura de datos de tipo pila para implementar esta estrategia de búsqueda: 1. Primero agregamos el estado inicial, en este caso Salina Cruz, y nos queda la estructura de pila como se muestra en la figura 4.3, 2. el siguiente paso es verificar si el elemento tope de la estructura de pila es el estado objetivo, en caso de serlo la búsqueda termina, porque encontramos lo que buscábamos, sin embargo si no es el caso, como en este ejemplo que vamos a Ciudad Reynosa, entonces procedemos a eliminar(pop) este elemento de la estructura de pila, 3. y agregamos(push) todos las terminales desde la que podemos llegar desde el estado en que nos encontramos, véase figura 4.4(desde la terminal actual, obteniendo los estados sucesores, por conveniencia omití agregar una terminal de la que parti en una iteración anterior) y volvemos a realizar el paso 2 hasta encontrar lo que buscamos, véase figura 4.5 Notese que si en el tope de la pila nos queda una terminal que no nos lleva directamente por el camino correcto hacia el objetivo, ocurre que: 13 R Figura 4.2: Árbol parcial de rutas de ADO-GL Se llegue al objetivo, pero con un recorrido más largo, al pasar por terminales que están a mayor distancia Puede que nunca lleguemos al objetivo, porque puede formarse ciclos infinitos como ir de IxtepecJuchitán, y después ir de Juchitán-Ixtepec, así sucesivamente por lo que la implementación para este problema en el cuál el grafo es no dirigido, producirá ciclos infinitos muy probablemente, una forma de evitar esta deficiencia es almacenar en memoria todas los estados ya visitados, y antes de agregar a la estructura de pila un nuevo estado comparar si ya han sido visitados. Figura 4.3: Representación de la estructura de pila del problema del agente de viajes Existen variantes la búsqueda de primero en profundidad, tales como búsqueda hacia atrás (backtracking), búsqueda de profundidad limitada y búsqueda primero en profundidad con profundidad iterativa. Una ventaja de la búsqueda hacia atrás, es que utiliza todavía menos memoria, ya que sólo se genera un sucesor a la vez; cada nodo parcialmente expandido recuerda qué sucesor(un nodo hijo válido) se expande 14 Figura 4.4: Representación de la estructura de pila del problema del agente de viajes al agregar los estados sucesores de la terminal Salina Cruz Figura 4.5: Continuación de la representación de la estructura de pila del problema del agente de viaje para llegar a Ciudad Reynosa, este procedimiento puede seguir el camino que se muestra en la figura 4.2 a continuación. Además facilita aún otro ahorro de memoria: la idea de generar un sucesor modificando directamente la descripción actual del estado más que copiarlo. Esto reduce los requerimientos de memoria a solamente una descripción del estado y sus acciones correspondientes. Para hacer esto, se requiere poder deshacer cada modificación cuando volvemos hacia atrás para generar el siguiente sucesor, dicho de otra manera las operaciones deben ser reversibles(para mayor comprensión véase la sección 6). La siguiente variante, con profundidad limitada, consiste en aplicar un límite de profundidad l a la búsqueda de primero en profundidad. Es decir, los nodos a profundidad l se tratan como si no tuviera ningún sucesor. El límite de profundidad resuelve el problema del camino infinito. Sin embargo también agrega un inconveniente: si escogemos el valor de l menor a la profundidad necesaria para encontrar un posible nodo meta, no encontraremos la solución. Por ejemplo, si estuviéramos en un juego de ajedrez, y sabemos que el mínimo número de tiros para dar jaque mate es de 3(ganando las blancas), no podemos esperar que en un número de tiros(llamemosle l) menor a 3 terminemos el juego, es decir que no existe un camino para terminar el juego de ajedrez en menos de 3 tiros. La búsqueda con profundidad iterativa es una estrategia general, usada a menudo en combinación con la búsqueda primero en profundidad, la cual encuentra el mejor límite de profundidad. Esto se hace aumentando gradualmente el límite(primero 0, después 1, después 2, etc.) hasta que encontramos un objetivo. 15 Sección 5 Búsqueda en amplitud 5.1. La técnica de búsqueda primero en amplitud La búsqueda primero en amplitud o en anchura es una estrategia sencilla en la que se expande primero el nodo raíz, a continuación se expanden todos los sucesores del nodo raíz, después sus sucesores, etc. En general, se expanden todos los nodos a una profundidad en el árbol de búsqueda antes de expandir cualquier nodo del próximo nivel. La búsqueda primero en anchura se puede implementar utilizando una estructura de tipo cola primero en entrar primero en salir, asegurándose que los nodos primeros visitados serán los primeros expandidos. La principal desventaja de la búsqueda en anchura es los requisitos de memoria para almacenar todos los nodos que no han sido expandidos durante la búsqueda. Continuaremos con el ejemplo del problema del agente de viajes con la misma formulación vista en la búsqueda en profundidad. Si tenemos una estructura de datos de tipo cola para implementar esta estrategia de búsqueda: 1. Primero agregamos el estado inicial, en este caso Salina Cruz, y nos queda la estructura de cola como se muestra en la figura 5.1, 2. el siguiente paso es verificar si el elemento tope de la estructura de cola es el estado objetivo, en caso de serlo la búsqueda termina, porque encontramos lo que buscábamos, sin embargo si no es el caso, como en este ejemplo que vamos a Ciudad Reynosa, entonces procedemos a eliminar este elemento de la estructura de cola, 3. y agregamos todos las terminales desde la que podemos llegar desde el estado en que nos encontramos(por conveniencia omití agregar una terminal de la cual parti en una iteración anterior), veáse figura 5.2(desde la terminal actual, obteniendo los estados sucesores) y volvemos a realizar el paso 2 hasta encontrar lo que buscamos, véase figura 5.3 Notese que estamos recorriendo el camino por niveles en el árbol de la figura 4.2, por lo que esta estrategia tiene la ventaja, en comparación con la de búsqueda en profundidad, de que no se crean ciclos, ya que si llegará a ocurrir un camino Ixtepec-Juchitán ;Juchitán Ixtepec entonces cuando llegue a cierto número de repeticiones, y está sea igual al tamaño de la ruta solución, optará por la solución antes de continuar, por lo tanto encuentra un camino corto hacia el objetivo, a costa de la cantidad de estados que tiene que almacenar en cada nivel. Una variante de búsqueda en amplitud es la de costo uniforme, que consiste en expandir todos los nodos por costos. Si el costo es igual a la profundidad se tiene la búsqueda en amplitud. La búsqueda de costo uniforme encuentra la solución más barata si el costo nunca decrece al aumentar los caminos. 16 Figura 5.1: Representación de la estructura de cola del problema del agente de viajes Figura 5.2: Representación de la estructura de cola del problema del agente de viajes al agregar los estados sucesores de la terminal Salina Cruz Figura 5.3: Continuación de la representación de la estructura de cola del problema del agente de viaje para llegar a Ciudad Reynosa 17 Sección 6 Búsqueda con retroceso(Backtracking) 6.1. La técnica de búsqueda con retroceso Como vimos anteriormente esta técnica también es llamada búsqueda con vuelta atrás o backtracking, el término se utiliza para la búsqueda primero en profundidad que elige valores para una variable a la vez(sólo genera un sucesor a la vez) y vuele atrás cuando una variable no tiene ningún valor legal para asignarle. La idea es encontrar la mejor combinación en un momento determinado, por eso se dice que este tipo de algoritmo es una búsqueda en profundidad. Durante la búsqueda, si se encuentra una alternativa incorrecta, la búsqueda retrocede hasta el paso anterior y toma la siguiente alternativa. Cuando se han terminado las posibilidades, se vuelve a la elección anterior y se toma la siguiente opción. Si no hay mas alternativas la búsqueda falla. De esta manera, se crea un árbol implícito, el en que cada nodo es un estado de la solución. Normalmente, se suele implementar este tipo de algoritmos como un procedimiento recursivo. Así en cada llamada al procedimiento se toma una variable y se le asignan todos los valores posible, llamando a su vez al procedimiento para cada uno de los nuevos estados. Esta técnica es utilizadas en algunos problemas con satisfacción de restricciones, es decir problemas de búsqueda en los que haya que cumplir ciertas restricciones, y en caso de que no exista ya una salida en el camino elegido, entonces poder regresar a un estado anterior(puede verse como un comando Deshacer acción). También algunos lenguajes de programación en IA utilizan esta técnica para su funcionamiento(p. ej. PROLOG[8]). Una ventaja es el ahorro de memoria al expandir un nodo sucesor a la vez. Su desventaja es el no poder incluir información para evaluar cual de los sucesores es mejor. Para esta estrategia de búsqueda utilizaremos un ejemplo sencillo, dado un conjunto de números enteros (13,11,7), encontrar si existe algún subconjunto cuya suma sea exactamente 20. Este problema es posible resolverlo al decidir si cada vez que se añade un elemento del conjunto dado la suma es 20. Veamos la solución por medio de una representación de árbol. Los elementos del conjunto posibles están representados por valores, elemento1=13, elemento2=11, elemento3=7. La representación de la solución (s1,...,sm), donde m <= n y si ∈ 1, 2, 3. Cada nodo es una posible solución Será valida si la suma es 20. Cómo puede verse en la figura 6.1, el primer nodo tiene como suma actual cero, como no es el resultado búscado(valor 20), al seleccionar un elemento del conjunto, en este caso el elemento 1 que representa al 13, pasa al estado 2, con suma igual a 13, como este valor tampoco es el búscado pasa al estado 3, al agregar otro elemento del resto(puede ser elemento 2 o elemento 3), el elemento 2, por lo que su suma es 24, como no es lo que búscamos entonces procede a seleccionar otro elemento del conjunto restante, 18 solamente queda el elemento 3, con lo que pasa al estado 4, sin embargo la suma sigue siendo diferente de 20, y como no hay más elementos, entonces retrocede posicionandose en el estado 3 nuevamente, como en ese estado ya probó con el único elemento, vuelve a retroceder y pasa al estado 2, como le queda probar con el elemento 2, pasa al estado 5, y la suma en ese estado es igual a lo que buscamos por lo que el procedimiento termina. Figura 6.1: Representación de la estructura de árbol para solución por búsqueda con retroceso 19 Sección 7 Búsqueda primero el mejor 7.1. La técnica de búsqueda primero el mejor La búsqueda primero el mejor trata de expandir el nodo más cercano al objetivo, alegando que probablemente conduzca rápidamente a una solución. Esta técnica de búsqueda pertenece a las estrategias de búsqueda informada, ya que utilizan conocimiento específico del problema más allá de la definición del problema en sí mismo, por lo que puede encontrar soluciones de manera más eficiente que una estrategia de búsqueda no informada. La búsqueda voraz primero el mejor se parece a la búsqueda primero en profundidad en el modo que prefiere seguir un camino hacia el objetivo, pero volverá atrás cuando llegue a un callejón sin salida. La búsqueda primero el mejor selecciona un nodo para la expansión basada en una función de evaluación. Tradicionalmente, se selecciona en la expansión el nodo con la evaluación más baja, porque la evaluación mide la distancia al objetivo. Puede implementarse con una estructura de datos de tipo cola con prioridad, ordenados por su valor de evaluación en orden ascendente. Aunque el nombre de esta técnica parece venerable es inexacto, ya que si realmente pudiéramos expandir primero el mejor nodo, esto ya no sería una búsqueda en absoluto; sería una marcha directa al objetivo. Por lo tanto todo lo que podemos hacer es escoger el nodo que parece ser el mejor según la función de evaluación. Si la función de evaluación es exacta, entonces de verdad sería el mejor nodo; en realidad,la función de evaluación no será así, y puede dirigir la búsqueda por mal camino. Las funciones heurísticas son la forma más común de transmitir el conocimiento adicional del problema al algoritmo de búsqueda. Para ejemplificar esta técnica tomemos nuevamente el problema del agente de viajes, pero ahora tomando información adicional del problema, como es la distancia en línea recta que existe entre las terminales de origen y destino(Salina Cruz-Ciudad Reynosa), que se muestran en la tabla 4.1. Si tenemos una estructura de datos de tipo cola con prioridad para implementar esta estrategia de búsqueda: 1. Primero agregamos el estado inicial, en este caso Salina Cruz, y nos queda la estructura de cola con prioridad como se muestra en la figura 7.1, observe que debemos ordenar en orden ascendente con respecto a la distancia en línea recta entre terminales de origen y destino 2. el siguiente paso es verificar si el elemento tope de la estructura de cola con prioridad es el estado objetivo, en caso de serlo la búsqueda termina, porque encontramos lo que buscábamos, sin embargo si no es el caso, como en este ejemplo que vamos a Ciudad Reynosa, entonces procedemos a eliminar este elemento de la estructura de cola con prioridad, 3. y agregamos todos las terminales desde la que podemos llegar desde el estado en que nos encontramos, recuerde que deben agregarse en orden ascendente(notese que omití por conveniencia agregar 20 una terminal del cual parti en una iteración anterior), véase figura 7.2(desde la terminal actual, obteniendo los estados sucesores) y volvemos a realizar el paso 2 hasta encontrar lo que buscamos, véase figura 7.3 Note que utilizamos como valor heurístico la distancia en línea recta que existe entre Salina Cruz y Ciudad Reynosa, esta función consulta la tabla mostrada anteriormente(tabla 4.1), sin embargo si requerimos viajar a otra terminal o partir de otro origen, entonces necesitaríamos contar con una tabla de distancias de líneas rectas al destino diferente. No siempre es necesario de tablas, para obtener valores heurísticos, puede crearse una función heurística que reciba como parámetros el estado actual y el estado objetivo, y a partir de ello obtener un valor heurístico calculado con alguna ecuación, definir la heurística no es tarea fácil, requiere de un análisis complejo y detallado del problema[5]. Figura 7.1: Representación de la estructura de cola con prioridad del problema del agente de viajes Figura 7.2: Representación de la estructura de cola con prioridad del problema del agente de viajes al agregar los estados sucesores de la terminal Salina Cruz Figura 7.3: Continuación de la representación de la estructura de cola con prioridad del problema del agente de viaje para llegar a Ciudad Reynosa Una desventaja de esta estrategia de búsqueda es que puede caer en ciclos infinitos. Si no somos cuidadosos en encontrar los estados repetidos, la solución nunca se encontrará. En nuestro ejemplo estando en Puebla, si la distancia en línea recta de la Ciudad de México fuera menor a la distancia que hay desde Orizaba a Cordoba, entonces tomaría primero el camino a la Ciudad de México, al llegar ahí, como ya no habría otro camino para llegar a ciudad Reynosa regresaría a Puebla, y seleccionaría ir otra vez a Ciudad de México por tener una distancia más corta a la de los tres caminos posibles. Esto puede resolverse almacenando en memoria todas las terminales ya visitadas(Esto es lo que permite, por conveniencia, 21 agregar a las estructuras de datos manejadas en las estrategias de búsquedas, terminales de las cuales partimos en iteraciones anteriores). 22 Sección 8 Búsqueda A* 8.1. La técnica de búsqueda A-Estrella(A*) A la forma más ampliamente conocida de la búsqueda primero el mejor se le llama búsqueda A*(pronunciada: búsqueda A-Estrella). Evalúa los nodos combinando g(n) el coste para alcanzar el nodo y h(n) el coste de ir al nodo objetivo . f (n) = g(n) + h(n) (8.1) Ya que la g(n) nos da el coste del camino desde el nodo inicio al nodo n, y la h(n) el coste estimado del camino más barato desde n al objetivo, tenemos: f(n)= coste más barato estimado de la solución a través de n. Asi,́ si tratamos de encontrar la solución más barata, es razonable intentar primero el nodo con el valor más bajo de g(n) + h(n). Resulta que esta estrategia es más razonable. Para ejemplificar esta estrategia de búsqueda analicemos nuevamente el problema del agente de viajes, R tomando información adicional de la tabla de distancias entre las terminales de ADO-GL(véase tabla 4.1). Esta técnica puede ser implementada al igual que la búsqueda voraz primero el mejor, por medio de una cola con prioridad, sólamente la función heurística para obtener el valor de ordenamiento es la que cambia a la forma de la ecuación (8.1) 1. Primero agregamos el estado inicial, en este caso Salina Cruz, y nos queda la estructura de cola con prioridad como se muestra en la figura 8.1, observe que debemos ordenar en orden ascendente con respecto a la función heurística, en donde g(n) equivale a la distancia que existe entre las terminales(origen a terminal actual) Salina Cruz y Salina Cruz(0 Kms), y h(n) es la distancia en línea recta de(terminal actual a destino) Salina Cruz a Ciudad Reynosa(1181 Kms), por lo tanto f(n) es de 1181 2. el siguiente paso es verificar si el elemento tope de la estructura de cola con prioridad es el estado objetivo, en caso de serlo la búsqueda termina, porque encontramos lo que buscábamos, sin embargo si no es el caso, como en este ejemplo que vamos a Ciudad Reynosa, entonces procedemos a eliminar este elemento de la estructura de cola con prioridad, 3. y agregamos todos las terminales desde la que podemos llegar desde el estado en que nos encontramos, recuerde que deben agregarse en orden ascendente de los valores obtenidos de f(n)(notese que puedo regresar a una terminal ya visitada en una iteración anterior), véase figura 8.2(desde la terminal actual, obteniendo los estados sucesores) y volvemos a realizar el paso 2 hasta encontrar lo que buscamos, véase figura 8.3 23 Veamos otros ejemplos para calcular el valor heurístico, por ejemplo al estar en Salina Cruz, desde ahí se alcanza Tehuantepec y Huatulco, en el primer caso g(Salina Cruz-Tehuantepec) es de 23 Kms y h(Tehuantepec-Ciudad Reynosa) es de 1160 Kms por lo tanto f(Tehuantepec) es de 1183, véase figura 8.2. Para el caso de Huatulco, g(Salina Cruz- Huatulco) es de 153 Kms, y h(Huatulco-Ciudad Reynosa) es de 1175 Kms por lo tanto f(Huatulco) es de 1328 Kms. Cómo el menor coste lo tiene f(Tehuantepec) entonces al estar en Tehuantepec, desde ahí alcanzamos Juchitán, Salina Cruz(regresando a Salina Cruz de Nuevo) y Oaxaca, para el primer caso tenemos g(Salina Cruz-Juchitán) es de 49 Kms(23 Kms+26 Kms), y h(Juchitán- Ciudad Reynosa) es de 1120 Kms por lo tanto f(Juchitán) es de 1169 Kms, el siguiente caso estando en Tehuantepec regresar a Salina Cruz, entonces g(Salina Cruz a Salina Cruz) es de 46 Kms(23 Kms+23 Kms) y h(Salina Cruz-Ciudad Reynosa) es de 1181 Kms es 1206 Kms por lo tanto f(Salina Cruz) es de 1227 Kms. Así continuamos calculando para cada terminal alcanzada. Una ventaja de utilizar esta estrategia es la de que no se crean ciclos infinitos si existe una buena heurística, ya que se va acumulando el coste total del camino por lo que se descartan caminos muy largos. Por lo que siempre encontrará la solución siempre cuando exista dentro todo el espacio de búsqueda. Figura 8.1: Representación de la estructura de cola con prioridad del problema del agente de viajes para la estrategia A* Figura 8.2: Representación de la estructura de cola con prioridad del problema del agente de viajes al agregar los estados sucesores de la terminal Salina Cruz para la estrategia A* Figura 8.3: Continuación de la representación de la estructura de cola con prioridad del problema del agente de viaje para llegar a Ciudad Reynosa para la estrategia A* La estrategia de búsqueda A* es muy satisfactoria de entre todos los algoritmos vistos anteriormente, lamentablemente, no significa que A* sea la respuesta a todas nuestras necesidades de búsqueda. La dificultad es que, para la mayoría de los problemas, el número de nodos a expandir son exponenciales en longitud de la solución. El tiempo computacional no es, sin embargo, la desventaja principal de A*. Por lo general, se queda sin mucho espacio antes de que se quede sin tiempo. Por esta razón no es práctico para problemas grandes[1]. 24 Sección 9 Búsqueda Minimax 9.1. La técnica de búsqueda Minimax Existen entornos competitivos, en los cuales los objetivos de dos agentes están en conflictos, es decir cada agente trata de maximizar(beneficiar) su utilidad1 por lo que este tomara decisiones que minimicen la utilidad del otro(perjudicar), estos dan ocasión a problemas de búsqueda entre adversarios, a menudo conocido como juegos. En IA, los juegos son, por lo general, una clase más especializada (que los teóricos de juegos llaman juegos de suma cero, de dos jugadores, por turnos, determinista, de información perfecta). Por ejemplo, si un jugador gana un juego de ajedrez(+1), el otro jugador necesariamente pierde(-1). Esta oposición entre las funciones de utilidad de los agentes hace la situación entre adversarios[1]. En una estrategia de búsqueda MiniMax juego con dos jugadores, llamados MAX y MIN(se supone que los valores altos son buenos para MAX y malos para MIN), MAX mueve primero, y luego mueven por turno hasta que juego termina. Al final de juego, se conceden puntos al jugador ganador y penalizaciones al perdedor. El funcionamiento de Minimax puede resumirse como elegir el mejor movimiento para ti mismo suponiendo que tu contrincante escogerá el peor para ti. Este puede ser implementado de manera recursiva[2]. Para ejemplificar esta estrategia de búsqueda utilizaremos un problema más especifico, porque incluso un juego simple como el gato es demasiado complejo para dibujar el árbol de juegos entero. Definiremos por lo tanto un juego, en donde los movimientos posibles para MAX, en el nodo raíz, se etiquetan por a1 , a2 y a3 . Las respuestas posibles a a1 , para MIN, son b1 , b2 y b3 , etc. Este juego particular finaliza después de un movimiento para MAX y MIN. Las utilidades de los estados terminales en este juego varía desde dos a 14. Considerando un árbol de juegos, la estrategia óptima puede determinarse examinando el valor minimax de cada nodo, que escribimos como el VALOR-MINIMAX(n). El valor minimax de un nodo es la utilidad(para MAX) de estar en el estado correspondiente, asumiendo que ambos jugadores juegan óptimamente desde allí al final del juego. Obviamente, el valor minimax de un estado terminal es solamente su utilidad. Además, considerando una opción, MAX preferirá moverse aun estado de valor máximo, mientras que MIN prefiere un estado de valor mínimo. Entonces tenemos lo siguiente: VALOR-MINIMAX(n) es igual a UTILIDAD(n) Si n es un estado terminal maxs ∈ Sucesores(n) VALOR-MINIMAX(s) si n es un estado MAX mins ∈ Sucesores(n) VALOR-MINIMAX(s) si n es un estado MIN 1 Valor que sirve para preferir un estado en comparación con otro 25 Apliquemos estas definiciones al árbol de juegos de la figura 9.1. Los nodos terminales se etiquetan por sus valores de utilidad. El primer nodo de MIN, etiquetado B, tiene tres sucesores con valores 3,12 y 8, entonces su valor minimax es 3. Del mismo modo, los otros dos nodos de MIN tienen un valor minimax de 2. El nodo raíz es un nodo MAX; sus sucesores tienen valores minimax de 3,2 y 2; entonces tiene un valor minimax de 3. Podemos identificar también la decisión minimax en la raíz: la acción a1 es la opción óptima para MAX porque conduce al sucesor con el valor minimax más alto. Figura 9.1: Un árbol de juegos de dos capas. Los nodos ∆ son nodos MAX, en los que le toca mover a MAX, y los nodos ∇ son nodos MIN. Los nodos terminales muestran los valores de utilidad para MAX; los otros nodos son etiquetados por sus valores minimax. El mejor movimiento de MAX en la raíz es a1 , porque conduce al sucesor con el valor minimax más alto, y la mejor respuesta de MIN es b1 , porque conduce al sucesor con el valor minimax más bajo. Esta definición de juego óptimo para MAX supone que MIN también juega óptimamente, y si no lo hiciera MAX lo hará aún mejor. Sin embargo Minimax selecciona un movimiento óptimo en un árbol de búsqueda a condición de que las evaluaciones de los nodos hoja sean exactamente correctas. En realidad, las evaluaciones son generalmente estimaciones rudimentarias del valor de una posición y se consideran que tienen asociados errores grandes. Otro problema de minimax es que el número de estados que tiene que examinar es exponencial en el número de movimientos. Lamentablemente no se puede eliminar el exponente, pero si se podría dividirlo, con eficacia, en la mitad. La jugada es que es posible calcular la decisión minimax correcta sin mirar todos los nodos en el árbol de juegos. Es decir, podar el árbol. Esta técnica es conocida como poda-alfabeta. 26 Conclusión Las estrategias de búsquedas vistas en esta unidad nos dan una idea de cómo los investigadores en IA proponen diferentes formas de solución para los problemas. Estas técnicas son clásicas de la IA y es por ello que deben ser conocidas por todos aquellos que están relacionados con programación de soluciones por computadora. Existen otros métodos que requieren de mayor complejidad de programación para encontrar mejores soluciones en un tiempo razonable, como son el método de ascenso de la colina, recocido simulado, algoritmos géneticos, las redes neuronales. Todos ellos requieren de una mayor complejidad de computación y mayor conocimiento e información del problema. En la mayoría de las estrategias contempladas en el cápitulo, debe utilizarse médios para evitar estados repetidos, de esta forma se ahorrara espacio de almacenamiento y tiempo de recorrido. Tal y como lo dice Rusell-Norvig en su libro Los algoritmos que olvidan su historia están condenados a repetirla[1]. El mundo real es más complejo de lo que se formula en los problemas para solucionar por computadora, sin embargo asumimos que los seres humanos para encontrar soluciones tampoco requieren de mucha información, o al menos no requiere conocer todo el universo para encontrar soluciones buenas. Por ejemplo, no requerimos de mucha información, ni de mucho tiempo para seleccionar una botella de refresco que compramos en el supermercado. Esto justifica en parte lo que hacemos cuando reducimos nuestro problema. Aún cuando por su simplicidad sean problemas de juguete. Tabla 9.1: Tabla comparativa de estrategias de búsqueda en espacios de estados Búsqueda Profundidad Amplitud Con retroceso Primero el mejor A* Minimax fácil programación Ventajas Requisitos modestos de memoria; fácil implementación Encuentra la solución si existe dentro del espacio de búsqueda; fácil programación Menor requisito de memoria al de profundidad fácil programación Puede encontrar buenas soluciones; resultados más eficientes que una búsqueda no informada Encuentra buenas soluciones; No se crean ciclos requerimientos moderados de memoria Encuentra una solución óptima Puede retroceder en caso de no haber una salida Desventajas Puede tener ciclos infinitos y no encontrar el resultado Requiere de mucha memoria para almacenar los nodos Puede tener ciclos infinitos y no encontrar el resultado Puede tener ciclos infinitos; requiere diseño de una heurística complejidad de programación de la heurística; Requiere de muy buenas heurísticas Sólo funciona para juegos contra adversarios. Crece exponencialmente al número de movimientos Requiere de una muy buena función de evaluación En la tabla 9.1 se muestra una comparativa entre las estrategias de búsqueda descritas en esta unidad. Esta nos puede dar una idea rápida de cuál estrategia debemos utilizar al intentar resolver un problema de búsqueda en espacio de estados. 27 Es importante hacer mención que un ser humano no realiza búsquedas de este tipo en su mente. Porque un ser humano quizá necesitaría de minutos para crear y comprobar cada combinación o estado posible, y tendría una considerable dificultad para tener en mente cada paso del proceso de comprobación y las asignaciones que ha comprobado. Aún cuando utilizara papel y lápiz como apoyo, sería un proceso muy lento. Además un ser humano al pasar el tiempo, su calidad de trabajo disminuye, por lo que las soluciones que encuentra un ser humano son las optimas. Ahora la pregunta obligada, ¿Cómo solucionan este problema los seres humanos?, la respuesta esta siendo investigada dentro del campo de la IA, y esperemos que en un futuro no lejando encuentren la respuesta. 28 Apéndices Glosario Agente: Un agente inteligente es un sistema(hardware o software) situado en un determinado entorno, capaz de actuar de forma autónoma y razonada en dicho entorno para llevar a cabo unos objetivos predeterminados[4]. Árbol: estructura de datos ampliamente usada que imita la forma de un árbol (un conjunto de nodos conectados). Un nodo es la unidad sobre la que se construye el árbol y puede tener cero o más nodos hijos conectados a él. Se dice que un nodo a es padre de un nodo b si existe un enlace desde a hasta b (en ese caso, también decimos que b es hijo de a). Sólo puede haber un único nodo sin padres, que llamaremos raíz. Un nodo que no tiene hijos se conoce como hoja. Los demás nodos (tienen padre y uno o varios hijos) se les conoce como rama. Camino solución: Un grafo dirigido de los nodos visitados que nos llevan a la solución. Cola: es una estructura de datos, caracterizada por ser una secuencia de elementos en la que la operación de inserción push se realiza por un extremo y la operación de extracción pop por el otro. También se le llama estructura FIFO (del inglés First In First Out), debido a que el primer elemento en entrar será también el primero en salir. Cola de prioridades es una estructura de datos en la que los elementos se atienden en el orden indicado por una prioridad asociada a cada uno. Si varios elementos tienen la misma prioridad, se atenderán de modo convencional según la posición que ocupen. Estrategia de Búsqueda método computacional para resolver problemas. Grafo: es un par(V,A) donde V es un conjunto finito no vacío(conjunto de vértices) y A un conjunto finito de pares (V x V) no ordenados de vértices(conjunto de aristas). En otras palabras un grafo es un conjunto de objetos llamados vértices o nodos unidos por enlaces llamados aristas o arcos, que permiten representar relaciones binarias entre elementos de un conjunto. Heurística: Del griego heuriskein, encontrar. Criterio que puede resolver un problema pero que no hay garantía de que siempre lo resuelva. Estimación del coste necesario para alcanzar una solución desde el estado actual. Pila: es una lista ordinal o estructura de datos en la que el modo de acceso a sus elementos es de tipo LIFO (del inglés Last In First Out, último en entrar, primero en salir) que permite almacenar y recuperar datos. Se aplica en multitud de ocasiones en informática debido a su simplicidad y ordenación implícita en la propia estructura. Prolog: Lenguaje de programación ideado a principios de los años 70 en la universidad de AixMarseille por los profesores Alain Colmerauer y Phillipe Roussel. Prolog se enmarca en el paradigma de los lenguajes lógicos, lo que lo diferencia enormemente de otros lenguajes más populares tales como Fortran, Pascal, C, Java[8]. Puzle Un puzzle o puzle puede referirse a: Un rompecabezas, un juego en el que hay que armar una figura. 29 Un crucigrama o juego de palabras cruzadas. Un acertijo, especie de adivinanza. juego de ingenio, como el sudoku o el cubo de Rubik. 30 Anexo Explosiones combinatorias Generalmente, se utilizará una computadora para resolver problemas en los que el número de nodos en el espacio de búsqueda sea muy grande y, como el espacio de búsqueda va creciendo, de igual modo se incrementarán el número de diferentes caminos posibles hasta la meta. El problema estriba en que cada nodo añadido al espacio de búsqueda añade más de un camino; por lo que el número de caminos hasta la meta se incrementará rápidamente con cada nuevo nodo[6]. Para entender este incremento, considere el número de formas de combinar tres objeto( A, B, C) sobre una mesa. Las seis posibles combinaciones son las mostradas en la tabla 9.2 Tabla 9.2: Tabla de las posibles combinaciones de tres objetos A A B B C C B C C A B A C B A C A B Aunque puede comprobar rápidamente que estas son todas las formas de combinar(en términos de probabilidad son llamadas permutaciones de tres elementos tomadas de tres) A, B, C, puede obtener el mismo número usando el teorema de una de las ramas de las matemáticas llamada combinatoria, la cual estudia las distintas formas en que las cosas pueden ser combinadas, colocadas o permutadas. El teorema establece que el número de maneras en que N objetos pueden ser permutados es igual a N!(N factorial). El factorial de un número es el producto de todos los números iguales o menores a uno dado, hasta 1. Por tanto, 3! es 3 x 2 x 1, o 6. Dada esta información puede verse que , si usted tuviera 4 objetos para combinar, habría 4!, o 24, permutaciones. Con 5 objetos, el número es 120; con 6 objetos es 720. Así pues, con, por ejemplo, 1000 objetos, el número de permutaciones posibles es enorme. Si hay muchas posibilidades, se hace rápidamente imposible examinar, e incluso enumerar, todas las combinaciones[5]. Debido a que el número de posibilidades crece tan rápidamente, tan sólo los problemas más simples se prestan a búsquedas exhaustivas. Mientras que la técnica exhaustiva, o fuerza bruta, teóricamente siempre funciona, normalmente no es práctica porque consume o demasiado tiempo o demasiados recursos de computación, e incluso ambos. Por esa razón, otras técnicas de búsqueda han ido desarrollándose. 31 Bibliografía [1] Russell, Stuart J., Norvig, Peter., Inteligencia Artificial: Un enfoque moderno 2da Edición ., Prentice Hall, 2004. [2] Nilsson, Nils J., Artificial Intelligence: A New Synthesis, Morgan Kaufmann, 1998. [3] Mitchell, Tom., Machine Learning, McGraw Hill, 1997. [4] Wooldridge, Michael., An Introduction to MultiAgent Systems.,John Wiley & Sons., 2002. [5] Simon, Herbert A., Las ciencias de lo artificial, Comares., 2006. [6] Schild, H., Utilización de C en la Inteligencia Artificial. McGraw-Hill, 1988. [7] Colaboradores de Wikipedia. Inteligencia artificial [en línea]. Wikipedia, La enciclopedia libre, 2009 [fecha de consulta: 2 de enero del 2009]. Disponible en <http://es.wikipedia.org/w/index.php?title=Inteligencia_artificial&oldid=22986524>. [8] Colaboradores de Wikipedia. Prolog [en línea]. Wikipedia, dia libre, 2009 [fecha de consulta: 17 de enero del 2009]. <http://es.wikipedia.org/w/index.php?title=Prolog&oldid=23327196>. 32 La enciclopeDisponible en