Programación con Restricciones Constraint Programming Introducción basada en Roman Barták: Guide to Constraint Programming http://kti.ms.mff.cuni.cz/~bartak/constraints/index.html Constraint Programming 1
Contenidos Introducción Satisfacción de restricciones Algoritmos de búsqueda sistemática Técnicas de consistencia Propagación de restricciones Ordenación de variables y valores Constraint Programming 2
Introducción I La programación con restricciones es una tecnología utilizada para la resolución de efectiva de problemas grandes, usualmente combinatorios, y especialmente en áreas como planificación y programación Multidisciplinar: inteligencia artificial, lenguajes de programación, lógica computacional y simbólica,... Inicios en la década de los 70 dentro de la IA junto con las redes de restricciones. Constraint Programming 3
Introducción II Programación con restricciones = generación de restricciones + solución Dominios Gráficos: coherencia geométrica Lenguaje natural: reconocedores eficientes Bases de datos: asegurar/restaurar consistencia Biología molecular: secuenciamiento DNA Aplicaciones de negocios: elección de mercados Ingeniería eléctrica: localización de averías Diseño de circuitos: especificación de esquemas Constraint Programming 4
Constraint Programming 5
Constraint Programming 6
Constraint Programming 7
Definiciones Programación con restricciones: 1. Especificar restricciones entre las variables del problema 2. Encontrar soluciones que satisfagan todas las restricciones Restricción: relación entre varios elementos desconocidos Ej. A+B=C, X<Y, N=LENGTH(S) Constraint Programming 8
Definiciones II Restricción = relación lógica entre variables desconocidas, cada una tomando un valor determinado de su dominio particular Una restricción limita los valores que puede tomar una variable Ejemplos El círculo C está dentro del rectángulo R La longitud de la palabra W es de 10 caracteres X es menor que Y La suma de los ángulos del triángulo es 180 Juan puede venir a clase el miércoles después de las 12:00 Propiedades Pueden especificar información parcial (no es necesario que precisen unívocamente el valor de sus variables) Son no direccionales Son declarativas Son aditivas Raramente son independientes Constraint Programming 9
Constraint Programing Es el estudio de sistemas computacionales basados en restricciones. La idea es la de resolver problemas mediante la especificación de restricciones (condiciones y propiedades) que debe satisfacer la solución Sub-áreas Satisfacción de restricciones Resolución de restricciones Constraint Programming 10
Satisfacción de restricciones Surge de los subcampos de IA de problemas combinacionales y búsqueda, y de el de gráficos por computador En un problema de satisfacción de restricciones (CSP) dados Un conjunto finito de variables Una función que asigna a cada variable un dominio finito Un conjunto finito de restricciones Cada restricción limita las combinaciones de valores que puede tomar simultáneamente un conjunto de variables. Una solución es una asignación a cada variable de un valor de su dominio que satisfaga todas las restricciones La tarea puede consistir en conseguir una o todas las soluciones Se resuelven con métodos de búsqueda. Constraint Programming 11
Resolución de restricciones Difiere de la satisfacción de restricciones en la utilización de variables con dominios infinitos Las restricciones individuales son también más complejas (pe. inecuaciones no lineales) Utilizan métodos algebraicos y numéricos en lugar combinaciones y búsqueda. Es posible discretizar dominios infinitos y aplicar entonces técnicas de satisfacción de restricciones. Constraint Programming 12
Satisfacción de restricciones Un Constraint Satisfaction Problem (CSP) se compone de Un conjunto de variables X={x 1,..., x n } Para cada variable x i, un conjunto finito de valores posibles D i (su dominio) Y un conjunto de restricciones limitando los valores que pueden tomar simultáneamente las variables de cada restricción Una solución de un CSP consiste en la asignación de un valor a cada variable de sus correspondientes dominios, de forma que se satisfagan todas las restricciones Podemos querer encontrar Sólo una solución, si preferir cual Todas las soluciones Una óptima o, al menos, una buena solución, dada una función objetivo definida en término de algunas o todas las variables Constraint Programming 13
Satisfacción de restricciones II Las soluciones se encuentran probando sistemáticamente todas las asignaciones posibles. Existen distintas familias de métodos de búsqueda: Explorar el espacio de asignaciones parciales Explorar el espacio de asignaciones completas (a todas las variables) estocásticamente. porqué no utilizar métodos como los de investigación operativa? La representación de un CSP es mucho más cercana al problema original En ocasiones los métodos de CS son más rápidos que los de programación entera Constraint Programming 14
Satisfacción de restricciones III qué veremos? Algoritmos de búsqueda sistemática Técnicas de consistencia Propagación de restricciones Ordenación de variables y valores Constraint Programming 15
Algoritmos de búsqueda sistemáticos La mayoría de los algoritmos utilizados para resolver CSP buscan sistemáticamente entre las asignaciones posibles de valores a variables. Garantizan encontrar una solución (si es que existe) Desventaja: ineficiencia Representativos Generar y Testear GT Vuelta atrás (cronológica) BT Constraint Programming 16
Generar y Testear GT Primero prueba una combinación y después comprueba si es correcta El número de combinaciones posibles es el producto cartesiano de todos los dominios de las variables Desventaja No es eficiente: genera muchas asignaciones erróneas Se puede mejorar fácilmente Backtracking Constraint Programming 17
Vuelta atrás BT Es el más usual de los que realizan busca sistemática Intenta extender una solución parcial incrementalmente con la asignación a una variable que sea consistente con la solución parcial obtenida hasta ese momento Si una solución parcial viola alguna restricción, se realiza la vuelta atrás con la variable que recibió su valor más recientemente y tiene valores alternativos BT es capaz de eliminar un subespacio del producto cartesiano de todos los dominios de las variables Aunque mejor que GT su complejidad computacional es exponencial Constraint Programming 18
Vuelta atrás. Desventajas Thrashing (vapulear, golpear?) Falla reiteradamente debido a la misma causa Ej. A, B, C, D, E: 1.. 10 A>E Intenta todas las asignaciones para B,C,D antes de encontrar que A <> 1 Se produce porque no detecta la causa real del conflicto Se puede evitar con Vuelta atrás inteligente (Backjumping) La vuelta atrás se produce al punto que genera el problema Trabajo redundante Aunque se identifiquen las variables conflictivas, no se almacenan para volver a detectar la misma situación posteriormente Ej. A, B, C, D, E: 1.. 10 B+8<D C=5*E En las asignaciones a C,E comprueba reiteradamente los valores 1..9 para D Métodos de vuelta atrás dirigidos por dependencias eliminan estos dos inconvenientes (backmarking, backchecking recuerda las asignaciones fallidas) Detecta conflictos demasiado tarde No es capaz de detectar el conflicto hasta que ocurre Ej. A, B, C, D, E: 1.. 10 A= 3*E El hecho de que A>2 se detecta al asignar E Se evita aplicando técnicas para comprobar por anticipado los posibles conflictos (forward checking) Constraint Programming 19
Técnicas de consistencia Aparecen en los primeros programas de reconocimiento de imágenes Consiste en descartar combinaciones que no conducen a soluciones antes de la búsqueda Reduce el espacio de búsqueda Se podrían utilizar sin búsqueda (aunque no es lo usual) Los algoritmos que fuerzan la consistencia en CSP binarios persiguen que una solución parcial que define una pequeña red (de restricciones) se pueda extender a una red adyacente Ejemplo: A:[3..7]; B:[1..5] con A<B resulta en A[3..4]; B[4..5] Tipos Nodo Arco Camino Constraint Programming 20
Consistencia de nodos Es la más simple de conseguir El nodo V es consistente a nivel de nodo si cada valor x de su dominio actual satisface todas las restricciones unarias sobre V Todos aquellos valores que violen alguna restricción unaria se eliminan del dominio Algoritmo NodeConsistency procedure NC for each V in nodes(g) for each X in the domain D of V if any unary constraint on V is inconsistent with X then delete X from D; endif endfor endfor end NC Constraint Programming 21
Consistencia de Arcos Persigue asegurar la consistencia de restricciones binarias (en CSP binarios) El arco (Vi,Vj) es consistente a nivel de arcos si para cada valor x en el dominio actual de Vi existe algún valor y en el dominio de Vj de forma que Vi=x y Vj=y es una combinación permitida por las restricciones binarias entre Vi y Vj NO es simétrica: Si (Vi,Vj) es consistente, no significa que (Vj,Vi) también lo sea. Sólo hay que eliminar aquellos valores de Vi para los que no existe algún valor en Vj que verifique las restricciones binarias entre Vi y Vj Constraint Programming 22
Consistencia de Arcos: REVISE procedure REVISE(Vi,Vj) DELETE <- false; for each X in Di do if there is no such Y in Dj such that (X,Y) is consistent, then delete X from Di; DELETE <- true; endif; endfor; return DELETE; End REVISE Para conseguir la consistencia en un grafo de restricciones no es suficiente con ejecutar este procedimiento una sola vez Cada vez que REVISE reduce el dominio de alguna variable Vi, algunos arcos (Vj,Vi) ya analizados, deben ser revisados nuevamente algoritmo AC-1 Constraint Programming 23
Consistencia de Arcos: AC-1 procedure AC-1 Q <- {(Vi,Vj) in arcs(g),i#j}; repeat CHANGE <- false; for each (Vi,Vj) in Q do CHANGE <- REVISE(Vi,Vj) or CHANGE; Endfor until not(change) end AC-1 Principal limitación Ineficiencia: cada modificación de un dominio fuerza la re-evaluación de todos los arcos AC-3 Constraint Programming 24
Consistencia de Arcos: AC-3 Es suficiente una cola de arcos para revisitar Sólo se incluyen en la cola los arcos afectados por la reducción del dominio. No se incluye el arco inverso al que provocó la reducción del dominio procedure AC-3 Q <- {(Vi,Vj) in arcs(g),i#j}; while not Q empty select and delete any arc (Vk,Vm) from Q; if REVISE(Vk,Vm) then Q <- Q union {(Vi,Vk) such that (Vi,Vk) in arcs(g),i#k,i#m} Endif Endwhile End AC- Constraint Programming 25
Conjuntos de apoyo Se comprueban muchos pares de valores en cada revisión del arco Dichos test se repiten cada vez que se revisa el arco Realmente los valores a,b,c no necesitan ser re-evaluados porque todavía tienen apoyos en V 2 distintos de a no podríamos computar los conjuntos de apoyo una vez y usarlos durante la revisión? Constraint Programming 26
Consistencia de Arcos: AC-4 procedure INITIALIZE Q <- {}; S <- {}; % initialize each element of structure S for each (Vi,Vj) in arcs(g) do % (Vi,Vj) and (Vj,Vi) are same elements for each a in Di do total <- 0; for each b in Dj do if (a,b) is consistent according to the constraint (Vi,Vj) then total <- total+1; Sj,b <- Sj,b union {<i,a>}; Endif endfor; counter[(i,j),a] <- total; if counter[(i,j),a]=0 then delete a from Di; Q <- Q union {<i,a>}; endif; endfor; endfor; return Q; end INITIALIZE procedure AC-4 Q <- INITIALIZE; while not Q empty select and delete any pair <j,b> from Q; for each <i,a> from Sj,b do counter[(i,j),a] <- counter[(i,j),a] - 1; if counter[(i,j),a]=0 & a is still in Di then delete a from Di; Q <- Q union {<i,a>}; Endif Endfor Endwhile end AC-4 Constraint Programming 27
Cálculo de los apoyos y su utilización Después de procesar el arco (i,j) de INITIALIZE Utilizando los conjuntos de apoyo 1. Sea b3 eliminado del domino de j (por algún motivo) 2. Examinando Sj,b3 encontramos los valores a los que b3 apoya 3. Decrementamos el contador para estos valores (indicarles que han perdido uno de los apoyos) 4. Si algún contador es cero (a3) eliminar el valor y repetir el procedimiento con el valor respectivo (ir a 1) Constraint Programming 28
Consistencia de Arcos AC-3 y AC-4 son los más utilizados AC-4 consigue el óptimo para el peor caso Su eficiencia media no es buena... y además consume gran cantidad de memoria También existen evoluciones como AC-5, AC-6, AC-7,... No está clara su eficacia (compromiso entre carga computacional, velocidad, y almacenamiento) Si después de aplicar consistencia de arcos el dominio de cada variable es uno, el CSP tendrá solución única En cualquier otro caso la respuesta no es general. Ejemplo: red de restricciones consistente en arcos, dominios no vacíos, y sin solución que satisfaga todas las restricciones... Constraint Programming 29
Consistencia de caminos Consistencia-k Consiste en aplicar un mayor grado de consistencia para salvar la ineficacia de la consistencia de arcos Un grafo es k-consistente cuando Seleccionamos k-1 variables que satisfagan todas las restricciones entre estas variables y tomar una k-ésima variable cualquiera, y existe un valor para la variable k-ésima que satisfaga todas las restricciones entre las k variables Un grafo es fuertemente k-consistente si es j-consistente para todo j<=k Consistencia de nodos es 1-consistente Consistencia de arcos es 2-consistente Consistencia de caminos >= 3-consistente Aunque existen algoritmos no se suelen utilizar por motivos de eficiencia: mayor consumo de memoria, baja relación potencia/eficiencia, amplia la red de restricciones y tampoco garantiza encontrar una solución Constraint Programming 30
Pensar globalmente CSP: los problemas se describen localmente Las restricciones afectan a pequeños conjuntos de variables La reducción de los dominios es pobre Analizar restricciones globales Aplicables sobre subproblemas concretos Utilizar información semántica para mejorar la eficiencia Ejemplo La consistencia local no detecta poda, aunque es posible eliminar algunos valores Constraint Programming 31
Propagación de restricciones Combina técnicas de backtracking con técnicas de consistencia. Backtracking-> construye una solución parcial y la va extendiendo con nuevas variables Consistencia-> se aplica después de cada nueva asignación Obtendremos distintos algoritmos de satisfacción de restricciones dependiendo de la técnica de consistencia aplicada Backtracking Forward checking Look ahead Constraint Programming 32
Backtracking Se puede ver como una combinación de GT y una fracción de consistencia de arcos Comprueba consistencia de arcos entre las variables instanciadas de la solución parcial y la nueva extensión que se pretende hacer Como los dominios de las variables de la solución parcial sólo contienen un valor, si se viola una restricción alguno de estos dominios se reducirán y se producirá el backtracking Podemos redefinir el algoritmo BT como sigue: Constraint Programming 33
Algoritmo AC-3 para backtracking procedure AC3-BT(cv) Q <- {(Vi,Vcv) in arcs(g),i<cv}; consistent <- true; while not Q empty & consistent select and delete any arc (Vk,Vm) from Q; consistent <- not REVISE(Vk,Vm) Endwhile return consistent end AC3-BT Donde Vcv es la siguiente variable a asignar Constraint Programming 34
Algoritmo AC-3 para backtracking ejemplo Constraint Programming 35
Forward checking Es una técnica que intenta prevenir posibles conflictos futuros Persigue consistencia de arcos sobre variables que todavía no han sido instanciadas. Consistencia de arcos restrictiva: sólo comprueba consistencia de arco entre la variable actual y las futuras Se eliminan de los dominios de las variables futuras aquellos valores que entran en conflicto con la asignación que se pretende realizar Se produce un backtracking cuando un dominio futuro se vacía Es casi siempre mejor opción que la vuelta atrás cronológica Detecta inconsistencias antes permitiendo podar el árbol de búsqueda mucho más que con backtracking simple Constraint Programming 36
Algoritmo AC-3 para Forward checking procedure AC3-FC(cv) Q <- {(Vi,Vcv) in arcs(g),i>cv}; consistent <- true; while not Q empty & consistent select and delete any arc (Vk,Vm) from Q; if REVISE(Vk,Vm) then consistent <- not Dk empty endif endwhile return consistent end AC3-FC Constraint Programming 37
Algoritmo AC-3 para Forward checking: ejemplo Constraint Programming 38
Look Ahead Persigue consistencia de arcos entre la variable actual y las futuras (full) look ahead o MAC (maintaining arc consistency) Detecta conflictos entre variables futuras Poda más ramas del árbol de búsqueda El coste computacional cada vez que se realiza un asignación también es mayor que con forward checking Constraint Programming 39
Algoritmo AC-3 para Look Ahead procedure AC3-LA(cv) Q <- {(Vi,Vcv) in arcs(g),i>cv}; consistent <- true; while not Q empty & consistent select and delete any arc (Vk,Vm) from Q; if REVISE(Vk,Vm) then Q <- Q union {(Vi,Vk) such that (Vi,Vk) in arcs(g),i#k,i#m,i>cv} consistent <- not Dk empty Endif Endwhile return consistent end AC3-LA Constraint Programming 40
Comparación de técnicas de propagación Cuanta más propagación de restricciones más poda en el árbol de búsqueda El costo computacional total será mayor Obtener n-consistencia para el problema original podría eliminar completamente la necesidad de búsqueda Suele ser más costoso que el backtracking simple Para algunos problemas look-ahead puede ser más costoso que forward checking Constraint Programming 41
Ordenación de variables y valores Los algoritmos de búsqueda requieren especificar el orden en el que se instancian las variables y el orden en el que se les asignan valores. La elección del orden adecuado (de variables y valores) incide significativamente en la eficiencia de la satisfacción de restricciones Constraint Programming 42
Ordenación de variables Estático: se especifica antes de que comience la búsqueda Dinámico: la elección de la siguiente variable depende en cada momento del estado actual de la búsqueda. No es viable para todos los algoritmos de búsqueda (ej. Backtracking simple) Heurísticas Intentar primero donde sea más probable que falle (ej. primero la variable con menos alternativas) Intentar primero la variable que participe en más restricciones Elegir la variable con el mayor número de restricciones con las variables pasadas Constraint Programming 43
Ordenación de valores Es indiferente si se buscan todas las soluciones o no existe solución La ordenación ideal permitiría encontrar la primera solución sin backtracking Se suele aplicar el principio de las correctas primero Valores que maximizan el número de opciones disponibles Usar el count del AC-4 Valores que conducen a una solución más fácil Existen métodos para evaluar la dificultad de resolución de un CSP Usar conocimiento del dominio Constraint Programming 44
Por qué utilizar Constraint Programming? Cercano a los problemas reales (combinatorios) Todos utilizan restricciones para especificar las propiedades de los problemas Las restricciones de la vida real pueden ser descritas con naturalidad utilizando restricciones Carácter declarativo Se concentra en la descripción del problema más que en resolverlo Resolución de problemas cooperativa Estructura unificada para integrar varias técnicas de resolución Búsqueda simple y técnicas sofisticadas de propagación Semánticamente puro Lenguajes de programación claros y elegantes Bases en programación lógica Aplicaciones Existen múltiples aplicaciones reales Constraint Programming 45
Notas finales Restricciones Relaciones arbitrarias sobre variables del problema Expresan información local parcial de forma declarativa Tecnología Búsqueda combinada con propagación de restricciones Búsqueda local Es fácil especificar problemas combinatorios en términos de CSP.. Pero es más difícil diseñar modelos resolubles Constraint Programming 46