Я работаю над приложением, в котором мне нужно автоматически планировать задания для участников по чередующемуся графику. Я не очень хорош в объяснении правил, поэтому вот некоторые данные, которые могут вам помочь:
Должности: должность, с такими правилами, как понедельник и среда еженедельно.
Категории: Набор позиций
Группы: еще один набор позиций. Позиции в одной группе не могут быть назначены в один и тот же день
Члены: пользователи, назначенные на должности на определенную дату.
Для каждой даты месяца члены назначаются на позиции (обе в порядке возрастания). Если член назначен на позицию в одной категории, в следующий раз, когда появится позиция в той же категории, назначается следующий член в алфавитном порядке (или начало списка), например.
Члены: M1, M2, M3, M4
Позиции в категории C1: P1, P2, P3
Члены в позиции P1: M1, M2, M3, M4
Члены в позиции P2: M1, M2, M3
Члены в позиции P2: M1, M3, M4
Если M1 назначен для P1, если P2 будет следующим, M2 будет назначен. Введен дополнительный уровень сложности, когда вместо P3 следует M3. Система должна отслеживать тот факт, что M2 был «пропущен» и назначать M2 следующим, если доступно, затем назначать M4 следующим или ждать, пока он не достигнет позиции, где M2 доступен (это становится дополнительно сложным, когда пропущено много « 'члены).
Участник также будет пропущен, если он указал, что он не будет доступен в эту дату. Система должна сделать приоритет пропущенным участникам, как-то идентифицировать их, когда они появятся, а затем перейти к следующему логическому человеку в списке. Пропуск также относится к группам из-за столкновений дат.
У меня уже есть временное [и грязное] решение, которое я больше не понимаю, хотя у меня есть много комментариев, объясняющих каждый шаг. Его недостатки заключаются в работе с пропущенными участниками.
Если бы вы собирались закодировать это, как бы вы поступили? Я реализую это в PHP, но псевдокод также будет работать.