TEMA 2. Búsqueda en Espacios de Estados Francisco José Ribadas Pena INTELIGENCIA ARTIFICIAL 5 Informática [email protected] 26 de septiembre de 2012 – FJRP ccia [Inteligencia Artificial] – 2.1 Concepto de Espacio de estados. Espacio de Estados: Formalimo para representar problemas. ideas clave: 1. Abstraer problemas reduciéndolos a un conjunto de estados y operadores. 2. Resolver problema revisando posibles alternativas (¿todas?). analogı́a con forma de actuar de los humanos Estado: • Representación completa de la situación del mundo/problema en un momento dado • Contiene toda la información relevante (y nada más) Operador: • Transforman un estado en otro • Se suponen deterministas ◦ se sabe de antemano cómo será el estado del mundo/problema despues de aplicarlos • Se suponen discretos ◦ no es relvante lo que “pasa” mientras se ejecutan – FJRP ccia [Inteligencia Artificial] – 1 2.1.1 Caracterización de un Problema PROBLEMA = Terna de 3 componentes (I, O, M ) 1. Estado/s inicial (I): Descripción de la situación de partida 2. Conjunto de operadores pertinentes (O): Descripción de los medios de los que disponemos para lograr el fin deseado Acciones que se pueden emprender, dado un estado, para alcanzar otro distino. Tienen 2 componentes: • precondiciones: condición que debe cumplir un estado para que pueda aplicarse el operador sobre él. • postcondiciones: descripción de las caracterı́sticas del nuevo estado al que se transita. Pueden ser interpretados como ”reglas”: (patrón → acción) 3. Conjunto de estados meta (M ): Estados del problema que satisfacen los requisitos para ser considerados como soluciones. Pueden expresarse en forma de lista de estados ó como una función booleana (prueba de meta) que basándose en las propiedades de un estado indica si es meta o no. (I) y (O) determinan el espacio de estados del problema. • Conjunto de todos los posibles estados admisibles del problema. BÚSQUEDA DE SOLUCIONES solución: Secuencia ordenada de operadores (S ∈ O ∗) que posibilita el transito desde estados iniciales (I ) a finales (O ). Conseguir un ”plan de acción” que permita pasar de (I) a (M ) Objetivo: Encontrar la ”mejor” solución (o una aceptable) Nota: en ocasiones basta con conocer las caracterı́sticas de un estado final (no el camino para alcanzarlo) • búsqueda sirve para saber cómo será ese estado meta – FJRP ccia [Inteligencia Artificial] – 2 ESTRATEGIAS DE BÚSQUEDA También estrategias de control o ”mecanismo de inferencia” • ¿Cómo recorrer el espacio de estados? Secuencia de pasos a seguir para encontrar el conjunto de operadores deseado. • Estrategia es independiente del conocimiento. ◦ no dependende de la información en estados u operadores • Estrategia debe de ser: ◦ sistemática y fácilmente reproducible ◦ producir movimientos válidos en el espacio de estados no debe salir del espacio de estados ◦ producir nuevos estados (para poder avanzar) • Necesidad de estructuras adicionales. ◦ indicar cuándo es aplicable un operador ◦ indicar cuándo se ha utilizado un operador ◦ indicar cuándo un operador produce un estado final ◦ indicar cuándo un operador produce un estado no nuevo ◦ indicar si la solución es aceptable EJEMPLO: Representación de problemas Problema de las 2 jarras – FJRP ccia [Inteligencia Artificial] – 3 2.1.2 Caracterı́sticas Generales Procesos de Búsqueda 1. Dirección del proceso de búsqueda: (2 opciones) a) I −→ M : de estados iniciales a finales datos −→ objetivos proceso dirigido por los datos (progresivo) razonamiento hacia adelante • emparejar descripción del estado con las precondiciones b) I ←− M : de estados finales a iniciales hipótesis de trabajo −→ datos proceso dirigido por los objetivos (evocativo) razonamiento hacia atrás • emparejar descripción del estado con las postcondiciones nota: necesario definir operadores inversos (si es posible) También es posible realizar búsquedas bidireccionales. Criterios de Selección: Tamaño relativo de conjuntos I y M . • avazar de menos a más estados Factor de ramificación • def.: Promedio de estados que podemos alcanzar directamente desde un estado previo. • avanzar en la dirección con menor factor ramificación (menos alternativas) Justificación del razonamiento/solución • Si se exige justificación del resultado → usar misma dirección que usarı́a experto humano (naturalidad) • Criterio más importante en sistemas prácticos. – FJRP ccia [Inteligencia Artificial] – 4 2. Topologı́a del Proceso de Búsqueda Dependiendo de la estructura que definan los operadores el espacio de estados puede ser: • Un árbol: ◦ más sencillo de manejar ◦ mayor consumo memoria (estados duplicados, etc) • Un grafo (con o sin ciclos): ◦ ahorro de memoria ◦ generación más compleja (comprobar existencia de estados) Se irán construyendo a medida que el proceso de búsqueda avanza nota: siempre se podrá recorrer un grafo como si fuera un árbol, a costa de repetir estados y procesamiento Ejemplos: Problema 2 jarras Importante: nodo [estructura de datos] 6= estado [representación del problema] 3. Representación del Problema Tres aspectos a decidir (de cara a la implementación) • Representación de los hechos, objetos y entidades que relevantes en el dominio considerado → Representación de Estados • Representación de las relaciones entre hechos, objetos y entidades relevantes → Representación de Operadores • Representación de las secuencias de estados surgidas durante la búsqueda → Representación de Estrategias (info. de control que es usada) Módulo Represent. Conocimiento representación estados representación operadores – FJRP ccia [Inteligencia Artificial] – + Modulo de Control del Sistema representación estrategias 5 4. Criterios de Selección de Operadores Relevantes a) Proceso de emparejamiento: decidir que operadores son aplicables sobre un estado dado. Determinar operadores cuyas precondiciones sean compatibles con caracterı́sticas del estado considerado [o postcondiciones en estrategias I ←− M ] Problema de correspondencia de patrones complejo • pueden incluirse variables Principal causa de la ”lentitud” de los sistemas de I.A. b) Resolución de conflictos de operadores. def.: Conjunto Conflicto: Conjunto de operadores aplicables resultantes del proceso de emparejamiento. Resolución de conflictos: elección del operador/es a aplicar → depende de/determina la estrategia de búsqueda Posibilidades: • aplicar todos los operadores disponibles (≈ anchura) • aplicar sólo los operadores aún no utilizados • aplicar sólo operadores que emparejen con estados incorporados recientemente • aplicar el operador más especı́fico (retrasar uso de los + generales) ◦ más especı́fico ≈ con más condiciones ◦ reduce el factor e ramificación • aplicar un operador aleatorio – FJRP ccia [Inteligencia Artificial] – 6 5. Optimización de Búsqueda con Funciones Heurı́sticas Uso de funciones (numéricas) que indican lo buena o mala que la elección de un nuevo operador. Finalidad: ”dirigir” el proceso de búsqueda Se basan en conocimiento heurı́stico, especı́fico del problema, derivado de la experiencia, difı́cil de formalizar y explicar. Estrategias ciegas: • No usan info heurı́stica (deciden sin usar conocimiento del problema) • Aplicables en cualquier dominio • En general, menos eficientes (explosión combinatoria) • Ejemplos: ◦ generar y comprobar ◦ búsqueda en anchura ◦ búsqueda en profundidad (prof. acotada y prof. iterativa) Estrategias informadas (o heurı́sticas): • Usan información heurı́stica especı́fica del dominio. • Diseñados para problemas concretos • Limitan explosión combinatoria • No aseguran soluciones óptimas (si ”aceptables”) • Elemplos: ◦ ascenso a colinas ◦ mejor nodo (primero el mejor) ◦ A∗ y variantes – FJRP ccia [Inteligencia Artificial] – 7 6. Criterios de Evaluación completitud : ¿Se garantiza o no que se va a encontrar una solución? (el algoritmo acaba) optimalidad : En caso de que existan varias soluciones, ¿se encuentra la mejor (óptima) o no? (menor no operandos / menor coste) complejidad : • espacial : memoria necesaria para efectuar la búsqueda • temporal : tiempo necesario para efectuar la búsqueda • Estimaciones en el peor de los casos • Especificadas en función de algún parametro del problema, notación O(). – FJRP ccia [Inteligencia Artificial] – 8 2.2 Búsqueda No Informada 2.2.1 Generar y Comprobar 1. Generar caminos al azar, partiendo del estado inicial hasta agotarlos 2. Comprobar si son solución si no son solución, repetir Poco útil en la práctica Aplicable si • espacio de estados en muy pequeño • hay muchos estados objetivo → es posible encontrar alguno al azar Propiedades: • • • • NO es COMPLETO (puede entrar en bucles [espacio de estados es un grafo]) NO es OPTIMO (da la 1a solución que encuentra) Complejidad Temporal: exponencial Complejidad Espacial: O(1) (sólo almacena el nodo/estado actual) 2.2.2 Búsqueda en Anchura (a) FUNCIONAMIENTO Recorrer árbol/grafo de búsqueda en anchura • expandir estado raı́z • expandir todos sus sucesores • expandir todos los sucesores de los sucesores, • etc, ..... Realiza un ordenamiento de los estados a estudiar en base a su profundidad • todos los nodos de profundidad d se estudirán antes que cualquier nodo a profundidad d + 1 – FJRP ccia [Inteligencia Artificial] – 9 (b) ALGORITMO abiertos: Lista ordenada de nodos generados aún no expandidos (aún no se ha comprobado si son solución, ni se han generado sus sucesores) → almacena nodos ”frontera”, en espera de ser expandidos añadir estado inicial a abiertos resuelto := false while (abiertos no vacio and no resuelto) do actual := primer nodo de abiertos if actual es estado final then resuelto := true else /* expandir actual */ for all (operador aplicable a actual) do generar nuevo estado aplicando operador añadir nuevo estado al final de abiertos end for end if end while abiertos: Funciona como una cola (fifo) → mayor profundidad al final de la lista – FJRP ccia [Inteligencia Artificial] – 10 MEJORA: En espacios de estados con estructura de grafo, evitar examinar un estado en múltiples ocasiones Lista cerrados: Almacena estados ya examinados y expandidos Expandir sólo estados que no parezcan en abiertos (ya generados) ni en cerrados (ya examinados) No generados: no aparecen en abiertos ni en cerrados Generados no Examinados: en abiertos Tipos de estados Examinados no Expandidos: el estado actual Expandidos: en cerrados añadir estado inicial a abiertos inicializar cerrados a vacio resuelto := false while (abiertos no vacio and no resuelto) do actual := primer nodo de abiertos if actual es estado final then resuelto := true else añadir actual a cerrados /* expandir actual */ for all (operador aplicable a actual) do generar nuevo estado aplicando operador if (nuevo estado no en abiertos ni en cerrados) then añadir nuevo estado al final de abiertos end if end for end if end while Incrementa el coste computacional gestión de las listas comprobación pertenencia (inspeccionar abiertos y cerrados) • CERRADOS puede implementarse como una tabla Hash (acceso directo) Inconveniente: coste de espacio (CERRADOS crece exponencialmente) – FJRP ccia [Inteligencia Artificial] – 11 (c) CARACTERÍSTICAS BÚSQUEDA EN ANCHURA Es completa: Garantiza que se encuentra la solución (si ésta existe) • tanto en árboles como en grafos (incluso con ciclos) Es óptima: Siempre encuentra la solución más corta • Se asegura que la solución encontrada es la de menor profundidad ◦ no se ”salta” nodos → agota capa k antes de ver nodos de la capa k + 1 • nota: Si los operadores tienen asociado un coste, la solución menos profunda puede no ser la menos costosa. Complejidad • Dos factores ◦ b, factor de ramificación: no promedio de estados generados desde un estado dado ◦ p, profundidad estado objetivo: no mı́nimo de operadores necesarios para alcanzar la solución encontrada • Complejidad espacial: O(bp) (≈ tamaño lista ABIERTOS) • Complejidad temporal: O(bp) (≈ no iteraciones bucle / comprobaciones si es estado final) • En el peor de los casos examina todos los nodos posible • Complejidad exponencial: se saca 1 de abiertos y se añaden b de media Muy ineficaz (explosión combinatoria), sobre todo en requisitos de espacio. – FJRP ccia [Inteligencia Artificial] – 12 2.2.3 Búsqueda en Profundidad (a) FUNCIONAMIENTO Expandir un camino hasta llegar al final (no hay sucecores) Si no es solución y no tiene expansión posible, volver a un nodo no expandido del nivel anterior • da preferencia a los nodos/esatdos más profundos Menor exigencia de memoria • basta con almacenar los nodos de la ruta que se está expandiendo (b) ALGORITMO añadir estado inicial a abiertos inicializar cerrados a vacio resuelto := false while (abiertos no vacio and no resuelto) do actual := primer nodo de abiertos if actual es estado final then resuelto := true else añadir actual a cerrados /* expandir actual */ for all (operador aplicable a actual) do generar nuevo estado aplicando operador if (nuevo estado no en abiertos ni en cerrados) then añadir nuevo estado al principio de abiertos end if end for end if end while abiertos: Funciona como una pila (lifo) → nodos con mayor profundidad al principio nota: este pseudocódigo almacena, además del camino explorado, el inicio de los caminos sin explorar – FJRP ccia [Inteligencia Artificial] – 13 (c) CARACTERÍSTICAS BÚSQUEDA EN PROFUNDIDAD No es completa: Puede no acabar nunca si encuentra una rama sin fin en el espacio de estados • En ciertos casos nunca se volverı́a atrás ◦ si hay ciclos ⇒ bucle infinito [si no se usa CERRADOS] ◦ si espacio de estados es infinito (ramas con no sucesores infinito) • Muy dependiente del orden de aplicación de los operadores No es óptima: Encuentra una solución (la primera que aparezca) que no tiene por qué ser la mejor (la más cercana) Complejidad • Complejidad espacial: O(b × m) [sin usar CERRADOS] ◦ b, factor de ramificación ◦ m, profundidad máxima de cualquier solución • Complejidad temporal: O(bm) (en el peor caso) ◦ si no hay solución (o es el último estado) examinará todos los estados (como en anchura) • En general, suele ser más rápida que búsqueda en anchura ◦ es ”cuestión de suerte” ◦ puede funcionar bien si hay muchos estados finales • ventajas: ◦ Menores requisitos de memoria ◦ Mayor rapidez (en promedio) • inconvenientes: ◦ Posibilidad de que se estanque y no termine ◦ No asegura solución óptima – FJRP ccia [Inteligencia Artificial] – 14 (d) VARIANTES Profundidad Acotada • Fijar un lı́mite máximo de profundidad (cota c) ◦ cuando un camino alcanza la profundidad c sin ser solución, desecharlo • Es completo (acaba) ◦ Asegura encontrar solución si c es mayor que la profundidad de la solución • No asegura solución óptima ◦ no asegura encontrar la solución a menor profundidad • Complejidad: espacial (O(b × c)), temporal (O(bc)) • problema: elección cota c ahorra tiempo y espacio ◦ Pequeña: puede impedir encontrar solución desperdicio tiempo y espacio ◦ Grande: aumenta posibilidades de encontrar solución ◦ En general, no hay suficiente info. para elegir cota adecuada • Ejemplo – FJRP ccia [Inteligencia Artificial] – 15 Profundidad Iterativa • Secuencia de búsquedas por profundidad acotada, incrementando el valor de la cota hasta encontrar solución • ventajas: ◦ Evita problema elección de la cota ◦ Es completa y óptima Siempre da una solución (si la hay) Encuentra la mejor (a menor profundidad) [si los incrementos son de 1 en 1] → siempre que la cota c se incremente de 1 en 1 → agota todos los nodos bajo la cota c antes de incrementarla ◦ Funcionamiento intermedio entre anchura y profundidad como anchura: es completo y óptimo como profundidad: requisitos de memoria contenidos ◦ Uso de memoria reducido (como búsqueda profundidad) • inconvenientes: ◦ Repetición de cálculos No excesivamente importante (afecta principalmente a estados en niveles superiores) Mayoria de nodos situados en niveles inferiores – FJRP ccia [Inteligencia Artificial] – 16 2.3 Búsqueda Heurı́stica 2.3.1 Generalidades Búsqueda ciega: ineficaz en la práctica (explosión combinatoria) Búsqueda heurı́stica: objetivo: guiar el proceso de búsqueda • ”Podar” el espacio de estados Usar información sobre la bondad o cercanı́a de un estado dado respecto a uno de los estados objetivo óptimos → explorar primero caminos más prometedores caracterı́sticas : • No garantiza que se vaya a encontrar la solución • Si la encuentra, no asegura que sea óptima (mı́nimo coste) • En ocasiones, encuentra solución buena en tiempo aceptable ◦ pierden completitud y/o optimalidad ◦ aumentan eficiencia FUNCIONES DE EVALUACIÓN HEURÍSTICAS Aglutinan el conocimiento del dominio sobre el que se apoyará la decisión Asocian a cada estado, e, un número, h(e), que indica lo prometedor, o no, que es ese nodo e de cara a alcanzar un estado objetivo óptimo. Dos interpretaciones: • Estiman la ”calidad” del estado e ⇒ buscar primero por nodos con mayor valor heurı́stico • Estiman la ”proximidad” a un estado final ⇒ buscar primero por nodos con menor valor heurı́stico – FJRP ccia [Inteligencia Artificial] – 17 Ejemplos: • 8-puzzle: no casillas mal colocadas (2o tipo) • cubos: |cantidad en 8 l. - 4 | (2o tipo) • ajedrez: no piezas de ventaja (1er tipo) Clasificación: • Heurı́sticas generales: adecuadas para múltiples dominios → vecino más próximo (”medir distancias”) • Heurı́sticas de propósito especial: usan conocimiento exclusivo de un dominio particular heurı́sticas bien fundadas 1. Si estiman la ”calidad”: h(e) está bien fundada si los estados finales tienen el valor máximo posible. (estado inicial suele tener valor 0) 2. Si estiman la ”distancia”: h(e) está bien fundada si los estados finales tienen el valor 0 – FJRP ccia [Inteligencia Artificial] – 18 2.3.2 Métodos de escalada o ascenso a colinas (a) FUNCIONAMIENTO Familia de métodos de mejora iterativa (también hill climbing ) idea: Elegir, en cada paso, uno de los descendientes del estado actual que mejore el valor heurı́stico de su padre mejor = más alto ⇒ ascenso a colinas mejor = más bajo ⇒ descenso de gradiente Elección local: sólo toma en consideración los sucesores del estado actual Dos variantes: 1. Escalada simple: Generar hijos 1 a 1, calculando su valor heurı́stico El primer hijo que sea mejor que estado actual pasa a ser nuevo estado estado actual • estudia los sucesores secuencialmente 2. Escalada por máxima pendiente: Generar todos los hijos y calcular su valor heurı́stico Tomar al mejor hijo • Si es mejor o igual que estado actual ⇒ pasa a ser nuevo estado actual • Si no, detener el algoritmo estudia los sucesores secuencialmente Ejemplos: Espacio de estados – FJRP ccia [Inteligencia Artificial] – Escalada Simple Máxima Pendiente 19 ventajas • Muy poco consumo de espacio • Complejidad espacial: O(1) (basta guardar 1 estado) inconvenientes • Complejidad temporal: exponencial en peor caso (revisa todos) • No son óptimos ni completos ◦ pueden no encontrar solución aunque exista (ver problemas) ◦ no garantizan el camino más corto problemas: Puntos en los que el algoritmo se estanca Máximos locales: todos los hijos de un estado son peores que él y no es un estado objetivo • def.: Un máximo local es un estado mejor que cualquier otro estado vecino, pero peor que otros más lejanos • El algoritmo para sin dar solución Mesetas: todos los hijos tienen mismo valor heurı́stico que padre • def.: Una meseta es una región del espacio de estados donde todos los estados tienen el mismo valor heurı́stico • El algoritmo para sin dar solución • Si sigue, la heurı́stica no informa ⇒ búsqueda ciega Crestas: mezcla de los anteriores, se llega a un conjunto máximos locales contiguos • def.: Región del espacio de estados que tiene algunos estados con mejor valor heurı́stico que los colindantes, pero a los que no se puede llegar por transiciones simples (usando un único operador) soluciones : Reiniciar toda o parte de la búsqueda (vuelta atrás, backtracking ) Dar un paso más → generar sucesores de sucesores y ”ver que pasa” Máx. locales: Volver a un nodo anterior y probar dirección distinta Mesetas: Hacer un ”salto” grande, para ”salir” de la meseta – FJRP ccia [Inteligencia Artificial] – 20 2.3.3 Método del mejor nodo (primero el mejor) (a) FUNCIONAMIENTO idea: Considerar todos los estados frontera, no sólo los sucesores del estado actual Mantener lista abiertos (nodos no expandidos) ordenada por los valores de la heurı́stica de los estado Intenta combinar anchura y profundidad, guiado por la heurı́stica • Seguir un camino, pasando a otro cuando deje de ser prometedor Diferencia con escalada: los descendientes del estado actual compiten con todos los demás nodos no expandidos (b) ALGORITMO añadir estado inicial a abiertos inicializar cerrados a vacio resuelto := false while (abiertos no vacio and no resuelto) do actual := primer nodo de abiertos /* mejor h(e) */ if actual es estado final then resuelto := true else añadir actual a cerrados /* expandir actual */ for all (operador aplicable a actual) do generar nuevo estado aplicando operador calcular su heurı́stica h(nuevo estado) if (nuevo estado no en abiertos o cerrados) or (está con peor heurı́tica) then añadir nuevo estado en abiertos ordenar abiertos por valor heurı́stico [h(e)] end if end for end if end while – FJRP ccia [Inteligencia Artificial] – 21 Ejemplo: (c) CARACTERÍSTICAS BÚSQUEDA MEJOR NODO Complejidad • Temporal: O(bm) • Espacial: O(bm) • m= profundidad de la solución más lejana • En el peor de los casos (h(e) = constante, no informa) hay que recorrer todos los estados No es completo: mismas debilidades que profundidad (vulnerable a bucles y ramas infinitas) No es óptimo: puede no dar la solución más cercana (ejemplo anterior) • En esencia, sigue siendo un procedimento de búsqueda en profundidad • Da la primera solución que encuentra ◦ Normalmente suele dar buenas soluciones (aceptables) – FJRP ccia [Inteligencia Artificial] – 22 2.3.4 Algoritmo A∗ (a) FUNCIONAMIENTO Familia de algoritmos (Hart, Nilsson, Raphael (1968)) objetivo: Mejorar método del mejor nodo para asegurar completitud y optimalidad (≡ coste mı́nimo). Incorpora la longitud del camino desde la raı́z hasta el estado actual en la función de evaluación h. considerar no sólo lo bueno que es un estado tener en cuenta cómo es el camino usado para alcanzarlo • contempla el coste de los operadores empleados Función de evaluación A∗ f (e) = g(e) + h(e) g(e): coste real del mejor camino desde estado inicial al estado e h(e): estimación (heurı́stica) del coste desde e hasta un estado final óptimo f (e): coste estimado de la mejor solución que pasa por el estado e h∗(e) - costes reales g ∗(e) = g(e) - conocidos cuando termina ∗ ∗ ∗ f (e) = g (e) + h (e) el algoritmo de búsqueda – FJRP ccia [Inteligencia Artificial] – 23 (b) ALGORITMO para manejar grafos Versión Ampliada con traza de los caminos (enlace al padre) abiertos ordenada por el valor de f (e) [≡ g(e) + h(e)] añadir estado inicial a abiertos inicializar cerrados a vacio resuelto := false while (abiertos no vacio and no resuelto) do actual := primer nodo de abiertos /*mejor valor f(e)*/ if actual.estado es estado final then resuelto := true else añadir actual a cerrados for all (operador aplicable a actual) do generar sucesor aplicando operador (1) if (sucesor en abiertos con peor g(e)) then cambiar padre del nodo en abiertos establecer sus nuevas g(e) y f (e) end if if (sucesor en cerrados con peor g(e)) then cambiar padre del nodo en cerrados establecer sus nuevas g(e) y f (e) propagar nueva g(e) a sus descendientes en abiertos y cerrados end if if (sucesor no en abiertos ni en cerrados) then insertar sucesor en abiertos end if end for reordenar abiertos si es necesario end if end while – FJRP ccia [Inteligencia Artificial] – 24 (1) Generar sucesor(): [crea un nodo sucesor] sucesor.estado := aplicar operador sobre actual.estado sucesor.padre := actual sucesor.g := actual.g + coste(operador[actual → sucesor]) sucesor.f := sucesor.g + h(sucesor.estado) nota: h(e) Si g(e) h(e) Si g(e) = 0 ≈ Búsqueda en anchura = profundidad(e) = 0 ≈ Búsqueda ”aleatoria” = 0 [depende del orden de inserción] h(e) = 0 Si g(e) = prof fundidad maxima – FJRP ccia [Inteligencia Artificial] – − profundidad(e) ≈ Búsqueda en pro- 25 CARACTERÍSTICAS BÚSQUEDA A* Es óptimo y completo si: todo nodo tiene un no finito de sucesores coste de cada arco/operador > 0 la función h(e) es una heurı́stica admisible Heurı́stica Admisible: Diremos que h(e) es una heurı́stica admisible si nunca sobreestima el coste real desde e hasta un estado meta óptimo. Es decir, h(e) ≤ h∗(e) ∀e [estimación ≤ coste real] → para algoritmos que maximizan f (e) : h(e) ≥ h∗ (e) ∀e conclusión: Si h(e) es admisible ⇒ f (e) tampoco sobreestima el coste real de la mejor solución que pase por el estado e. ∗ f (e) ≤ f (e) [es decir: g(e) + h(e) ≤ g(e) + h∗ (e)] Complejidad (en el peor caso) espacial: temporal: O(bp) O(bp) b = factor ramificación, p = profundidad solución En el peor de los casos (h(e) = 0) sigue siendo necesario recorrer todo el árbol [h(e) no informa] En caso promedio: • El consumo de memoria sigue siendo alto ◦ almacenamiento de todos los estados visitados (cerrados) y los pendientes de visitar (abiertos) • Tiempo promedio aceptable (mejora búsqueda en profundidad) – FJRP ccia [Inteligencia Artificial] – 26 (d) VARIANTES RTA*: Real Time A∗ • Aplicación en tareas de tiempo real ◦ no pueden esperar a encontrar solución óptima • Obliga a tomar una decisión cada periodo de tiempo k × t • Periodo de tiempo determina profundidad alcanzada en búsqueda ◦ busca hasta donde le da tiempo ◦ indica la operación sobre el estado actual que inicia el camino que lleva al mejor estado encontrado A*PI: A∗ con profundización iterativa (IDA*) • Búsqueda por profundización iterativa controlada por la función de evaluación A∗ ◦ f (e) = g(e) + h(e) ◦ nota: en principio, no comprueba estados repetidos • objetivo: reducir necesidades de memoria • Lı́mite de coste k, no de profundidad • Expandir sólo estados e con coste dentro de la cota (f (e) ≤ k) • El resultado de cada iteración se usa para establecer cota de la siguiente ◦ la ”amplitud” de la búsqueda se amplı́a en cada iteración SMA*: A∗ acotado por memoria • Trabajo con memoria limitada • idea: limitar la cantidad de memoria disponible ◦ Usa toda la memoria de la que se dispone ◦ Mientras hay memoria funcionamiento normal, evitando estados repetidos ◦ Si al generar un sucesor falta memoria, libera el espacio de los estados menos prometedores ◦ Sigue manteniendo traza de la ”bondad” de esos estados desechados • Devuelve la mejor solución que se puede encontrar con la cantidad e memoria disponible – FJRP ccia [Inteligencia Artificial] – 27 2.3.4 Heurı́sticas (1) CONSTRUCCIÓN DE HEURÍSTICAS Dependen del problema Influyen en el rendimiento Técnicas generales 1. Relajación de operadores • Reducir algunas restricciones sobre los operadores del problema original • Operadores simplificados facilitan cálculo del coste real en el problema ”relajado” • Usar coste real de la solución al problema ”relajado” como heurı́stica del problema original • Suele generar heurı́sticas admisibles • Ejemplo: 8-puzzle ◦ h1: (no de placas (incluido hueco) en lugar correcto -1) Problema relajado: se permite intercambiar cualquier par de casilla h1 calcula el no exacto de pasos necesarios en el problema relajado ◦ h2: ”distancia manhatan” (suma distancia vertical y horizontal entre posición actual de cada placa y la deseada) Problema relajado: cualquier casilla puede moverse a una posición adyacente independientemente de las otras casillas (las casillas se mueven a su posición una a una, pasando ”por encima” de las otras) h2 calcula el no exacto de pasos necesarios en el problema relajado – FJRP ccia [Inteligencia Artificial] – 28 2. Ponderación de rasgos • Tomar un conjunto de caracterı́sticas del estado que se puedan representar numéricamente • Combinarlas asignándoles diferentes pesos • Muy usadas juegos • Posibilidad de aprendizaje de pesos (juego de damas de Samuel) • Ejemplo: ajedrez 3. Uso estudio estadı́stico previo • Partir de una heurı́stica preliminar h(e) y realizar búsquedas de entrenamiento • Relacionar los valores de h(e) con los costes reales obtenidos en cada uno de esos casos de entrenamiento ◦ corregir cada valor de h(e) usando el valor real obtenido con más frecuencia en el ”entrenamiento” 4. Combinación de heurı́sticas • Combinar heurı́sticas distintas que funcionen bien sólo en ciertas circunstancias ◦ aprovechar heurı́sticas ”parcialmente” útiles • Ponderándolas: h0 (e) = w1 ×h1 (e)+w2 ×h2 (e)+...+wn ×hn (e) 0 h (e) = max{h1(e), h2(e), ..., hn(e)} • Agregándolas: h0(e) = min{h1(e), h2(e), ..., hn(e)} 0 h (e) = media{h1(e), h2(e), ..., hn(e)} ◦ Si todas son admisibles, la agregada también lo es – FJRP ccia [Inteligencia Artificial] – 29 (2) EVALUACIÓN Y COMPARACIÓN DE HEURÍSTICAS En general: [para heurı́sticas a minimizar] Si h2(e) ≥ h1(e) ∀e [al revés si se maximiza h(e)] se dice que h2(e) domina a h1(e) • con h2(e) se generarán menos estados → aproxima más h∗ (e) [h∗ (e) ≥ h2 (e) ≥ h1 (e)] → heurı́stica ”menos informada” • peor no asegura ofrecer una solución mejor Criterios de comparación 1. No de estados generados (tamaño árbol/grafo) • depende del problema de búsqueda concreto • varı́an con las entradas (estados inicial y finales) • otra opción: tamaño medio o máximo de la lista abiertos 2. Factor de ramificación efectivo (b̂) • Métrica artificial ◦ depende ”sólo” de la heurı́stica (no del tamaño del problema) ◦ relativamente constante en distintas búsquedas ◦ interesa que esté próximo a 1 N : no de nodos expandidos p: profundidad de la solución encontrada b̂: factor de ramificación de un árbol uniforme (no de hijos constante) de profundidad p que contenga N nodos Se cumple: 2 3 p N = 1 + b̂ + b̂ + +b̂ + ... + b̂ ¿despejar b̂? – FJRP ccia [Inteligencia Artificial] – 30 2.4 Búsqueda en Juegos 2.4.1 Generalidades INTERÉS DE LOS JUEGOS Fáciles de formalizar • Fácil representación de estados ◦ En el juego de damas: situación del tablero + poseedor del turno • Acciones restringidas (reglas precisas) • Evaluación de eficacia directa Mayor complejidad • Existe oponente ◦ elemento externo con el que se interactúa ◦ introduce incertidumbre • Futuro no predecible • Alto factor de ramificación MODELIZACION: Juegos de 2 jugadores con información completa Contrincantes conocen la situación del juego y su oponente • posibles movimientos + movimiento efectuado • resultado del movimiento • no se conoce estrategia del contrincante No interviene el azar victoria Se puede determinar en todo momento: derrota empate Problemas de ”suma nula”: lo que ”gana” un jugador es lo que ”pierde” el otro Ejemplos: ajedrez, 3 en raya NO LO SON: juegos con cartas(mus) o dados(backgamon) – FJRP ccia [Inteligencia Artificial] – 31 FORMALIZACIÓN. estado (posición) inicial: posición inicial del tablero + quién inicia el juego operadores (movimientos): definen qué jugadas les están permitidas a los jugadores prueba de finalización: indica el fin del juego (estados/posiciones finales) • victoria, empate, derrota función de utilidad: (sobr e posciones finales) asigna valor numérico al resultado del juego • si no aplicada sobre posiciones finales: función de evaluación TÉCNICA DE REPRESENTACIÓN: Árboles alternados Representación explı́cita de todas las secuencias de jugadas posibles, para ambos jugadores nodos: representan posiciones (estados) sucesores: posiciones a las que se puede acceder aplicando los movimientos permitidos Cada nivel representa, alternativamente, las acciones posibles de cada jugador Objetivo: Encontrar un buen primer movimiento Esquema básico: 1. 2. 3. 4. 5. Generar árbol alternado ”completo” para el tablero actual Aplicar la función de evaluación sobre las hojas (posiciones finales) Buscar mejor primer movimiento (inicio camino victorioso) Ejecutar movimiento ”Percibir” que hace el contrincante En la práctica: Inabordable construir árbol completo • 3 en raya: 9! 360000 nodos • damas: ≈ 1040 nodos • ajedrez: ≈ 10120 nodos (factor ramific. medio ≈ 25) en juegos pequenos • Si es posible en secuencias finales – FJRP ccia [Inteligencia Artificial] – 32 APROXIMACIÓN PRÁCTICA Limitar profundidad de la búsqueda (fijar horizonte limitado) Aplicar función evaluación (heurı́stica) sobre nodos hoja resultantes valores altos(positivos) → posiciones favorables • Convención : valores bajos(negativos) → posiciones desfavorables – FJRP ccia [Inteligencia Artificial] – 33 2.4.2 Procedimiento MINIMAX Objetivo: encontar el ”mejor” primer movimiento Técnica mixta: combina búsqueda + evaluación Jugador max: maximiza valores de evaluación de sus sucesores Jugador min: minimiza valores de evaluación de sus sucesores Objetivo: que max sea el ganador max es quien debe realizar el movimiento actual [posee el turno] • nodos en niveles pares: turno max • nodos en niveles impares: turno min Nota: capa = jugada (1 nivel del árbol) profundidad = pares de capas (grupos de 2 movtos. [min+max]) • nodos de prof. k = nodos max en capa 2k + nodos min en capa 2k + 1 nodo raiz (max) en capa 0 y prof. 0 Método MINIMAX Búsqueda recursiva en profundidad acotada (p = profund. máxima) • Raı́z: nodo max • Sucesores nodo max: nodos min • Sucesores nodo min: nodos max gana algún jugador Final recursividad: alcanza posición de empate se han expandido 2p capas Funcionamiento: • Nodo raı́z: se corresponde con la posición actual del juego • Aplica función evaluación sobre nodos hoja y propaga valores hasta nodo raı́z • Devuelve un ”buen” primer movimiento para max ◦ Selecciona movimiento que genera el sucesor más prometedor – FJRP ccia [Inteligencia Artificial] – 34 Suposición de partida: Estrategia conservadora • min elegirá siempre la mejor jugada para él (peor para max) ◦ min es, al menos, tan inteligente como max ◦ Sabe evaluar tan bien como max → usan misma func. evaluac. Valor minimax: evaluación de la bondad de una posición • en hojas: función de evaluación estática • en nodos intermedios: calculado a partir de los valores de sus sucesores (evaluación dinámica) ◦ tiene el cuenta el tipo de jugador valor positivo: favorable a max (+∞ si posición ganadora) Función evaluación hojas: valor negativo: favorable a min desde el punto (−∞ si posición perdedora) de vista de MAX empate: devuelve 0 PASOS: 1. Expandir en profundidad hasta nivel máximo (o no expansión posible) 2. Evaluar nodos hoja (aplicar func. evaluación) 3. En cada nivel se propagan evaluaciones hacia atrás Si es nodo max: tomar máximo valor de sus sucesores Si es nodo min: tomar mı́nimo valor de sus sucesores 4. En nodo raı́z: ejecutar movto. que lleve al sucesor con mejor valor 5. Esperar respuesta adversario y volver a (1) con nueva posición actual mejor acción: Acción con evaluación más alta, suponiendo que adversario elegirá en el futuro las mejores opciones para él. Más precisa la evaluación propagada usando minimax que la obtenida aplicando la función de evaluación estática sobre los nodos sucesores de la posición actual • Tiene en cuenta la secuencia de futuras respuestas del oponente Todo lo que se sabe de min es que elige la opción que más le conviene (la de menor valor) • Se supone a min tan inteligente como max – FJRP ccia [Inteligencia Artificial] – 35 Punto clave: Definir una buena función de evaluación Ejemplo: juego de damas de Samuel • función ponderada de 16 caracterı́sticas • aprendizaje automático de los pesos ALGORITMO RECURSIVO MINIMAX(posicion, nivel) /* casos base (evaluación estática) */ if (esGanador (posicion)) then devolver +∞ else if (esPerdedor (posicion)) then devolver −∞ else if (esEmpate(posicion)) then devolver 0 else if (nivel = limite) then devolver evaluacion(posicion) else /* caso recursivo (evaluación dinámica) */ for all sucesor i de posicion do valores[i] := MINIMAX(sucesor i, nivel+1) end for if (esNodoMAX(nivel)) then devolver maximo(valores) end if if (esNodoMIN(nivel)) then devolver minimo(valores) end if end if Llamada inicial: MINIMAX(posionActual, 0) – FJRP ccia [Inteligencia Artificial] – 36 Ejemplo: TIC-TAC-TOE max: ”X”, min: ”O” +∞ si gana max Funcion evaluación: −∞ si gana min (abiertos(max) − abiertos(min)) en otro caso • abiertos(A) = no filas/columnas/diagonales que A podrı́a llegar a completar → no lı́neas sin ficha del contrario Cálculo: abiertos(A) = 8− no filas/colums./diags. ocupadas por contrario Expansión hasta prof. 1 (2 niveles) → no se muestran posiciones simétricas – FJRP ccia [Inteligencia Artificial] – 37 2.4.3 Poda ALFA-BETA minimax separa generación de nodos y evaluación de posiciones 1o genera todos los sucesores (y sus descendientes) después evalúa y propaga → muy ineficiente Idea: Evitar generar todas las alternativas, “cortando” aquellas que sepamos que no van a mejorar los valores que ya hemos obtenido hasta el momento. Generación y evaluación simultáneas (sucesor a sucesor) Necesidad de ”arrastrar” información adicional Poda α − β idea: Arrastrar una ventana (2 valores) indicando a que intervalo debe de pertener los valores de evaluación para ser considerados Evita expandir posiciones que no mejorarán los resultados actuales • su evaluación se sale del intervalo [α, β] En cada nodo n: • valor α: cota inferior (al menos ya se han conseguido α puntos) • valor β : cota superior (como mucho se conseguirán β puntos) α = −∞ Inicialmente: β = +∞ Cada nodo recibe los mejores valores de α y β obtenidos hasta el momento y los va actualiza con las evaluaciones que recibe de sus hijos • En determinados casos, podrá decidir dejar de evaluar sus hijos (poda) – FJRP ccia [Inteligencia Artificial] – 38 Actualización de valores α y β hacia atrás • Nodos min: actualizan valor de β [minimizan cota superior, β ] ◦ Toman el menor valor de sus sucesores y actualizan β si los sucesores lo mejoran Si evaluacion(sucesor) < β =⇒ β = evaluacion(sucesor) ◦ Valores β en nodos min nunca crecen • Nodos max: actualizan valor de α [maximizan cota inferior, α] ◦ Toman el mayor valor de sus sucesores y actualizan α si los sucesores lo mejoran Si evaluacion(sucesor) > α =⇒ α = evaluacion(sucesor) ◦ Valores α en nodos max nunca decrecen CORTES Se suspende expansión de sucesores de un nodo en los siguientes casos: 1. Corte α (en nodos min) Si nodo min alcanza un valor β menor o igual que el valor α que llegó de un nodo max anterior ⇒ No es necesario seguir estudiando sus sucesores. condición: β ≤ αpadre Ejemplo: 2. Corte β (en nodos max) Si nodo max alcanza un valor α mayor o igual que el valor β que llegó de un nodo min anterior ⇒ No es necesario seguir estudiando sus sucesores. condición: α ≥ βpadre Ejemplo: Llamada inicial: ALFA BETA(posionActual, −∞, +∞, 0) – FJRP ccia [Inteligencia Artificial] – 39 ALPHA BETA(posicion, α, β , nivel) /* casos base (evaluación estática) */ if (esGanador (posicion)) then devolver +∞ else if (esPerdedor (posicion)) then devolver −∞ else if (esEmpate(posicion)) then devolver 0 else if (nivel = limite) then devolver evaluacion(posicion) else /* caso recursivo (evaluación dinámica) */ if (esNodoMAX(nivel)) then αactual := α aux := −∞ for all sucesor i de posicion do if (αactual ≥ β ) then PARAR [salida del bucle FOR] /* poda BETA */ else aux := maximo(aux, ALFA BETA(sucesor i, αactual , β , nivel+1) αactual := maximo(αactual , aux) end if end for else if (esNodoMIN(nivel)) then βactual := β aux := +∞ for all sucesor i de posicion do if (βactual ≤ α) then PARAR [salida del bucle FOR] /* poda ALFA */ else aux := minimo(aux, ALFA BETA(sucesor i, α, βactual , nivel+1) βactual := minimo(βactual , aux) end if end for end if devolver aux end if Llamada inicial: ALFA BETA(posicionActual, −∞, +∞, 0) – FJRP ccia [Inteligencia Artificial] – 40 PROPIEDADES Algoritmo α − β generará el mismo movimiento que miimax expandiendo menos nodos • Genera la misma evaluación dinámica para el nodo raı́z • Mismo resultado, obtenido de forma más eficiente Efectividad de α − β depende mucho del orden en que se examinan los descendientes • Si se examinan primero los peores caminos, nunca habrá cortes • Interesa ordenar a los sucesores Situación ideal: (maximiza podas) • En nodos min: examinar primero sucesores con menor valor • En nodos max: examinar primero sucesores con mayor valor En la práctica no es posible ordenación perfecta → usar una func. evaluación estática simple para preordenar sucesores En el caso ideal (ordenación perfecta) • minimax explora O(bd) nodos • α − β explora O(bd/2) nodos Con b=factor de ramificación y d= prof. búsqueda máxima • Es decir, suponiendo ordenación perfecta, α−β permitirı́a alcanzar el doble de profundidad que minimax empleando el mismo espacio y tiempo – FJRP ccia [Inteligencia Artificial] – 41 2.4.4 Mejoras minimax y alfa beta 1. Efecto horizonte Provocado por limitar el estudio hasta profundidad fija • No se ”ve” más alla del horizonte • Un sucesor devuelve un valor (muy alto/bajo) que explorando más niveles serı́a corregido en sentido contrario ◦ a corto plazo: buen movimiento ◦ a largo plazo: pésimo • Ejemplo: Capturar dama en ajedrez ◦ Parece muy bueno, pero dependiendo del movimiento del contrincante (que no veremos) puede ser nefasto si el rey queda descubierto. Solución: Búsqueda en profundidad variable • No parar siempre a la misma profundidad • Intentar llegar a posiciones ”en equilibrio” a) Seguir profundizando si la hoja ofrece un valor extermo b) Profundizar por sucesores hasta que valor estático y dinámico no varı́en mucho → dejar de profundizar cuando eval. dinámica ≈ ecal. estática 2. Uso movimientos de libro Consultar posición actual en un catálogo construido previamente y recuperar el movimiento guardado. Imposible construir y manejar para juegos completos Razonable en ciertas fases del juego: apertura y final – FJRP ccia [Inteligencia Artificial] – 42 3. Profundización iterativa Usado en juegos con restricciones de tiempo • Ej.: ajedrez, elegir jugada antes de agotar tiempo Idea: a) Estudiar hasta profundiad p b) Seleccionar mejor movimiento c) Si hay tiempo, estudiar k niveles más (prof. p + k) d) Al final del tiempo ejecutar el movimiento identificado en la búsqueda completada más profunda Consumo de tempo y espacio ligeramente mayor → se reevalúa el árbol en cada iteración Puede ser útil para mejorar la poda α − β • Usar resultados de la iteración anterior para ordenar sucesores adecuadamente 4. Aumento podas en α − β a) Uso movimientos asesinos (heurı́stica para ordenar sucesores) Identificar tipos de jugadas muy buenas Comenzar la evaluación de sucesores empleando esos movimientos b) Reducción ventana inicial Comenzar búsqueda con ventana más pequeña (no [−∞, +∞]) Aumenta podas en los niveles superiores → afectan a un mayor no de nodos Problema: difı́cil ajustar ventana inicial → posibilidad de ”cortar” el buen camino → en búsq. iterativa, fijarla en base a resultados previos – FJRP ccia [Inteligencia Artificial] – 43 2.4.5 Juegos con Elementos de Azar Ejemplos: backgamon, juegos de cartas, juegos con dados Idea: Incluir una capa adicional representando al elemento aleatorio Funciona como un ”jugador” más EJEMPLO: Inclusión de un dado • El movimiento del jugador depende del resultado de la tirada del dado → ejemplo: parchis • Incluir jugador ”dado ” • Se suponen resultados del lanzamiento equiprobables • Nodos dado son sucesores de nodos max y min ◦ Se corresponden con las diferentes opciones del elemento aleatorio (resultado de la tirada del dado) ◦ Se asocia una probabilidad de aparición a cada uno ◦ max o min determinarán sus posibles movimientos en base a la posición del juego y al nodo dado previo – FJRP ccia [Inteligencia Artificial] – 44 • La propagación ascendente de valores tiene en cuenta esas probabilidades • Nodos aleatorios: propagan un valor esperado (no real) de sus sucesores • Alternativas: ◦ Propagar peor valor (opción conservadora) ◦ Propagar mejor valor (opción optimista) ◦ Propagar media ponderada de acuerdo a probabilidades Nodo max expectiM AX(A) = P6 i=1 probi × maximo{sucesores(dadoi )} (sucesores(dadoi ) son nodos min ) Nodo min expectiM IN (A) = P6 i=1 probi × minimo{sucesores(dadoi )} (sucesores(dadoi ) son nodos max ) Inconvenientes: introducir movimientos de azar incrementa espacio de búsqueda • añadir una capa adicional en cada jugada • con un alto factor de ramificación – FJRP ccia [Inteligencia Artificial] – 45 Bibliografı́a Russell S., Norvig P.:Inteligencia artificial. Un enfoque moderno Capı́tulos 3, 4, 5. Nilsson N.:Inteligencia artificial. Una nueva sı́ntesis Capı́tulos 7, 8, 9, 12 Enlaces AI-Search Algorithm Animation Project (RMIT University) Applet que demuestra el funcionamiento de los algoritmos de busqueda estudiados en clase. http://www.cs.rmit.edu.au/AI-Search/ – FJRP ccia [Inteligencia Artificial] – 46