# Problema de satisfacción de restricciones

Problemas de satisfacción de restricciones (CSP, por sus siglas en inglés), son problemas matemáticos definidos como un conjunto de objetos tal que su estado debe satisfacer un número de restricciones o limitaciones. Los CSP representan las entidades de un problema como una colección homogénea finita de restricciones sobre variables, las que son resueltas por métodos de satisfacción de restricciones. Los CSP son el tema de una intensa investigación en Inteligencia Artificial e Investigación de operaciones, dado que la generalidad en su formulación provee un principio básico para analizar y resolver problemas de distintos tipos. Los CSP a menudo muestran gran complejidad, requiriendo una combinación de métodos heurísticos y búsqueda combinatoria para ser resueltos en un tiempo razonable. El Problema de satisfacibilidad booleana (SAT), las Teorías de satisfacibilidad módulo (SMT) y la Programación de conjuntos de respuestas (ASP) pueden ser a grandes rasgos modelados como una forma de problema de satisfacción de restricciones.
Ejemplos de problemas sencillos que pueden ser modelados como problema de satisfacción de restricciones.
* Problema de las ocho reinas
* Teorema de los cuatro colores Problema de coloración de mapas
* Sudoku, Futoshiki, Kakuro (Cross Sums), Numbrix, Hidato y muchos otros puzles
En general, los problemas de restricciones pueden ser más complejos.
Ejemplos de la vida real son Planeamiento y Asignación de recursos.

## Definición formal

Formalmente, un problema de satisfacción de restricción es definido como un triplo $\langle X,D,C\rangle$, donde $X$ es un conjunto de variables, $D$ es el dominio de valores, y $C$ es un conjunto de restricciones. Toda restricción $c\in C$ es un par $\langle t,R\rangle$ (usualmente representado como una matriz), donde $t$ es una $n$-Tupla de variables y $R$ es una relación $n$-aria en $D$. Una evaluación de las variables es una función del conjunto de variables al dominio de valores, $v:X\rightarrow D$. Una evaluación $v$ satisfice una restricción $\langle (x_{1},\ldots ,x_{n}),R\rangle$ si $(v(x_{1}),\ldots ,v(x_{n}))\in R$. Una solución es una evaluación que satisfice todas las restricciones.

## Resolución de CSP

Los problemas de satisfacción de restricciones en un dominio finito son resueltos típicamente usando una forma de algoritmo de búsqueda. Las técnicas más usadas son variantes de búsqueda con retroceso cronológico (backtracking), propagación de restricciones, y búsqueda local.
Vuelta atrás es un algoritmo recursivo. Mantiene una asignación parcial de las variables. Inicialmente, todas las variables están sin asignar. En cada paso, una variable es seleccionada, y todos los posibles valores son asignados a la variable por turnos. Por cada valor, la consistencia de la asignación parcial es chequeada con respecto a las restricciones; en caso de consistencia, un llamado recursivo es hecho. Cuando todos los valores fueron probados, el algoritmo hace backtracking. En este algoritmo básico con retroceso cronológico, la consistencia es definida como la satisfacción de todas las restricciones donde las variables estén asignadas. Existen algunas variantes de backtracking. Backmarking mejora la eficiencia del chequeo de consistencia. Backjumping permite guardar parte de la búsqueda por backtracking "más de una variable" en algunos casos. Aprendizaje por restricciones infiere y guarda nuevas restricciones que pueden ser usadas luego para evitar parte de la búsqueda. Look-ahead es también a menudo usado en backtracking para intentar prever el efecto de seleccionar una variable o un valor, por lo tanto, determinar a veces con anticipación cuándo es satisfasible o insatisfasible un subproblema.
Las técnicas de propagación de restricciones son métodos usados para modificar un problema de satisfacción de restricciones. Más específico, son métodos que fuerzan una forma de consistencia local, que son condiciones relacionadas con la consistencia de un grupo de variables y/o restricciones. Propagación de restricción tiene varios usos. Primero, cambia el problema en otro que es equivalente pero usualmente más simple de resolver. Segundo, puede probar la satisfacibilidad o la insatisfacibilidad de problemas. En general no hay garantía de que esto ocurra; sin embargo, siempre ocurre para algunas formas de propagación de restricción y/o para algunos tipos de problemas específicos. Las formas más conocidas y usadas de consistencia local son consistencia de arco, consistencia de híper arco, y consistencia de camino. El método de propagación de restricción más popular es el algoritmo AC-3, el cual asegura consistencia de arco.
Los métodos de búsqueda local son algoritmos de satisfacibilidad incompleta. Ellos pueden encontrar una solución al problema, pero pueden no encontrarle incluso si el problema es satisfasible. Ellos trabajan mejorando iterativamente una asignación completa de las variables. En cada paso, un grupo pequeño de variables les son cambiados los valores, con el objetivo fundamental de incrementar el número de restricciones que satisfacen la actual asignación. El algoritmo de Min-Conflictos es específico de búsqueda local para CSPs basado en ese principio. En la práctica, búsqueda local parece funcionar bien cuando estos cambios son también afectados por una selección aleatoria.

## Aspectos teóricos de CSP
### Problemas de decisión

CSPs son estudiados también en Teoría de la complejidad computacional. Una pregunta importante es si para cada conjunto de relaciones, el conjunto de todos los CSPs que pueden ser representado usando solo las relaciones escogidas de ese conjunto están en P o NP-completo. Si el teorema Dicotomía es verdadero, entonces CSPs provee uno de los subconjuntos más grandes conocidos de NP los que evitan problemas NP-intermedio, cuya existencia fue demostrada por el teorema de Ladner bajo la suposición que P ≠ NP. El teorema de Schaefer sobre dicotomía maneja el caso cuando todas las relaciones disponibles son operadores booleanos, eso es para dominio de tamaño 2. El problema de dicotomía de Schaefer fue recientemente generalizado clases grandes de relaciones.
Todo CSP pude ser también considerado como un problema de conjunción de preguntas.

### Problemas de funciones

Una situación similar existe entre las clases funcionales FP y #P. Por una generalización del teorema de Ladner, también hay problemas que no son FP ni #P-completo tan grande como FP ≠ #P. Como en el caso de decisión, un problema en el #CSP es definido por un conjunto de relaciones. Cada problema toma una fórmula booleana como entrada y la tarea es computar el número de asignaciones que satisfacen las restricciones. Esto puede ser generalizado usando tamaño de dominios grandes y fijar un peso asignación que satisface y computando la suma de estos pesos. Es conocido que cualquier problema complejo con peso #CSP está en FP o #P-hard.

## Variantes de CSP

El modelo clásico de Problema de Satisfacción de Restricciones define un modelo estático, inflexible de restricciones. Este modelo rígido es un defecto que lo hace difícil para representar problemas fácilmente. Varias modificaciones a la definición básica de CSP han sido propuestas para adaptar el modelo a una amplia variedad de problemas.

### CSP dinámicos

Los CSP dinámicos (DCSP) son usados cuando la formulación original de un problema es alterado de alguna forma, típicamente porque el conjunto de restricciones a considerar cambia por el entorno. los DCSP son vistos como una secuencia de CSP estáticos, cada uno es una transformación del anterior en el que variables y restricciones pueden ser adicionadas (restriction) o eliminadas (relaxation). La información encontrada en la formulación inicial del problema puede ser usada para refinar los siguientes. El método de solución puede ser clasificado acorde a la forma en que la información es transferida:
* Oracles: las soluciones encontradas de los anteriores CSP en la secuencia son usadas como heurísticas para guiar la resolución del actual CSP.
* Local repair: cada CSP es calculado comenzando desde la solución parcial del CSP anterior y reparando las inconsistencias con búsqueda local.
* Constraint recording: nuevas restricciones son definidas en cada estado de la búsqueda para representar el conocimiento de inconsistencia de grupo de las decisiones. Esas restricciones son llevadas hacia el nuevo CSP.

### CSP flexible

Los CSP clásicos tratan las restricciones como fuertes, significan que son inviolables (cada solución las debe satisfacer por completo) e inflexible (en este sentido las restricciones deben ser completamente cumplidas o por el contrario son completamente violadas). Los CSP flexibles relajan estas suposiciones, relajan parcialmente las restricciones y permiten a la solución no cumplir con exactamente todas las restricciones. Algunos tipos de CSP flexible incluyen:
* MAX-CSP, donde un número de restricciones son permitidas que se violen, y la calidad de la solución es medida por el número de restricciones cumplidas.
* Weighted CSP, un MAX-CSP en el cual cada restricción violada es penalizada acorde a una preferencia predefinida. Es preferida la solución con menos penalizaciones.
* Fuzzy CSP modela las restricciones como relaciones de Lógica difusa en las cuales el cumplimiento de una restricción es una función continua de los valores de las variables, yendo desde completamente cumplidas hasta completamente violadas.