Это проблема оптимизации. Это известно как проблема планирования, как ни странно. :-D
В зависимости от размера данных вам, возможно, придется пойти на метаэвристику, такую как генетические алгоритмы, оптимизация муравьиного роя и т. Д., Но я бы начал здесь с развертывания вашей собственной эвристики на основе правил.
По сути, определяют правила как связи между вещами (человек А не может быть одновременно в отпуске и на работе) или условиями в расписании (только три человека в любой момент времени). Затем создайте расписание и вставьте всех своих сотрудников один за другим. Если при вставке правило нарушено, не вставляйте и не выбирайте другой персонал.
Это должно, если вы все сделаете правильно, составить правильный, но неоптимальный график, и тогда вы сможете делать классные вещи, такие как определение операторов (swap, move, 3-swap), что даст вам окрестности (все действительные графики, которые могут быть достигнуты с помощью оператора). Затем вы можете выбрать лучшее расписание в районе и повторить. Это спуск по соседству. Но есть много методов, основанных на соседстве, чтобы выбрать из. Я считаю, что имитация отжига хороша применительно к задачам планирования.