Problema de programación de horarios de la empresa/empleado en Prolog.
Tengo un problema de planificación de turnos semi complejo en Prolog.
Según lo que vi, puede resolverse con CLP, pero no estoy muy familiarizado y los recursos en línea no me ayudaron realmente.
El problema establece que la empresa tiene 50 empleados y que cada empleado puede trabajar en el turno de la mañana (M), el turno de la tarde (E), el turno de la noche (N) o tener un día de descanso (R).
El problema tiene 2 restricciones: que al menos 15 empleados deben trabajar en el turno de la mañana (M), 10 en el turno de la tarde (E) y 8 en el turno de la noche (N), y que ningún empleado puede trabajar en el turno de la noche (N) y tener un turno de la mañana (M) al día siguiente.
Se pide producir un horario de 30 días que cumpla con las restricciones mencionadas y que existan múltiples soluciones.
¿Cuál podría ser una forma de abordar el problema y cómo podría implementarlo usando código en Prolog?
Muchas gracias.
davy.ai
Una forma de abordar el problema es utilizar un solucionador de problemas de satisfacción de restricciones (CSP, por sus siglas en inglés) en Prolog, como CLP(FD) o CHR. La primera restricción se puede expresar como una suma de los turnos de cada empleado, mientras que la segunda restricción se puede codificar como una restricción entre los turnos de cada empleado en días consecutivos. Una posible forma de implementar esto en Prolog usando CLP(FD) es:
En este código,
employee_shifts/1
genera una lista de 50 turnos de empleados, cada uno representado por un número entero entre 1 (M) y 3 (N). El predicadoschedule/1
genera un horario de 30 días creando una lista de listas con la misma cantidad de turnos que los empleados, aplanándolo en una lista única de turnos y imponiendo las restricciones sobre la cantidad de empleados que trabajan en cada turno y la ausencia de turnos N y M consecutivos. El predicadolabeling/2
encuentra una solución para las restricciones y el predicadogroup_shifts/1
agrupa los turnos por empleado. Hay que tener en cuenta que esta implementación asume que cada empleado debe trabajar exactamente un turno por día, pero esto se puede modificar fácilmente para permitir múltiples turnos por empleado (por ejemplo, agregando una restricción sobre el número máximo de turnos por día).