III. BÚSQUEDA Y RESOLUCIÓN DE PROBLEMAS. III.3.



Documentos relacionados
Resolución de Problemas

Restricciones. Inteligencia Artificial. Ingeniería Superior en Informática, 4º Curso académico: 2011/2012 Profesores: Ramón Hermoso y Matteo Vasirani

Búsqueda heurística Prof. Constantino Malagón

Árboles. Cursos Propedéuticos Dr. René Cumplido M. en C. Luis Rodríguez Flores

Divisibilidad y números primos

Estructuras de Datos. Montículos. Montículos. Montículos. Tema 3. Montículos. Definiciones básicas: Definiciones básicas:

Tema 3. Espacios vectoriales

Tema 2. Espacios Vectoriales Introducción

Ampliación de Estructuras de Datos

GRAFOS. Prof. Ing. M.Sc. Fulbia Torres

Árboles AVL. Laboratorio de Programación II

árbol como un conjunto de nodos y líneas

Ingeniería en Informática

Fundamentos de Investigación de Operaciones Investigación de Operaciones 1

ESTRUCTURAS ALGEBRAICAS 1

Problemas Resueltos del Tema 1

Estructuras de datos: Árboles binarios de

Matrices equivalentes. El método de Gauss

BASES Y DIMENSIÓN. Propiedades de las bases. Ejemplos de bases.

EJERCICIOS RESUELTOS SOBRE ERRORES DE REDONDEO

Apuntes de Matemática Discreta 9. Funciones

Tema 3: Problemas de Satisfacción de Restricciones

Relaciones entre conjuntos

Capítulo 1. MANUAL DE USUARIO

Ecuaciones de primer grado con dos incógnitas

Métodos Heurísticos en Inteligencia Artificial

DEFINICION. Ing. M.Sc. Fulbia Torres Asignatura: Estructuras de Datos Barquisimeto 2006

Satisfacción de Restricciones

TABLA DE DECISION. Consideremos la siguiente tabla, expresada en forma genérica, como ejemplo y establezcamos la manera en que debe leerse.

Cómo?: Resolviendo el sistema lineal homógeneo que satisfacen las componentes de cualquier vector de S. x4 = x 1 x 3 = x 2 x 1

Resumen de técnicas para resolver problemas de programación entera Martes, 9 de abril. Enumeración. Un árbol de enumeración

Capítulo 6. ÁRBOLES.

Sistemas de numeración

Complejidad - Problemas NP-Completos. Algoritmos y Estructuras de Datos III

Un grafo G es un par (V,E) donde V es un conjunto (llamado conjunto de vértices) y E un subconjunto de VxV (conjunto de aristas).

Tecnólogo Informático- Estructuras de Datos y Algoritmos- 2009

Estas visiones de la información, denominadas vistas, se pueden identificar de varias formas.

3. Modelo relacional: Estructura e integridad.

Capítulo 12: Indexación y asociación

Tecnologías en la Educación Matemática. Expresiones. Datos. Expresiones Aritméticas. Expresiones Aritméticas 19/08/2014

DETERMINACIÓN DEL VOLUMEN DE PEDIDO.

Función exponencial y Logaritmos

Nota 2. Luis Sierra. Marzo del 2010

Introducción a los Autómatas Finitos

Registro (record): es la unidad básica de acceso y manipulación de la base de datos.

Fundamentos de Investigación de Operaciones Asignación y Vendedor Viajero

Subespacios vectoriales en R n

1. SOLUCIONES A LOS EJERCICIOS PROPUESTOS

Restricciones sobre dominios finitos con Gprolog

MANUAL DE USUARIO DE LA APLICACIÓN DE ACREDITACION DE ACTIVIDADES DE FORMACION CONTINUADA. Perfil Entidad Proveedora

Universidad Nacional de Quilmes Ing. en Automatización y Control Industrial Cátedra: Visión Artificial Agosto de 2005

Una (muy) breve introducción a la teoría de la computación

Juan Antonio González Mota Profesor de Matemáticas del Colegio Juan XIII Zaidín de Granada

La nueva criba de Eratóstenes Efraín Soto Apolinar 1 F.I.M.E. U.A.N.L. San Nicolás, N.L. México. efrain@yalma.fime.uanl.mx

Operaciones Morfológicas en Imágenes Binarias

Subconjuntos destacados en la

forma de entrenar a la nuerona en su aprendizaje.

Estructuras de Datos y Algoritmos. Árboles de Expresión

TEMA 9: EFECTOS COMERCIALES A COBRAR

SOLUCIÓN CASO GESTIÓN DE PERSONAL I

H E R R A M I E N T A S D E A N Á L I S I S D E D A T O S HERRAMIENTAS DE ANÁLISIS DE DATOS

1.4.- D E S I G U A L D A D E S

Tablas. Estas serán las tablas que usaremos en la mayoría de ejemplos. Empleado

Ingeniería del Software I Clase de Testing Funcional 2do. Cuatrimestre de 2007

Analisis de algoritmos

Problemas de satisfacción de restricciones.

Es de aplicación a todas aquellas situaciones en las que se necesita desplegar un objetivo para obtener una visión clara de cómo debe ser alcanzado.

CURSO BÁSICO DE MATEMÁTICAS PARA ESTUDIANTES DE ECONÓMICAS Y EMPRESARIALES

Arboles Binarios de Búsqueda

Grupos. Subgrupos. Teorema de Lagrange. Operaciones.

4.Diseño de Bases de Datos (I)

Ecuaciones Diferenciales Tema 2. Trasformada de Laplace

Base de datos en Excel

E 1 E 2 E 2 E 3 E 4 E 5 2E 4

MODELOS DE RECUPERACION

1 Agencia de viajes: enunciado

En cualquier caso, tampoco es demasiado importante el significado de la "B", si es que lo tiene, lo interesante realmente es el algoritmo.

Proyecto Unico Interpretador de SetCalc

GUIA COMPLEMENTARIA PARA EL USUARIO DE AUTOAUDIT. Versión N 02 Fecha: 2011-Febrero Apartado: Archivos Anexos ARCHIVOS ANEXOS

Programación Genética

EJERCICIOS DE FUNCIONES REALES

ANÁLISIS DE DATOS NO NUMERICOS

Algoritmos sobre Grafos

LÍMITES Y CONTINUIDAD DE FUNCIONES

Hoja de Problemas Tema 6 Búsqueda con estados estructurados: Restricciones

y los conos serán todos los diagramas (acá usamos la palabra en el sentido habitual, no en el que acabamos de definir) de la forma

Primer Parcial de Programación 3 (1/10/2009)

3. Consideremos el puzzle-8 descrito en clase y sea el estado objetivo, como de costumbre,

DOMINIO Y RANGO página 89. Cuando se grafica una función existen las siguientes posibilidades:

Sistemas de producción y búsqueda de soluciones. Area de Computación e Inteligencia Artificial 1

Un problema sobre repetidas apuestas al azar

Definición Se llama suceso aleatorio a cualquier subconjunto del espacio muestral.

March 25, 2010 CAPÍTULO 2: LÍMITES Y CONTINUIDAD DE FUNCIONES EN EL ESPACIO EUCLÍDEO

Normalización. El diseño que hemos recibido está compuesto de estas dos relaciones:

Números Reales. MathCon c

1. Producto escalar, métrica y norma asociada

Con esta nueva versión, si un artículo que está incluido dentro de un Paquete de Ventas tiene precio 0,00, significará gratis.

Instrucción IrA (GoTo). Saltos no naturales en el flujo normal de un programa. Pseudocódigo y diagramas de flujo. (CU00182A)

SINAUTO. (Captura Requirimientos) GRUPO 03

Transcripción:

III. BÚSQUEDA Y RESOLUCIÓN DE PROBLEMAS. III.3. Búsquedas con retroceso. III.3.1. Búsquedas con retroceso a ciegas. III.3.1.1. Procedimientos con retroceso. La búsqueda con retroceso, o backtracking, es una estrategia tentativa. El procedimiento lleva la cuenta de las reglas aplicadas. Si en el transcurso de la búsqueda se llega a un punto muerto, puede olvidar o "deshacer" la última regla aplicada y probar una nueva alternativa. Esto permite, en principio, explorar todos los caminos de un grafo a partir de un nodo inicial, siempre que sea finito y se compruebe la aparición de ciclos. El procedimiento RETROCESO recibe un estado inicial y devuelve: bien el camino de estados que lleva a un estado objetivo; o bien 'FRACASO' si no pudo encontrarse ningún camino solución. Aunque la idea de base es sencilla, pueden considerarse distintas implementaciones de la búsqueda con retroceso. Concretamente analizaremos dos versiones: La primera, que denominaremos backtrack, es una versión recursiva en la que la secuencia de nodos examinados se guarda en los entornos de las sucesivas llamadas recursivas. La segunda, que denominaremos retroceso, es una versión recursiva por la cola que manipula explícitamente una estructura de datos donde se guarda explícitamente el camino que se está examinando. a) Procedimiento BACKTRACK El procedimiento BACKTRACK recibe un estado e intenta encontrar un camino solución partiendo de él. Para ello genera un único sucesor y realiza una llamada recursiva. Si esta fracasa, se genera otro sucesor y se vuelve a realizar una llamada recursiva. Si las llamadas correspondientes a todos los sucesores fracasan, entonces se termina devolviendo FRACASO. Si en algún momento se encuentra un estado final, se termina con éxito, y la secuencia de retornos de las distintas llamadas construyen una lista con el camino solución. PROCEDIMIENTO BACKTRACK backtrack(e) Si finalp(e) entonces devolver (cons(e, NIL)); en otro caso, Para cada regla R aplicable a E E2 aplicar-regla(r,e); SOLUCION backtrack(e2); Si SOLUCION <> FRACASO entonces devolver (cons(e,solucion)); fin/para devolver ( FRACASO ); fin backtrack; b) Procedimiento RETROCESO El procedimiento RETROCESO realiza una exploración similar a la de BACKTRACK. La diferencia está en la implementación, que en el caso de RETROCESO responde a una función recursiva por la cola más versátil, y que permite la comprobación de ciclos. Para llevar la cuenta de los estados y reglas considerados, RETROCESO utiliza una lista de nodos. Cada nodo estará formado por dos elementos: un estado; una lista de las reglas aplicables a dicho estado y que aún no han sido probadas. Supondremos definidas las operaciones: hacer-nodo(e, LR), que recibe un estado E y una lista de reglas LR y devuelve un nodo. estado(n), que recibe un nodo N y devuelve el estado asociado. lista-reglas (N), que recibe un nodo N y devuelve la lista de reglas asociada. También supondremos que NIL denota la lista vacía, y que están definidas las operaciones sobre listas: añadir(x,l), que recibe un elemento X y una lista L, y devuelve una nueva lista cuyo primer elemento es X, y a continuación todos los de la lista L, es decir, en notación Prolog, la lista [X L]. cabeza(l), que recibe una lista L y devuelve su primer elemento. resto(l), que recibe una lista L y devuelve una lista igual que L tras eliminar su primer elemento. Apuntes IAlC 25/26 III.1 Dpto. Leng.Ciencias Comp., Univ.Málaga

vacío(l), que recibe una lista L y devuelve 'cierto' si L es la lista vacía, y 'falso' en otro caso. PROCEDIMIENTO RETROCESO retroceso(e); LR reglas-aplicables(e); N hacer-nodo(e, LR); CAMINO añadir(n, NIL); devolver(rtr(camino)); fin-retroceso. PROCEDIMIENTO RTR rtr(camino); NODO cabeza (CAMINO); E estado (NODO); LR lista-reglas (NODO); R cabeza (LR); según: vacío (CAMINO) : devolver ('FRACASO'); es-objetivo (E): devolver (CAMINO); vacío (LR): devolver (rtr (resto (CAMINO))); otro-caso: LR2 resto (LR); NODO2 hacer-nodo (E, LR2); fin-según; fin-rtr. NUEVO-CAM añadir(nodo2, resto (CAMINO)); devolver (rtr (avanzar (E,R, NUEVO-CAM))); Las cuatro condiciones de la estructura 'según' corresponden al fracaso, éxito, retroceso y avance respectivamente. Las dos primeras suponen la terminación de la búsqueda, mientras que las restantes la continúan. Nótese que cuando se prueba una regla de un nodo, la lista de reglas correspondiente debe ser actualizada. Nótese también que 'rtr' es una función recursiva por la cola. La función 'avanzar (E,R, CAM)' recibe un estado E, una regla R aplicable a E, y un camino CAM, y devuelve un camino igual que CAM, pero que además tiene a la cabeza el estado resultante de aplicar R a E. Según la naturaleza del problema que se pretenda resolver puede realizarse o no la comprobación de ciclos. Si los ciclos son imposibles, entonces comprobarlos es una pérdida de tiempo. Si los ciclos son posibles, no comprobarlos puede ser nefasto. Veamos versiones para ambas posibilidades: AVANZAR(E,R,CAMINO) ;versión que no comprueba ciclos E2 aplicar (R, E); LR2 reglas-aplicables (E2); NODO hacer-nodo (E2, LR2); devolver (añadir (NODO, CAMINO)); AVANZAR(E,R,CAMINO) ;versión que sí comprueba ciclos E2 aplicar (R, E); Si repetido(e2,camino) entonces devolver(camino); si-no LR2 reglas-aplicables (E2); NODO hacer-nodo (E2, LR2); devolver (añadir (NODO, CAMINO)); Apuntes IAlC 25/26 III.2 Dpto. Leng.Ciencias Comp., Univ.Málaga

donde la función 'repetido(e,camino)' devuleve: 'cierto' si el estado de algún nodo del CAMINO es igual a E; o 'falso' en otro caso. Ejemplo: Sea el grafo de la figura. El estado inicial es el etiquetado como E1, y el final el etiquetado como E4. Supongamos que las reglas se prueban siempre en el orden creciente (R1, R2, R3, R4, R5, R6). En este grafo (un árbol, en realidad) no se presentan ciclos, por lo que puede utilizarse sin peligro la primera versión de 'avanzar'. E 1 R 1 R 3 R 2 E 2 E 3 E 6 R 4 R 5 R 6 E 4 E 5 E 7 La llamada a 'retroceso(e1)' construye una lista formada por un único nodo: E1 (R1, R2, R3) A continuación se realiza la primera llamada a rtr, donde: NODO es E1 (R1, R2, R3) E es E1 LR es (R1, R2, R3) R es R1 El resultado es una segunda llamada recursiva a rtr con la lista: E2 ( ) E1 (R2, R3) y donde: NODO es E2 ( ) E es E2 LR es ( ) R no toma valor El resultado es una tercera llamada a rtr con la lista: Apuntes IAlC 25/26 III.3 Dpto. Leng.Ciencias Comp., Univ.Málaga

E1 (R2, R3) El resultado es una cuarta llamada a rtr con la lista: E3 (R4, R5) E1 (R3) El resultado es una quinta llamada a rtr con la lista: E4 ( ) E3 (R5) E1 (R3) Como E4 es el estado final, la búsqueda termina con éxito devolviendo el camino resultante. Apuntes IAlC 25/26 III.4 Dpto. Leng.Ciencias Comp., Univ.Málaga

III.3.1.2. BÚSQUEDA CON PROFUNDIZACION PROGRESIVA. Consideremos un espacio de estados cuyo nodo s representa el estado inicial de un problema de búsqueda. El algoritmo de backtacking con profundización progresiva BID (Backtracking Iterative Deepening) se puede enunciar como sigue, dependiendo de la implementación de la búsqueda con retroceso empleada. a) BID (versión 1) Desarrollaremos primero una versión de BID partiendo del procedimiento BACKTRACK estudiado anteriormente: PROCEDIMIENTO BID (versión 1) bid (s) COTA ; Repetir SOLUCION backtrack-acotado(s, COTA, ); COTA COTA+1; hasta que SOLUCION <> FRACASO ; devolver (SOLUCION); fin-bid; PROCEDIMIENTO BACKTRACK-ACOTADO backtrack-acotado (E, COTA, PROF) Si finalp(e) entonces devolver (cons(e, NIL)); en otro caso, si PROF COTA entonces devolver ( FRACASO ); en otro caso, Para cada regla R aplicable a E E2 aplicar-regla(r,e); SOLUCION backtrack-acotado(e2, COTA, PROF+1); Si SOLUCION <> FRACASO entonces devolver (cons(e,solucion)); fin/para devolver ( FRACASO ); fin-backtrack-acotado; Nótese que 'backtrack-acotado' incorpora una nueva condición de retroceso respecto a 'backtrack': cuando la longitud del camino explorado supera un cierto límite. Es decir, primero se exploran todos los caminos de longitud 1; si ninguno lleva a un estado objetivo, se exploran los de longitud 2; y así hasta encontrar algún estado objetivo. Nótese que los nodos generados en un ciclo de profundización no se almacenan; en cada ciclo se vuelven a generar los nodos anteriormente generados. b) BID (versión 2) Desarrollaremos ahora una versión de BID aprovechando el procedimiento RTR descrito anteriormente. Nótese que la exploración realizada será la misma que con la versión anterior, siempre que no se comprueben ciclos. PROCEDIMIENTO BID (versión 2) bid(s); LR reglas-aplicables(s); N hacer-nodo(s, LR); CAMINO añadir(n, NIL); D ; repetir SOLUCION rtr-acotado(d, CAMINO, 1); D D+1 hasta que SOLUCION <> 'FRACASO'; devolver(solucion); fin-bid. Apuntes IAlC 25/26 III.5 Dpto. Leng.Ciencias Comp., Univ.Málaga

PROCEDIMIENTO RTR-ACOTADO rtr-acotado(lim_prof, CAMINO, PROF); NODO cabeza (CAMINO); E estado (NODO); LR lista-reglas (NODO); R cabeza (LR); según: vacío (CAMINO) : devolver ('FRACASO'); /*FRACASO*/ es-objetivo (E): devolver (CAMINO); /*ÉXITO*/ (PROF LIM-PROF) or (vacío (LR)): /*RETROCESO*/ devolver (rtr-acotado (LIM_PROF, resto(camino), PROF-1)); otro-caso: LR2 resto (LR); /*AVANCE*/ NODO2 hacer-nodo (E, LR2); NUEVO-CAM añadir(nodo2, resto (CAMINO)); devolver (rtr-acotado (LIM_PROF, avanzar (E,R, NUEVO-CAM) PROF+1)); fin-según; fin-rtr-acotado. Nótese que 'rtr-acotado' incorpora una nueva condición de retroceso respecto a 'rtr': cuando la longitud del camino explorado supera un cierto límite. Es decir, primero se exploran todos los caminos de longitud 1; si ninguno lleva a un estado objetivo, se exploran los de longitud 2; y así hasta encontrar algún estado objetivo. Nótese que los nodos generados en un ciclo de profundización no se almacenan; en cada ciclo se vuelven a generar los nodos anteriormente generados. c) Propiedades Ambas versiones de BID realizan la misma exploración (suponiendo que ninguno comprueba ciclos). Por tanto las propiedades son aplicables a ambos. Prop. Si hay una solución, el algoritmo BID acaba y encuentra una solución. Dem. Supongamos que hay una solución. Sea D el mínimo número de arcos que la conectan con s en el grafo. Es evidente que cada ciclo de profundización acaba, luego se llegará a alcanzar el ciclo con profundidad d=d, y en él se encontrará la solución y el algoritmo acabará. Consideremos ahora que el grafo es un árbol con factor de ramificación constante b. Prop. El número máximo Nm de nodos mantenidos en memoria simultáneamente por BID en función de la profundidad D a la que se encuentra el estado objetivo más superficial es de la forma O(D). Dem. El algoritmo de backtracking mantiene una sóla rama de búsqueda. La máxima longitud de esta rama es D, y a cada nivel de profundidad se ha generado 1 sucesor del nodo en el nivel anterior, luego en total se mantienen en el peor caso D nodos, que es de la forma O(D). Prop. El número máximo Ng de nodos generados por BID en función de la profundidad D a la que se encuentra el estado objetivo más superficial es de la forma O(b D ). Dem. Cada nodo a profundidad D se generará una sola vez (en el último ciclo de profundización); los nodos a profundidad D-1 se generarán 2 veces (en el último y el penúltimo ciclo);...; los nodos a profundidad 1 se generarán D veces, luego en total se generan o sea b D + 2b D-1 + 3b D-2 +... +(D-1)b 2 + Db nodos b D (1 + 2b -1 + 3b -2 +... + (D-1)b 1-(D-1) + Db 1-D ) y llamando x = 1/b b D (1 + 2x + 3x 2 +... +(D-1)x D-2 + Dx D-1 ) que es menor que la serie infinita b D Σ n x n y recordando que para -1 < x < 1 es Σ n x n = 1/(1-x) 2 Apuntes IAlC 25/26 III.6 Dpto. Leng.Ciencias Comp., Univ.Málaga

tenemos que el número de nodos es a lo sumo b D /(1-x) 2 o sea b D b 2 /(b-1) 2 que es de la forma O(b D ). 1 2 3 4 Figura 1. 5 Ejemplo: Sea el grafo de la figura 1. El estado inicial es el etiquetado con y el objetivo el etiquetado con 5. Supongamos que los sucesores se generan siempre de izquierda a derecha y que no se comprueba la aparición de ciclos. En estas circunstancias, el algoritmo BID genera la siguiente sucesión de caminos (por simplicidad se muestran sólo los estados): d=; d=1; d=2 2 3 4 2 2 24 2 25 solución. Nótese que el algoritmo acaba pese a la existencia de un ciclo en el grafo. Ejercicio propuesto: Nótese que las versiones presentadas de BID no terminan en grafos finitos cuando no hay solución. Realizar las modificaciones necesarias para que BID termine con fracaso en un número finito de pasos en tales situaciones. Apuntes IAlC 25/26 III.7 Dpto. Leng.Ciencias Comp., Univ.Málaga

III.3.1.4 SATISFACCION DE RESTRICCIONES. III.3.1.4.a Definiciones. Un problema de satisfacción de restricciones queda definido por los siguientes elementos: -un conjunto finito de variables {X1,..., Xn}. -para cada variable Xi, un conjunto finito Di llamado dominio. -un conjunto finito de restricciones {C1,..., Cp}. Cada restricción Cj se define mediante una lista sin repeticiones de variables [Xj1,..., Xja(j)] y un subconjunto Vj del producto cartesiano Dj1... Dja(j). El valor a(j) es la aridad de la restricción Cj y el subconjunto Vj es el conjunto de asignaciones permitidas por la restricción Cj. Habitualmente, una restricción Cj no viene dada explícitamente por enumeración de sus asignaciones permitidas, sino por una expresión booleana que para cada asignación de sus variables dará el valor verdadero o el valor falso. El planteamiento del problema es el siguiente: encontrar un valor vi para cada variable Xi tal que: i) vi Di ii) (vj1,..., vja(j)) Vj para toda restricción Cj cuyas variables sean [Xj1,..., Xja(j)], y cuyo conjunto de asignaciones permitidas sea Vj. EJEMPLO: Sean 3 variables X1, X2, X3, con el mismo dominio D1=D2=D3={1,2,3}. Supongamos dos restricciones C1, C2 dadas por las expresiones X1<X2, X2<X3. Más explícitamente, serán C1: [X1, X2], V1= {(1,2), (1,3), (2,3)} C2: [X2, X3], V2= {(1,2), (1,3), (2,3)} Es evidente que la única solución a este problema viene dada por la asignación (X1 1), (X2 2), (X3 3) III.3.1.4.b Búsqueda en árbol. Es posible plantear un problema de satisfacción de restricciones como una búsqueda en cierto espacio de estados, definido de la siguiente forma: -los estados son las asignaciones parciales admisibles de valores a un subconjunto de variables {X1,..., Xk}, k n. Una asignación parcial {(X1, v1)..., (Xk, vk)} (k n) es admisible cuando para toda restricción C cuyas variables (Xc1,..., Xcj) están todas en {X1,..., Xk}, las correspondientes tuplas (vc1,..., vcj) C. -el estado inicial es la asignación vacía. -Sea un estado s en el que se han asignado valores hasta la variable Xi. Los sucesores de s son las asignaciones admisibles en las que además de las variables consideradas en s, se ha dado un valor a la variable Xi+1. -los estados objetivo son las asignaciones en las cuales toda variable ha recibido un valor. El espacio así definido es un árbol, cuyas hojas serán todas las asignaciones de variables que satisfacen todas las restricciones. EJEMPLO: Con el ejemplo anterior, el espacio de estados es el de la figura 3. X1 1 X1 2 X1 3 X2 2 X2 3 X2 3 X3 3 Figura 3. Apuntes IAlC 25/26 III.8 Dpto. Leng.Ciencias Comp., Univ.Málaga

Es claro que una estrategia de búsqueda con retroceso permitirá generar de forma completa el árbol anterior. El algoritmo puede ser como sigue: Supongamos definidas una ordenación de las variables en una lista variables, y según ella las siguientes definidicones de las funciones variable(n), dominio(var) y la constante NUM-VAR variable(n) la variable n-ésima dominio(var) el dominio de la variable var NUM-VAR el número de variables del problema Representaremos las asignaciones por listas de pares (variable, valor). Supongamos también una función test(asignaciones) que, dada una asignación parcial de valores, devuelve verdadero, si es admisible, y falso en otro caso. La llamada inicial será RA(()), es decir, con la lista de asignaciones vacía. Supondremos también definidas las siguientes operaciones sobre listas: long(l) longitud de la lista L primero(l) primer elemento de la lista L resto(l) una lista como L, pero sin su primer elem. lista(a,b) una lista de la forma [A,B] añadir(e,l) una lista de la forma [E L] RA2(lista-asigs); ALGORITMO RA. si no test(lista-asigs) /*no se cumple alguna restr. */ entonces, devolver(fracaso); si long(lista-asigs) = NUM-VAR entonces, devolver(lista-asigs); num 1 + long(lista-asigs); /*num. orden de la sig. var */ var variable(num); valores dominio(var); loop si valores = [] entonces, devolver(fracaso); valor primero(valores); valores resto(valores); sig-asig lista(var, valor); sig-lista añadir(sig-asig, lista-asigs); resultado RA2(sig-lista); si resultado FRACASO entonces, devolver(resultado); fin-loop; fin-ra2; Cuando en una llamada se cumple la condición test(asignaciones), pero ninguna de las llamadas posteriores se llega a completar una solución, decimos que esa llamada es una llamada improductiva a RA. Ello corresponde a generar una asignación parcial admisible que no se puede completar de forma admisible. Por ello, a su nivel no se produce inmediatamente retroceso; sin embargo, ninguna de las llamadas que se originen a partir de ella producirá una salida. Por ejemplo, el el árbol anterior el nodo (X1, 2) se origina en una llamada improductiva; por el contrario, el nodo (X1, 1) se origina en una llamada productiva. III.3.1.4.c. Consistencia en arcos. Otro enfoque para el problema de satisfacción de restricciones viene dado por los algoritmos de consistencia en arcos, también llamados de filtrado o relajación. En estos algoritmos se realiza un procesamiento de los dominios Di previamente a la búsqueda en un árbol de asignaciones parciales. Consideramemos únicamente el caso de restricciones binarias (que afectan a dos variables). El caso más general se puede abordar mediante un procedimiento análogo (consistencia en hiperarcos). Un conjunto de restricciones binarias define un grafo de restricciones en el cual los nodos son las variables con sus dominios y existe un arco (i,j) siempre que haya una restricción binaria C que afecta a las variables Xi y Xj. Al aplicar un algoritmo de consistencia en arcos, se comienza considerando el grafo con todos los dominios completos. En cada paso se intenta eliminar algún elemento de algún dominio. En efecto, si existe una restricción C que Apuntes IAlC 25/26 III.9 Dpto. Leng.Ciencias Comp., Univ.Málaga

afecta a las variables Xi y Xj con un conjunto de asignaciones permitidas V, y el valor vk Di es tal que para ningún elemento vm Dj se tiene (vk, vm) V, entonces podremos eliminar vk de Di, ya que no puede formar parte de ninguna solución. En el mejor de los casos, la búsqueda en árbol no será necesaria pues los dominios quedarán reducidos de forma que su producto cartesiano genere todas las soluciones, y precisamente éstas. Si no es así, al menos se habrá reducido el tamaño original de los dominios, y la búsqueda será más sencilla. 1, 2, 3 X1 X3 x1<x2 X2 1, 2, 3 1, 2 X1 X3 x1<x2 X2 1, 2, 3 1, 2, 3 x2<x3 1, 2, 3 x2<x3 1, 2 X1 X3 x1<x2 X2 2, 3 1 X1 X3 x1<x2 X2 2, 3 1, 2, 3 x2<x3 3 x2<x3 1 X1 X3 x1<x2 2 X2 3 x2<x3 Figura 4. Aclaremos el procedimiento aplicándolo al ejemplo anterior (figura 4). Representaremos cada dominio por una caja en cuyo interior figuren todos los posibles valores. Comenzamos llenando cada caja con todos los elementos del dominio. Consideremos el arco (1,2); el valor 3 de X1 es incompatible con todos los valores de X2, pues es 3<1, 3<2, 3<3. Por tanto, eliminamos el valor 3 de la caja de X1. De la misma forma, considerando el mismo arco en sentido contrario, el valor 1 de X2 es incompatible con todos los valores de X1, por lo que se puede eliminar. Considerando de nuevo el arco (1,2) vemos que el valor 2 de X1 es incompatible con los valores que quedan en X2, así que también lo eliminamos. Por otra parte, si atendemos al arco (2,3) en sentido inverso, los valores 1 y 2 de X3 son incompatibles con los valores de X2. Por último, observamos que el valor 2 de X2 es incompatible con el único valor que queda en X3. El procesamiento ha acabado y la única solución es la que queda en el grafo: (X1 1), (X2 2), (X3 3). Nótese que no hemos definido por completo un algoritmo, pues no se ha dicho el orden en que se realizan las comprobaciones ni el paso en el que dejan de realizarse. Una posibilidad es la siguiente: Llamemos Q al conjunto de pares (r,s) tales que existe una restricción C que afecta a [Xr, Xs] (lógicamente tambien pertenecerá a Q el par (s, r) si exite restricción que afecte a [Xs, Xr]). Para cada elemento (r,s) Q llamemos Vrs al conjunto de pares (v,w) que satisfacen la restricción correspondiente al arco C. Apuntes IAlC 25/26 III.1 Dpto. Leng.Ciencias Comp., Univ.Málaga

ALGORITMO AC DE CONSISTENCIA DE ARCOS. repetir cambio falso para todo arco (i,j) Q para todo valor v Di eliminación verdadero; para todo w Dj si (v,w) Vij eliminación falso; salir para-todo w fin-si fin-para todo; si eliminación Di Di - {v}; cambio verdadero; fin-si fin-para todo fin-para todo hasta que cambio = falso Prop. El algoritmo AC termina. Efectivamente, se parte de conjuntos finitos de valores en un conjunto finito de dominios. En cada ejecución del ciclo repetir (única fuente posible de no terminación) se eliminan uno o más valores, salvo en la última, donde no se elimina ninguno. Por tanto, el ciclo repetir se ejecutará a lo sumo un número de veces igual al producto de los cardinales de cada dominio inicial. Cuando se alcanza la condición de terminación, para todo valor v de un dominio D y para todo dominio D conectado con D, existe al menos un valor w D tal que (v,w) satisface la restricción correspondiente al arco. Esta condición es la denominada 2-consistencia o consistencia en arcos. Prop. Si el grafo de restricciones es un árbol, y las variables se enumeran según el preorden del árbol, y los dominios son 2-consistentes, entonces la llamada inicial al algoritmo RA no produce ninguna llamada improductiva. Dem: se omite. EJEMPLO: Sean tres subconjuntos de N, X={5, 2, 4, 6}, Y={2, 4, 6, 1}, Z={5, 2, 4, 6}. Se pide escoger un número de cada conjunto de forma que el número escogido de Z divida tanto al escogido de X como al escogido de Y. El grafo de restricciones puede representarse por un árbol, por ejemplo 5, 2, 4, 6 X Z 5, 2, 4, 6 2, 4, 6, 1 Y El preorden del árbol considerado es (Z, X, Y). Aplicando el procedimiento AC comprobamos que el grafo es 2-consistente. Por tanto, si realizamos una búsqueda comenzando las asignaciones por la variable Z, el árbol generado no tendrá nodos improductivos: Apuntes IAlC 25/26 III.11 Dpto. Leng.Ciencias Comp., Univ.Málaga

Z=5 2 4 6 X=5 2 4 6 4 6 Y=1 2 4 6 1 2 4 6 1 2 4 6 1 4 6 Por el contrario, si realizamos la búsqueda con la ordenación (X, Y, Z), que no corresponde a ningún preorden del grafo de restricciones, el árbol tiene nodos improductivos: X=5 2 4 6 Y=2 4 6 1 2 4 6 1 2 4 6 1 2 4 6 1 Z= 2 2 2 2 2 2 2 4 2 2 2 2 2 6 2 Existen otros algoritmos que no realizan todas las comprobaciones que efectúa AC (algoritmos de retroceso con precomprobación y de retroceso con previsión parcial). También los hay que realizan más comprobaciones (algoritmos de k-consistencia). Apuntes IAlC 25/26 III.12 Dpto. Leng.Ciencias Comp., Univ.Málaga

III.3.2. Búsquedas heurísticas con retroceso: IDA* El algoritmo IDA* (Iterative Deepening A* - A* con Profundización Iterativa) es un algoritmo de búsqueda con retroceso que admite el mismo tipo de información heurística que el algoritmo de búsqueda con árbol A*. Consideremos un grafo G cuya raíz s representa el estado inicial de un problema de búsqueda. El algoritmo A* con profundización progresiva IDA* se puede enunciar como sigue: PROCEDIMIENTO IDA* poda f(s); sig-poda ; Camino [s]; REPETIR si Camino=[] y sig-poda = devolver('fracaso') en otro casi si Camino=[] poda sig-poda; empezar de nuevo; en otro caso si f(último(camino)) > poda actualizar sig-poda; retroceder; en otro caso si último(camino) Objetivos devolver(camino); en otro caso si otros-sucesores(último(camino))=[] retroceder; en otro caso avanzar; HASTA QUE FALSO. donde avanzar y retroceder tienen el significado habitual de la búsqueda con retroceso; empezar de nuevo supone volver al nodo inicial y emprender una nueva búsqueda con una nueva cota (sig-poda) para la poda; y sig-poda se va tomando como el menor de los valores encontrados que superan la actual cota de poda. Es decir, primero se exploran todos los caminos de coste hasta f(s); si ninguno lleva a un estado objetivo, se exploran los de coste c menor o igual que el menor de los costes anteriormente hallados que rebasaban la anterior cota de coste; y así hasta encontrar algún estado objetivo. Nótese que los nodos generados en un ciclo de profundización no se almacenan; en cada ciclo se vuelven a generar los nodos anteriormente generados. A diferencia del algoritmo A*, IDA* no mantiene las listas CERRADOS y ABIERTOS, ya que realiza una búsqueda con retroceso. Propiedades Prop. Admisibilidad. Si hay una solución y la función h(n) es una estimación optimista de h*(n), el algoritmo IDA* acaba y encuentra una solución de mínimo coste. Demostración. La cota de poda inicial es h(s) h*(s)=f*(s)=c*. Además, en cada nuevo ciclo de búsqueda la cota de poda es el mínimo valor que excedió la anterior cota, y siempre algún nodo n que yace en el camino solución tiene f(n) C*. Por tanto, la cota de poda llegará a ser exactamente C*, y en el correpondiente ciclo de búsqueda se encontrará un camino con coste C*. Prop. El número máximo Nm de nodos mantenidos en memoria simultáneamente por IDA* en función del coste óptimo C* y del coste mínimo de un arco c es de la forma O(C*/c). Llamemos factor de ramificación heurístico de un problema al factor B correspondiente a la aplicación de A* a dicho problema. Prop. Si el factor de ramificación heurístico es mayor que 1 y el espacio de estados es un árbol, entonces cuando crece la longitud de la solución el número de nodos generados por IDA* tiende asintóticamente al número de nodos generados por A*. Demostración. En el peor caso, el último ciclo de búsqueda de IDA* expande los mismos nodos que A*. Si el espacio es un árbol, cada nodo se expande a lo sumo una vez. Por otra parte, un argumento análogo al del algoritmo BID muestra que los nodos expandidos por IDA* en anteriores ciclos de búsqueda no afectan al valor asintótico del número total de nodos expandidos. Apuntes IAlC 25/26 III.13 Dpto. Leng.Ciencias Comp., Univ.Málaga

EJEMPLO. Sea el grafo de la figura 2. El estado inicial es el, el objetivo el 5, los costes de los arcos son los indicados. La función h toma los valores h()=2, h(1)=1, h(2)=1, h(3)=2, h(4)=1, h(5)=. 1 3,5 1 2 1 3,4 2 1 1 1,3 3 4 5 La aplicación de IDA* genera los caminos: Figura 2. poda= f()=2; f()=2 f(1)=2 f()=4 sig-poda se actualiza a 4. 2 f(2)=2,5 sig-poda se actualiza a 2,5. 3 f(3)=4 4 f(4)=5,4 2 f(2)=4 poda=2,5 f()=2 f(1)=2 f()=4 sig-poda se actualiza a 4. 2 f(2)=2,5 24 f(4)=4,5 2 25 f(5)=2,5 solución. Apuntes IAlC 25/26 III.14 Dpto. Leng.Ciencias Comp., Univ.Málaga