Clase 5 — CSP: modelado, backtracking y propagación de restricciones
Pregunta central
¿Cómo modelar y resolver problemas en los que importa encontrar una asignación completa que satisfaga restricciones, más que el camino utilizado para llegar a ella?
Respuesta breve
Un problema de satisfacción de restricciones o CSP se describe mediante variables , el dominio de cada variable y restricciones que indican qué combinaciones son válidas. Se resuelve normalmente con búsqueda en profundidad especializada (backtracking), evitando asignaciones inconsistentes, propagando restricciones para reducir dominios y eligiendo con cuidado la siguiente variable y el orden de sus valores.
Ruta conceptual
flowchart LR P["Problema"] --> M["Modelar: X, D, C"] M --> B["Backtracking"] B --> F["Filtrado de dominios"] F --> A["Consistencia de arcos / AC-3"] B --> H["MRV y valor menos restrictivo"] A --> S["Solución o fallo"] H --> S
1. ¿Por qué Sudoku cambia el tipo de búsqueda?
Hasta esta clase se habían usado supuestos clásicos: un solo agente, acciones deterministas, observabilidad total y estados discretos. En BFS, DFS, costo uniforme o A*, el camino y su costo suelen importar. En Sudoku ocurre algo diferente:
- la respuesta importante es el tablero final válido;
- cualquier solución completa asigna las mismas casillas, por lo que todos los caminos tienen esencialmente la misma profundidad;
- muchas secuencias de asignaciones representan la misma solución porque asignar primero y luego equivale a hacerlo en el orden contrario si no hay conflicto.
Por eso conviene explotar la estructura interna del problema en vez de tratar cada tablero parcial como un estado opaco.
| Búsqueda de caminos | CSP |
|---|---|
| Importa cómo se llega a la meta | Importa la asignación final |
| Los caminos pueden tener costos distintos | Las asignaciones suelen tener costo uniforme |
| La expansión genera acciones generales | Cada paso asigna una variable |
| La prueba reconoce un estado objetivo | Exige completitud y todas las restricciones |
2. Definición formal de un CSP
Un CSP se representa como la terna
donde:
- es el conjunto de variables;
- contiene el dominio de cada variable;
- es el conjunto de restricciones.
Una asignación parcial da valores solo a algunas variables. Es consistente si no viola ninguna restricción aplicable. Una solución es una asignación completa y consistente.
Diferencia esencial
Un dominio enumera lo que una variable podría valer por sí sola; las restricciones determinan qué combinaciones de valores pueden coexistir.
El siguiente explorador permite modificar asignaciones y observar cuándo aparece un conflicto:
En el mapa, una variable representa cada región y la restricción binaria exige colores distintos entre vecinas. En 4-reinas, una variable por columna elimina de entrada la posibilidad de colocar dos reinas en la misma columna; todavía deben imponerse las restricciones de fila y diagonal.
3. Ejemplos de formulación
3.1 Sudoku
- Variables: una por cada casilla vacía, en la fila y columna .
- Dominio inicial: , reducido por los números ya presentes.
- Restricciones: todos los valores de cada fila, columna y región deben ser diferentes.
Pueden escribirse 27 restricciones globales AllDifferent: nueve filas, nueve columnas y nueve subcuadros. Una asignación como propaga información a todas las casillas que comparten fila, columna o bloque.
3.2 Coloreado de mapas
Para el mapa de Australia:
Cada frontera crea una restricción binaria, por ejemplo
Una restricción puede expresarse:
- intensionalmente o de forma implícita: mediante una regla como ;
- extensionalmente o de forma explícita: enumerando parejas permitidas, como .
Precisión de terminología
«» no describe correctamente una restricción explícita. Una restricción extensional lista tuplas admitidas; una intensional las define con una relación o fórmula.
3.3 Criptoaritmética: TWO + TWO = FOUR
- Variables: y acarreos .
- Dominios: letras en ; acarreos en .
- Restricciones: letras diferentes usan dígitos diferentes; , y, por columnas:
Una solución es , pues .
3.4 N-reinas
Una formulación compacta usa una variable por columna; indica la fila de la reina de esa columna:
Para toda pareja :
La primera desigualdad impide compartir fila; la segunda impide compartir diagonal.
4. Tipos de variables y restricciones
Según el dominio
- Discretas finitas: colores, booleanos, dígitos. Con variables y dominios de tamaño , la búsqueda ingenua considera hasta asignaciones.
- Discretas infinitas: enteros o cadenas; por ejemplo, horas de inicio sin cota fijada.
- Continuas: valores reales. Si restricciones y objetivo son lineales se relacionan con programación lineal; si no, con optimización no lineal.
Según la aridad
- Unaria: involucra una variable, como .
- Binaria: involucra dos, como .
- De orden superior o global: involucra tres o más, como
AllDifferent(X₁,…,X₉).
Fuertes y suaves
- Una restricción fuerte debe cumplirse; de lo contrario la asignación no es solución.
- Una restricción suave expresa preferencia o costo, como «rojo es preferible a verde». Entonces se busca la mejor asignación factible, lo que conduce a CSP ponderados u optimización con restricciones.
5. Formulación como problema de búsqueda
- Estado inicial: asignación vacía .
- Estado: valores asignados hasta ahora.
- Sucesor: escoger una variable no asignada y darle un valor consistente.
- Prueba de meta: todas las variables están asignadas y todas las restricciones se satisfacen.
Si se permitiera asignar cualquier variable en cada paso, la misma solución aparecería en órdenes distintos. Como las asignaciones son conmutativas, se fija una variable por nivel. Así, con dominio máximo , el árbol tiene profundidad y factor de ramificación de hasta , sin permutaciones redundantes.
6. Búsqueda con backtracking
El backtracking es DFS especializado para CSP:
- Si la asignación está completa, devolverla.
- Seleccionar una variable no asignada.
- Recorrer sus valores en algún orden.
- Si el valor es consistente, añadirlo a la asignación.
- Llamar recursivamente.
- Si la rama falla, retirar la asignación y probar el siguiente valor.
- Si no queda ningún valor, devolver fallo al nivel anterior.
BACKTRACK(asignación, csp):
si asignación está completa: devolver asignación
var ← seleccionar-variable-no-asignada(...)
para cada valor en ordenar-valores(var, ...):
si valor es consistente:
añadir {var = valor}
resultado ← BACKTRACK(asignación, csp)
si resultado ≠ fallo: devolver resultado
retirar {var = valor}
devolver falloEl retroceso no significa reiniciar. Solo deshace la decisión más reciente que aún tiene alternativas. Revisar restricciones después de cada decisión evita recorrer hasta el fondo ramas que ya son imposibles.
Completo no significa eficiente
El backtracking sistemático es completo para dominios finitos, pero en el peor caso sigue siendo exponencial. El rendimiento depende mucho del filtrado y del orden de variables y valores.
7. Filtrado y propagación de restricciones
El filtrado mantiene el dominio restante de cada variable y elimina valores que ya no pueden participar en una solución.
Revisión hacia adelante (forward checking)
El filtrado intenta reducir por anticipado los dominios de las variables no asignadas: elimina valores que, dada la asignación parcial actual, ya sabemos que obligarían a retroceder más adelante.
Forward checking es una forma básica de filtrado. Cada vez que se asigna , revisa las variables no asignadas que comparten una restricción con y elimina de sus dominios los valores incompatibles con .

(https://inst.eecs.berkeley.edu/~cs188/textbook/csp/filtering.html)
Por ejemplo, en el mapa de Australia, asignar elimina rojo de y . Si algún dominio queda vacío, la rama no puede producir una solución y se hace backtracking inmediatamente.
Su límite es local: solo propaga desde la variable recién asignada hacia sus vecinas no asignadas. No revisa todavía las restricciones entre dos variables que siguen sin asignar; la consistencia de arcos amplía esa propagación a cambio de realizar más cómputo.
Laboratorio interactivo: forward checking en N-reinas
En esta representación hay una variable por fila y su dominio contiene las columnas donde todavía puede colocarse una reina. Cada nueva reina elimina de las filas futuras su columna y sus diagonales; si alguna fila se queda sin opciones, la rama se descarta de inmediato y el algoritmo retrocede.
Qué observar
Avanza paso a paso y compara el tablero con el árbol. Las casillas descartadas muestran la poda anticipada: son decisiones que el algoritmo ya no necesita intentar. Un dominio vacío explica exactamente por qué comienza el backtracking.
Referencias para repasar
Consistencia de arcos
Para una restricción binaria entre y , el arco dirigido es consistente si
El valor es un soporte para . Si un no tiene soporte, se elimina de . La dirección importa: puede ser consistente aunque no lo sea.
Desarrollo detallado
Antes de estudiar el algoritmo completo, revisa Consistencia de arcos para fijar las ideas de dirección y soporte.
AC-3 paso a paso
- Insertar en una cola todos los arcos dirigidos.
- Extraer un arco .
- Eliminar de cada valor sin soporte en .
- Si cambió, volver a encolar los arcos de sus otros vecinos, pues perdieron posibles soportes.
- Si algún dominio queda vacío, declarar inconsistencia.
- Terminar cuando la cola quede vacía.
AC-3(csp):
cola ← todos los arcos del csp
mientras cola no esté vacía:
(Xi, Xj) ← extraer(cola)
si REVISAR(Xi, Xj):
si D(Xi) está vacío: devolver fallo
para cada Xk vecino de Xi, Xk ≠ Xj:
añadir (Xk, Xi) a cola
devolver csp con dominios reducidosPara dominio máximo y arcos, una cota usual de AC-3 es . Reducir dominios antes o durante la búsqueda puede ahorrar una gran cantidad de ramificaciones.
Visualización: propagación mediante la cola de AC-3
La cadena muestra por qué un arco debe volver a la cola: reducir puede hacer que valores de pierdan el soporte que tenían cuando se revisó por primera vez.
Orden de lectura
Sigue un valor eliminado de derecha a izquierda: primero cambia por la restricción con y después ese cambio obliga a revisar de nuevo .
Caso aplicado: coloreo de un mapa
Ahora traslada la misma idea a un subproblema de cuatro regiones. SA ya está fijada en azul y cada arista significa «colores distintos». Avanza un paso a la vez: la flecha marca el arco dirigido actual, los puntos muestran los dominios y el registro explica cada poda y reinserción.
Qué observar
Distingue siempre de : revisar una dirección solo elimina valores de . Si ese dominio cambia, AC-3 vuelve a poner en la cola los arcos de otros vecinos que apuntan hacia .
Para estudiar con detalle
Consulta Algoritmo AC-3, donde se justifican las reinserciones, se explica la complejidad y se reúnen las referencias de Berkeley, Russell–Norvig y Mackworth.
Qué puede ocurrir después de propagar
- Todos los dominios son unitarios: se obtuvo una solución.
- Quedan varios valores: todavía hace falta búsqueda.
- Aparece un dominio vacío: esa rama no tiene solución.
- Todos los arcos son consistentes y aun así el CSP global podría no tener solución.
Consistencia local ≠ solución global
AC-3 descarta valores imposibles por relaciones binarias locales, pero no decide todos los CSP. Normalmente se combina con backtracking: decidir, propagar y retroceder si aparece un dominio vacío.
8. Ordenamiento: buscar primero donde más informa
MRV: variable más restringida
Elegir la variable no asignada con el menor dominio restante:
Es la estrategia fail first: si una variable está a punto de quedarse sin opciones, conviene descubrirlo ahora.
Heurística de grado
Si varias variables empatan en MRV, elegir la que participa en más restricciones con otras variables no asignadas. Esa decisión tiene mayor capacidad de propagación.
LCV: valor menos restrictivo
Para la variable elegida, probar primero el valor que elimina menos opciones de los dominios vecinos. Así se conserva flexibilidad para completar la solución.
| Decisión | Heurística | Pregunta |
|---|---|---|
| Elegir variable | MRV | ¿Cuál tiene menos valores disponibles? |
| Desempatar variable | Grado | ¿Cuál restringe a más vecinas? |
| Elegir valor | LCV | ¿Cuál deja más opciones a las demás? |
MRV intenta encontrar pronto el fallo; LCV intenta que la rama elegida sobreviva. No se contradicen porque actúan en momentos distintos.
Primero: distinguir las dos decisiones
La primera pestaña compara tamaños de dominio para elegir una variable con MRV. La segunda mantiene fija la variable y compara cuánto poda cada color para elegir un valor con LCV.
Regla mental
MRV elige la variable; LCV ordena sus valores. El filtrado ocurre antes o de forma provisional para medir los dominios que ambas heurísticas utilizan.
Después: laboratorio completo de MRV y LCV
Este visualizador resuelve el coloreado del mapa de Australia y muestra simultáneamente el grafo de restricciones, el árbol de búsqueda y el registro de decisiones. Al activar o desactivar MRV y LCV se puede comparar cómo cambia el orden de exploración; los controles permiten reproducir el proceso completo o avanzar paso a paso.
Qué observar
MRV cambia qué región se asigna a continuación; LCV ordena los colores según las opciones que quitan a las vecinas. Reinicia después de cambiar una heurística. En estados simétricos varios colores pueden empatar: ese empate también es un resultado correcto.
Referencias para repasar
9. Esquema integrado del solucionador
flowchart TD I["Asignación parcial"] --> C{"¿Completa?"} C -->|Sí| S["Devolver solución"] C -->|No| V["Elegir variable: MRV + grado"] V --> L["Ordenar valores: LCV"] L --> P["Probar valor consistente"] P --> F["Forward checking / AC-3"] F --> E{"¿Algún dominio vacío?"} E -->|No| I E -->|Sí| R["Deshacer asignación"] R --> M{"¿Quedan valores?"} M -->|Sí| P M -->|No| B["Retroceder otro nivel"] B --> R
La secuencia mental útil es:
Modelar → elegir → asignar → propagar → detectar fallo → retroceder.
10. Ejemplo completo de propagación
Sean con y .
- Inicialmente .
- En , no tiene soporte; queda .
- En , no tiene soporte; queda .
- En , no tiene soporte; queda .
- Como cambió, se revisan otra vez los arcos relacionados: queda y .
La propagación obtiene la solución única:
11. Aplicaciones y herramientas
Aplicaciones: calendarización de clases, turnos y trabajos; asignación de personas, máquinas o frecuencias; transporte y logística; planeación de producción; configuración de productos y diseño de circuitos.
Herramientas mencionadas: MiniZinc, OR-Tools, CPLEX, Gurobi, Gecode y Chuffed. Algunas son modeladores o solucionadores de programación por restricciones y otras se orientan a optimización matemática, pero todas permiten expresar decisiones sujetas a restricciones.
12. Errores comunes
- Confundir dominio con restricción: el dominio es local; la restricción relaciona valores.
- Aceptar una asignación solo porque es completa: también debe ser consistente.
- Creer que forward checking y AC-3 son iguales: AC-3 propaga entre variables aún no asignadas.
- Creer que consistencia de arcos garantiza una solución: es local, no global.
- Elegir primero la variable con más valores: MRV propone lo contrario.
- Confundir «variable más restringida» con «valor menos restrictivo»: una elige variable; la otra ordena valores.
Resumen después de clase
Un CSP representa explícitamente variables, dominios y restricciones, y busca una asignación completa válida en lugar de optimizar el camino recorrido. Backtracking elimina permutaciones redundantes al asignar una variable por nivel y retrocede cuando una decisión no puede completarse. Forward checking y AC-3 reducen dominios para detectar fallos antes; MRV, grado y LCV mejoran el orden de exploración. Sudoku, coloreado de mapas, criptoaritmética y N-reinas comparten esta estructura.
Preguntas de autoevaluación
- ¿Por qué una asignación parcial consistente todavía puede conducir a un callejón sin salida?
- ¿Qué diferencia hay entre revisar y revisar ?
- ¿Por qué se vuelven a encolar arcos cuando AC-3 reduce un dominio?
- ¿En qué sentido MRV sigue el principio fail first?
- ¿Por qué LCV puede ser útil después de elegir la variable más restringida?
- Formula un horario de tres materias como .
Conceptos para extraer
- Problema de satisfacción de restricciones
- Backtracking
- Forward checking
- Consistencia de arcos
- Algoritmo AC-3
- Heurística MRV
- Valor menos restrictivo
Referencias mencionadas
- Diapositivas de la clase
- Russell y Norvig, Artificial Intelligence: A Modern Approach, capítulo sobre CSP.
Acciones adicionales
- Formular un Sudoku reducido como CSP.
- Ejecutar manualmente AC-3 sobre un ejemplo de coloreado de mapas.
- Comparar backtracking puro, MRV y MRV + propagación.