PlanningEntities распределены по нескольким коллекциям - PullRequest
0 голосов
/ 05 июня 2018

Я пишу штатное расписание для моего офиса.По крайней мере, две смены в день (7 дней в неделю), и я хочу, чтобы оптимизатор позаботился о том, чтобы ни один сотрудник не работал с большим количеством смен в выходные дни, чем другой.

У меня есть простая рабочая программа, которая назначает одну Посох каждому Сдвиг .Структура программы выглядит следующим образом:

  • SchedulingSolution является @ PlanningSolution
  • SchedulingSolution содержит список <<strong> Shift >, который является @ PlanningEntityCollectionProperty
  • Shift является @PlanningEntity
  • Shift содержит Staff , который является @ PlanningVariable
  • SchedulingSolution содержит @ ValueRangeProvider , который возвращает наш список сотрудников в виде списка<<strong> Персонал >.

В этом рабочем решении все сотрудники работают одинаково, но не учитывают выходные и будние дни.Чтобы разграничить рабочие дни по выходным, я заменил Список <<strong> Shift > в SchedulingSolution на Список <<strong> Day >.Каждый день содержит свой собственный список <<strong> Shift >, представляющий сдвиги, которые происходят в этот день.Теперь, когда я хочу вычислить количество выходных, с которыми работал сотрудник, я могу найти все Day объекты, которые представляют выходные дни и учитывают только Смены , содержащиеся в эти дни.

К сожалению, это помещает List <<strong> Shift >, который является @ PlanningEntityCollectionProperty , в класс, который не является @ PlanningSolution .Аннотация @ PlanningEntityCollectionProperty теперь игнорируется, и программа завершается ошибкой.

Я пропустил очевидный способ реструктуризации моей программы или я могу оставить исходную структуру программы и изменить мои shift объекты для записи, в какой день они происходят?

Заранее спасибо.Я постараюсь передать помощь вперед, если смогу.

1 Ответ

0 голосов
/ 06 июня 2018

Я бы реструктурировал ваше решение для планирования.

Почему бы вам не сделать:

  • Сохранить List<Shift> в Planning Solution
  • Сбросить List<Day> в каждую смену
  • Добавьте поле day в Shift, возможно, даже показатель того, является ли этот день выходным, используя перечисление.

Затем можно легко рассчитать количество выходных дней, отработанных каждым сотрудником.с Drools следующим образом:

(Абсолютно непроверенный !!!)

rule "balancedStaffWeekend"
    when
        $staff: Staff()
        accumulate(
            Shift(
                staff == $staff
                day == Day.WEEKEND);
                $count: count()
            );
        )
    then
        scoreHolder.addSoftConstraintMatch(kcontext, -Math.pow(count, 2));
end

Наказание за решение подсчетом, возведенным в степень двух балансов, равняется количеству выходных.

...