No se entiende mucho el problema.
¿En qué horarios deben trabajar los empleados?
¿Son 16 horas que deben quedar cubiertas?
¿Y los fines de semana, cuantas horas deben quedar cubiertas?
¿Los trabajadores deben trabajar en horario mas o menos de corrido?
Supongamos que el horario laboral sea de 6 a 22.
Supondré que el primer turno empieza a las 6, y el segundo a las 14.
Si el empleado trabaja 8 horas diarias de corrido, no puede empezar a trabajar despues de las 14, porque no completaria las 8 horas.
Así que la franja horaria de ''inicio de trabajo'' sería de 6 a 14.
Creo que la solución más práctica sería dividir esa franja horaria en 13 partes iguales, y asignarle numeros rotativos a los empleados en dichas franjas. Habria que descartar aquellas horarios que impliquen turnos menores de 5 horas. Si el cambio de turno es a las 14, como vengo suponiendo, no puede el empleado empezar a trabajar después de las 9 y antes de las 10.
Así que tengo una franja de 7 horas de ''inicio de sesion laboral'', que debo dividir en 13. Esas 7 horas van de las 6 a las 9 de la mañana, y de las 10 a las 14. (Excluyo de las 9 a las 10, por aquello de los turnos de 5 horas).
Pero como uno de los empleados al menos deberá empezar justo a las 6 de la mañana, en realidad debo dividir la franja horaria en 12 partes, y no en 13.
7 horas x 60 minutos repartido entre 12, es igual a 35 minutos de separación entre franjas.
El empleado 1 empezaría a las 6:00 en punto.
El empleado 2 empezaría a las 6:35.
El empleado 3 empezaría a las 7:10.
El empleado 4 empezaría a las 7:45.
El empleado 5 empezaría a las 8:20.
El empleado 6 empezaría a las 8:55.
Como la franja entre las 9 y las 10 no está permitida, me salteo una hora. Luego
El empleado 7 empezaría a las 10:30.
El empleado 8 empezaría a las 11:05.
El empleado 9 empezaría a las 11:40.
El empleado 10 empezaría a las 12:15.
El empleado 11 empezaría a las 12:50.
El empleado 12 empezaría a las 13:25.
El empleado 13 empezaría a las 14:00.
Después, lo único que habría que hacer es que los empleados vayan rotando esos numeros.
Al empleado que le tocó el lunes el 1, el martes le tocará el 2, el miercoles el 3, y así sucesivamente. Al que le haya tocado el numero 13, el dia siguiente deberá empezar por el número 1, para reiniciar el ciclo.
Al cabo de 13 dias cada empleado estará como al principio.
Pero claro, no sé en realidad, si esta solución es admisible, porque desconozco cuantos empleados se necesitan en cada franja horaria, cuantos empleados debe haber como maximo o minimo en determinado momento, etc.
En cuanto a los fines de semana y feriados, yo lo trataria como un problema aparte.
Si un empleado debe estar dos fines de semana al mes trabajando, supongo que es porque cada fin de semana la mitad trabaja y la otra mitad no.
Como el 13 es un numero impar, sacar la mitad es algo incomodo.
Hsbrá que decidir si trabajan 6 o 7, en esos dias. Tal vez 7 empleados el sabado y 6 el domingo, o alguna otra repartija conveniente.
Lo que se me ocurre hacer es alternar los fines de semana. A veces en un mes hay MAS de 4 fines de semana, asi que no parece conveniente plantear el problema a nivel mensual, sino anual, que hay siempre 52 semanas, y es un número par.
De paso, 52 es 4 x 13, y te viene como anillo al dedo que sea un multiplo de 13.
Cada fin de semana en consideracion, se haría trabajar a aquellos empleados que tenian numeros IMPARES durante el viernes, o sea, el dia anterior. Los empleados que el viernes estaban numerados como 1, 3, 5, 7, 9, 11, 13 deberian trabajar ese fin de semana.
Resumo la idea: se usaría el número que a un empleado le tocó el dia viernes, como referencia para determinar si trabaja o no ese fin de semana. (Si no te gusta el viernes, y prefieres el numero del lunes, da igual, el metodo es el mismo).
Esto debiera funcionar bien, porque cada viernes ha habido 5 rotaciones desde el lunes al viernes, y el 5 es un número coprimo con 13, lo cual asegura que siempre va a haber rotación, y además al cabo de 13 fines de semana se repetirá el mismo patrón inicial.
Como el año tiene 52 semanas, que es multiplo de 4, este metodo tendrá regularidad de tipo anual.
Hagamos un ejemplo, para un empleado que el dia lunes empieza siendo el número 1. Llega al viernes como número 5.
Los sucesivos viernes tiene estos numeros:
5 = impar = si trabaja
10 = par = no trabaja
2 = par = no trabaja
7 = impar = si trabaja
12 = par = no trabaja
4 = par = no trabaja
9 = impar = si trabaja
1 = impar = si trabaja
6 = par = no trabaja
11 = impar = si trabaja
3 = impar = si trabaja
8 = par = no trabaja
13 = impar = si trabaja
En total cada 13 fines de semana, trabaja 7 y no trabaja 6.
Lo malo de este sistema es que muchas veces se trabaja dos fines de semana seguidos, y otros dos seguidos no se trabaja.
Para que sea más ''alternado'' habria que usar otra secuencia, que no sean los numeros IMPARES.
En vez de hacer que trabajen los que el viernes tuvieron numero impar, sería mas inteligente hacer trabajar a aquellos que han tenidos estos numeros: 1, 11, 8, 5, 2, 12, 9. Si te fijas bien, esta secuencia está alternada en la lista del ejemplito de arriba.
A lo sumo el 9 y el 1 quedarán consecutivos, y nada más.
Te recomiendo esto como ultimo como secuencia para el fin de semana. Así que cada empleado sabrá que fin de semana le tocará trabajar, segun que el viernes le haya tocado alguno de esos numeros ''magicos'': 1, 11, 8, 5, 2, 12, 9. Puestos en orden sería así: 1, 2, 5, 8, 9, 11, 12.
En cuanto a los horarios el fin de semana, creo que es simple, basta dividir la franja horaria en 7 partes, y asignar a cada franja uno de los numeros magicos del parrafo de arriba. A la primer franja horaria le toca el 1, a la segunda el 2, a la tercera el 5, etc.
Y por ultimo quedan los feriados.
Pues los vuelves a tratar como un problema aparte, y te anotas todos los feriados del almanaque de todo el año.
Como son dias especiales, que no tienen regularidad como los fines de semana, se requiere que haya un tratamiento aparte, y que además los empleados tengan paciencia al respecto.
Lo que haría yo sería hacer una lista aparte con los numeros del 1 al 13, pero esta vez esos numeros serian solo para los feriados.
Iría haciendo una rotacion al numero siguiente, solo en cada feriado.
Si no deben trabajar todos en el feriado, entonces basta conque en cada feriado hagas trabajar a los que tienen numero impar asignado (en la numeracion de empleados para feriados).
O sea, trabajarian los de numeros 1, 3, 5, 7, 9, 11, 13, que son mas o menos la mitad de empleados.
Como los numeros van rotando, te aseguras que los que trabajaron un feriado no trabajaran el siguiente, etc., salvo el que le tocó numero 13, que luego será 1, de nuevo impar, y tendrá que repetir.
Esos problemas vienen porque 13 es impar, y no hay manera de que en cada fin de semana tengas la ''mitad'' de los empleados.
No sé si estas ideas se ajustan a tu ambiente laboral.
Pero es un principio de cómo podria encararse la cosa.