Оптапланер не может удалить ContraintMatch
Я получаю это исключение:
java.lang.IllegalStateException: constraintMatchTotal (com.k.sp.rules/ Минимальное количество последовательных ночей =0hard/0medium/0soft) не удалось удалить constraintMatch (XXXXXXXXXXX) из своего ограничения MatchSet (XXXXXXXXXXX)
После отладки я решил, что ConstraintMatchSet имеет тот же объект ConstraintMatch, который он пытается удалить прямо сейчас (оба имеют одинаковый хэш-код и равны ему сейчас), но он не может удалить его. Причина, по которой я понял, состоит в том, что ConstraintMatch.justificationList имеет внутренний список, число объектов которого отличается, и, следовательно, он вычислил другой хэш-код во время вставок, поэтому он не может быть удален сейчас, потому что set(hashtable) не находит объект при текущем хеш-коде.
Я думаю, что это решит мою проблему, если я смогу избежать добавления всех объектов "когда" в justificationList в constraintMatch, но не знаю, как это сделать. Помогите?
Вот как выглядит мое правило:
rule "Minimum Consecutive Nights"
salience 20
when
$emp:Employee()
$shifts:ArrayList(size>0) from collect (ShiftRequestPhase(getInterval()!=null && employee.equals($emp)))
$constraintsPenality: Integer(intValue>0) from ($emp.checkConstraints($shifts,6))
then
$emp.breakLevelConstraints(scoreHolder,kcontext,6,$constraintsPenality);
end
1 ответ
Я столкнулся с той же проблемой, используя Java 9 и новейшую версию Drools & Optaplanner (7.6.0-Final). Мне нужно было очень быстро взломать, чтобы обойти эту проблему, поэтому я просто отключил коллекцию ConstraintMatch. AbstractScoreHolder
Класс позволяет установить логическое значение в конструкторе
protected AbstractScoreHolder(boolean constraintMatchEnabled, Score zeroScore)
constraintMatchTotal
не нужно, если вам не нужно IndictmentMap
, Я просто отключил это. особенность и это сработало.
@ GeoffreyDeSmet: К сожалению, я не могу предоставить пример для вас, но я сузил его до строк кода с List() from collect (...)
в файле правил. Если я полностью избегу тех List()
в моих правилах все отлично работает. Может быть, это помогает?!