Оптапланер не может удалить 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() в моих правилах все отлично работает. Может быть, это помогает?!

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