PlanningEntities разделены на несколько коллекций

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

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

  • Планирование - это @PlanningSolution
  • Планирование содержит список <Сдвиг>, который является @PlanningEntityCollectionProperty
  • Сдвиг - это @PlanningEntity
  • Сдвиг содержит Персонал, который является @PlanningVariable
  • Планирование содержит @ValueRangeProvider, который возвращает наш список сотрудников как List <Персонал>.

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

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

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

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

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я бы реструктурировал ваше Планировочное решение.

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

  • Храните 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

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

Спасибо! Оглядываясь на примеры, кажется, что необходимо, чтобы PlanningSolution отслеживал PlanningEntityCollectionProperty напрямую, без промежуточных классов. Я сделал то, что вы предложили, и теперь каждая Shift ссылается на Workday, у которого есть Date и DayType из Enum. Я все еще изучаю Drools, но я смоделировал EasyScoreCalculator, который отлично работает. Спасибо за то, что помогли мне освоить этот новый и ценный навык!

Anthony 07.06.2018 15:01

Другие вопросы по теме