Estoy trabajando en una aplicación en la que necesito programar automáticamente trabajos para los miembros en un horario rotativo. No soy muy bueno para explicar las reglas, así que aquí hay algunos datos para ayudar:Problema de programación de trabajos
Posiciones: Título de un trabajo, con reglas tales como los lunes y los miércoles por semana.
Categorías: Un conjunto de posiciones
Grupos: Otro conjunto de posiciones. Las posiciones en el mismo grupo no se pueden asignar el mismo día
Miembros: usuarios asignados a puestos en una fecha determinada.
Para cada fecha del mes, los miembros se asignan a las posiciones (ambas en orden ascendente). Si un miembro está asignado a un puesto en una categoría, la próxima vez que aparezca un puesto en la misma categoría, se asignará el siguiente miembro alfabéticamente (o el principio de la lista), por ejemplo.
Miembros: M1, M2, M3, M4
Las posiciones en la Categoría C1: P1, P2, P3
miembros en posición P1: M1, M2, M3, M4
miembros en la posición P2: M1, M2, M3
Miembros en la posición P2: M1, M3, M4
Si se asigna M1 para P1, si P2 viene a continuación, se asignará M2. Se introduce una capa adicional de complejidad donde si P3 viene a continuación, se asigna M3. El sistema debe realizar un seguimiento del hecho de que M2 fue 'omitido' y asignar M2 a continuación si está disponible, luego asignar M4 a continuación, o esperar hasta que llegue a una posición donde M2 esté disponible (esto se vuelve adicionalmente complejo cuando hay muchos 'omitidos' 'miembros).
También se omitirá un miembro si él ha indicado que no estará disponible en esa fecha. El sistema necesita dar prioridad a los miembros omitidos, de alguna manera identificarlos cuando aparezcan y luego saltar a la siguiente persona lógica en la lista. La omisión también se aplica a grupos debido a enfrentamientos de fechas.
Ya tengo una solución temporal [y desordenada] que ya no entiendo aunque tengo muchos comentarios explicando cada paso. Sus debilidades están en lidiar con los miembros omitidos.
Si fueras a codificar esto, ¿cómo lo harías? Estoy implementando esto en PHP, pero el pseudocódigo también funcionaría.
¿Hay horas para los puestos que deben tenerse en cuenta? Cuando dice que las posiciones en el mismo grupo no se pueden asignar el mismo día, ¿quiere decir que no se pueden asignar a nadie (es decir, solo se puede ocupar una posición de un grupo en un día determinado) o a alguien asignado a una posición? en un grupo no se puede asignar a ningún otro? – outis
Quise decir que alguien puede ocupar dos posiciones el mismo día a menos que caigan en el mismo grupo. – Zahymaka