Я пишу планировщик персонала для своего офиса. Есть как минимум две смены в день (7 дней в неделю), и я хочу, чтобы оптимизатор следил за тем, чтобы ни один сотрудник не работал значительно больше смен по выходным, чем другой.
У меня есть простая рабочая программа, которая назначает по одному Персонал каждому Сдвиг. Структура программы следующая:
Это рабочее решение распределяет всех сотрудников одинаково, но не учитывает выходные и будние дни. Чтобы отделить будние дни от выходных, я заменил список <Сдвиг> в Планирование на список <День>. Каждый День содержит свой собственный List <Сдвиг>, представляющий смены, которые происходят в этот день. Теперь, когда я хочу подсчитать количество выходных, проработанных сотрудником, я могу найти все объекты День, которые представляют выходные, и считать только Смены, содержащиеся в эти дни.
К сожалению, это помещает список <Сдвиг>, который является @PlanningEntityCollectionProperty, в класс, который не является @PlanningSolution. Аннотация @PlanningEntityCollectionProperty теперь игнорируется, и программа не работает.
Пропустил ли я очевидный способ реструктуризации моей программы, или это единственный вариант - сохранить исходную структуру программы и изменить мои объекты сдвиг, чтобы записать, в какой день они происходят?
Заранее спасибо. Я постараюсь передать помощь, если смогу.




Я бы реструктурировал ваше Планировочное решение.
Почему бы вам не сделать:
List<Shift> в Planning SolutionList<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, который отлично работает. Спасибо за то, что помогли мне освоить этот новый и ценный навык!