Я новичок в OptaPlanner и пытаюсь создать правило, которое назначает смены на два или более дней подряд, а не просто значение по умолчанию, которое назначает конкретную смену всего на один день. Например,
rule "Assign same shift two days in a row"
when
ShiftAssignment($shiftType : shiftType, $employee : employee, $firstDayIndex : shiftDateDayIndex)
ShiftAssignment(shiftType == $shiftType, employee == $employee, shiftDateDayIndex == ($firstDayIndex + 1))
not ShiftAssignment(shiftType == $shiftType, employee == $employee, shiftDateDayIndex == ($firstDayIndex + 2))
then
scoreHolder.addSoftConstraintMatch(kcontext, 1);
end
Хотя это и работает, но следующая смена не будет двухдневной. Например, если медсестре назначен Shfit «A» в понедельник, это правило также назначит эту смену медсестры «A» на вторник, поэтому шаблон будет A-A-что-то еще. Однако из-за оператора «not» он не позволяет сдвигу на третий день (среду) также быть сдвигом, назначаемым два дня подряд. Таким образом, рисунок A-A-B-B или даже рисунок A-A-A-A сдвигов невозможны.
Есть ли лучший способ сделать это?
Кроме того, этот пример предназначен только для назначения смены два дня подряд. Но что, если бы я хотел, чтобы это было более гибким и назначал смену на два или более дней подряд в зависимости от гипотетической переменной типа сдвига, представляющей «продолжительность смены»?
Кроме того, я заметил, что мне нужно было использовать «+1» для scoreHolder.addSoftConstraintMatch вместо «-1», чтобы OptaPlanner следовал этому правилу. Почему это так?? Если кто-то может помочь, это было бы здорово!