Составление / расписание
Я работаю над инструментом для составления расписания для работника до месяца с учетом ограничений коммерческого и трудового законодательства. Несколько проблем и отличий от аналогичной проблемы:
- Концепция смены содержит перерывы, разделенные на полчаса.
- Не существует концепции полных 8 смен в качестве упомянутой аналогичной проблемы. Например, необходимо иметь 2 ресурса в 8 утра, 2,5 ресурса в 3 часа дня (например, дать перерыв на полчаса).
- и регулярные ограничения, такие как часы в день, часы до перерыва, время перерыва...
Возможные решения - использовать солвер, известный как OR-Tools и Optaplanner. какие-нибудь намеки?
1 ответ
Если вы пользуетесь OptaPlanner и не хотите следовать плану Employee Rostering, присваивая сотрудникам 8-часовые смены (планирующие объекты) (плановая стоимость), из-за вашего 2-го ограничения, тогда вы можете попытаться следовать схеме Cheap Time Example, что-то вроде этого:
@PlanningEntity public class WorkAssignment {
Employee employee;
@PlanningVariable PotentialShiftStartTime startTime
@PlanningVariable int durationInHalfHours
}
PotentialShiftStartTime - это практически любое время, когда смена может начинаться корректно, поэтому понедельник 8:00, понедельник 8:30, понедельник 9:00 и т. Д.
В этой свободной форме пространство поиска будет огромным, но есть приемы для улучшения масштабируемости (Ближний отбор, ранний выбор для CH, Ограниченный выбор для CH, ...).
Чтобы выйти из режима свободной формы (= уменьшить пространство поиска), вы можете комбинировать startTime и durationInHalfHours в PotentialShift, если, например, невозможно начать 8-часовую смену в 16:00 дня. Но убедитесь, что выигрыш огромен, прежде чем вводить эту сложность
В любом случае, проблема с этим дизайном заключается в определении того, сколько экземпляров WorkAssignment создать. Таким образом, вы, вероятно, захотите создать максимально возможное количество на одного сотрудника и работать с nullable=true
игнорировать неиспользованные назначения.