我得到了这个例外:
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
答案 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()
,那么一切正常。也许这有帮助吗?!