OptaPlanner: как назначить смену на два и более дней подряд? Пример медсестры Ростеринг - PullRequest
0 голосов
/ 10 сентября 2018

Я новичок в 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 следовал этому правилу. Почему это так?? Если кто-то может помочь, это было бы здорово!

...