Introducción práctica a la programación por restricciones: CP-SAT y Python
Paradigma declarativo
- La programación por restricciones (CP) es un paradigma declarativo para resolver problemas de optimización discreta
- A diferencia de la programación imperativa, se describe el resultado deseado y el programa deriva por sí mismo la solución
- Por ejemplo, se explica la diferencia entre el enfoque imperativo y el declarativo al extraer una lista de personas adultas
Fundamentos de la programación por restricciones (CP)
- Modelo: describe el resultado deseado del problema
- Variables: los valores que se quieren encontrar; cada variable tiene un dominio (conjunto de valores permitidos)
- Restricciones: describen las relaciones entre las variables
- Solución: asignar valores a las variables para satisfacer las restricciones
Ejemplo práctico con Python y CP-SAT
- Problema: generar el horario semanal de trabajo de empleados
- Creación del modelo: se crea un modelo vacío usando CP-SAT
- Datos: se definen la lista de empleados y sus roles, los días de trabajo y los turnos
- Definición de variables: se crean variables booleanas que indican si cada empleado trabaja o no
- Agregar restricciones: se añaden restricciones a las variables según la descripción del problema
Resolución del modelo
- Resolución: se resuelve el modelo y se obtiene el resultado
- Restricciones adicionales: se agregan restricciones extra como evitar horas extra, limitar las horas de ciertos empleados y evitar superposición de horarios entre determinados empleados
Intermedio: estado de la solución
- Estado de la solución: devuelve estados como óptimo, factible, infactible o desconocido
- Ejemplo: se explica cada estado mediante un ejemplo sencillo
"Lo siento, Emma"
- Estado infactible: no es posible que Emma descanse 5 días entre semana
- Propuesta alternativa: se propone que Emma descanse solo 3 días entre semana
Objetivo: distribución uniforme de las horas de trabajo
- Agregar objetivo: se añade un objetivo para distribuir de forma uniforme las horas de trabajo
- Resultado: las horas de trabajo quedan repartidas equitativamente entre los empleados
Conclusión
- Introducción a los conceptos básicos: se presentan los conceptos fundamentales de la programación por restricciones y se explican con un ejemplo práctico
- Adelanto del próximo artículo: el siguiente artículo tratará sobre cómo usar programación por restricciones para la selección de índices en Postgres
Opinión de GN⁺
- Utilidad de la programación por restricciones: es muy útil para resolver problemas complejos de optimización
- Fortalezas de CP-SAT: CP-SAT, desarrollado como parte del proyecto OR-Tools de Google, ofrece un rendimiento potente
- Casos de uso reales: puede aplicarse a problemas reales como la generación de horarios laborales
- Consideraciones al adoptar la tecnología: al adoptar una nueva tecnología, hay que considerar la curva de aprendizaje y los problemas de integración con sistemas existentes
- Proyectos similares recomendados: solvers comerciales como IBM CPLEX y Gurobi también ofrecen funciones similares
1 comentarios
Comentarios de Hacker News
He usado solucionadores de restricciones en el pasado, y estas herramientas muestran un rendimiento realmente sorprendente
Estoy reescribiendo en mi viejo libro un capítulo corto sobre el uso de MiniZinc y Python
Muchos programas intentan tener una única representación de los datos, pero eso en la mayoría de los casos no es racional
Tengo un cliente que opera campamentos deportivos
Tengo experiencia usando muchos solucionadores desde principios de los 2000
Me pregunto si existe algún CAD paramétrico que funcione principalmente con un solucionador de restricciones
Me pregunto cómo se comparará con la programación entera mixta