Optaplanner无法删除ContraintMatch

时间:2018-01-29 12:42:56

标签: java drools optaplanner drools-fusion

我得到了这个例外:

  

java.lang.IllegalStateException:constraintMatchTotal(com.k.sp.rules / Minimum Consecutive Nights = 0hard / 0medium / 0soft)无法从constraintMatchSet(XXXXXXXXXXX)中删除constraintMatch(XXXXXXXXXXX)

调试之后,我认为ConstraintMatchSet具有相同的ConstraintMatch对象,它现在正在尝试删除(两者都具有相同的哈希码并且现在等于),但是它无法删除它。我想的原因是,ConstraintMatch.justificationList有一个内部列表,其对象的数量不同,因此它在插入时计算出不同的哈希码,因此它现在无法删除,因为set(hashtable)找不到对象在当前哈希。

如果我能避免添加所有"当"我认为它会解决我的问题。对象成为justification的约束匹配列表,但不知道如何做到这一点。帮助

这是我的规则的样子:

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 个答案:

答案 0 :(得分:0)

我遇到了使用Java 9和最新Drools& amp; Optaplanner版本(7.6.0-最终版)。我需要一个非常快速的 hack 来规避这个问题因此我只是禁用了ConstraintMatch集合。 AbstractScoreHolder 类允许在构造函数

中设置布尔值

protected AbstractScoreHolder(boolean constraintMatchEnabled, Score zeroScore)

如果您不需要constraintMatchTotal,则无需IndictmentMap。我只是禁用了这个。功能,它工作。

@GeoffreyDeSmet:不幸的是我无法为您提供示例,但我将其缩小到规则文件中带有 List() from collect (...) 的代码行。如果我在规则中完全避免使用 List() ,那么一切正常。也许这有帮助吗?!