0

Я работаю над инструментом для составления расписания для сотрудника до месяца с учетом ограничений коммерческого и трудового законодательства. Немного проблем и отличий от similar problem:Генерация реестров/расписаний

  • Концепция перехода содержит разрывы, разделенные до получаса.
  • Нет концепции полных 8 смен, как упомянутая аналогичная проблема. например Существует необходимость иметь 2 ресурсы на 8 утра, 2,5 ресурсы на 3PM (например, дать полчаса перерыв) ..
  • и регулярные ограничения, как часов в день, часов до перерыва, время перерыва ...

Возможные решения - полагаться на использование решателя aka OR-Tools и Optaplanner. любые подсказки?

ответ

1

Если вы идете с OptaPlanner и не хотите следовать за дизайном Сотрудник Rostering присвоения 8 часов Сдвигов (планирование лиц) работники (значение планирования), из-за вашим 2th ограничения, то вы можете попробовать следовать Дешевые Пример времени дизайн, что-то вроде этого:

@PlanningEntity public class WorkAssignment { 
    Employee employee; 
    @PlanningVariable PotentialShiftStartTime startTime 
    @PlanningVariable int durationInHalfHours 
} 

PotentialShiftStartTime в основном в любое время сдвига может на законных основаниях начать, поэтому пн 8:00, пн 8:30, пн 9:00 и т.д.

в пространство поиска будет огромным, в этом свободном виде, но есть уловки для улучшения масштабируемости (рядом S выборы, выбрать ранний для CH, Ограниченный выбор для CH, ...).

Чтобы выйти из режима свободной формы (= для уменьшения пространства поиска), вы можете комбинировать startTime и durationInHalfHours в PotentialShift, если, например, невозможно запустить 8-часовую смену в 16:00 в днем. Но убедитесь, что выигрыш огромен, прежде чем ввести эту сложность.

В любом случае проблема с этим дизайном определяет количество экземпляров WorkAssignment для создания. Таким образом, вы, вероятно, захотите создать максимальное число на одного сотрудника и работать с nullable=true, чтобы игнорировать неиспользуемые назначения.

+0

Если я создаю матрицу Count (Slots) x Count (Employee), где каждый экземпляр является SlotAssignment для данного слота/сотрудника. Слоты - это день/час разделения (например, 48 слотов - половина нашего). Тогда SlotAssigment имеет Boolean 'назначен' как PlanningVariable. Решатель выделяет те, которые назначаются значениями: true/false, тогда правила оценки будут проверять, какие назначенные слоты и сгенерировать счет. Это работает? Оптимизирован ли он или создает проблемы позже при оптимизации поиска, например. ходы/свопы? –

+0

Зачем создавать «логические значения, назначенные как переменная планирования», вместо того, чтобы создавать «переменную планирования с нулевым значением» и обрабатывать нуль как неназначенные? Последний способ уменьшает пространство поиска, так как нет возможности комбинировать unassigned = false со значением любой другой переменной. –

+0

Я согласен с NULL. Таким образом, в этом случае ValueRange будет всего лишь одним объектом, чтобы пометить его как не равным нулю (назначается). –

Смежные вопросы