我目前正在研究一个使用 Optaplanner 和 drools 来解决约束满足问题的 Java 项目。
解决工作正常。但是在求解器给了我一个解决方案之后,我想评估这个解决方案:我想知道哪些约束被违反了,即哪些规则被触发了以及多少次。
这可能吗?我该如何开始?
我目前正在研究一个使用 Optaplanner 和 drools 来解决约束满足问题的 Java 项目。
解决工作正常。但是在求解器给了我一个解决方案之后,我想评估这个解决方案:我想知道哪些约束被违反了,即哪些规则被触发了以及多少次。
这可能吗?我该如何开始?
请参阅文档部分在 Solver 之外重用分数计算。这以简单的方式提供了您需要的所有数据。
for (ConstraintMatchTotal constraintMatchTotal : guiScoreDirector.getConstraintMatchTotals()) {
String constraintName = constraintMatchTotal.getConstraintName();
Number weightTotal = constraintMatchTotal.getWeightTotalAsNumber();
for (ConstraintMatch constraintMatch : constraintMatchTotal.getConstraintMatchSet()) {
List<Object> justificationList = constraintMatch.getJustificationList();
Number weight = constraintMatch.getWeightAsNumber();
...
}
}
有关更高级的流口水特定技术/技巧,请参阅 Laune 的答案。
org.kie.api.event.rule.AgendaEventListener
可以通过实现 an并将其附加到 来观察规则的触发KieSession.addEventListener(AgendaEventListener listener)
。
规则引擎无法解释为什么某些规则没有触发。
这取决于您拥有的规则的复杂性,但一种方法是编写单独评估约束并累积“满足集”的规则,之后可以确定“全部满足”并且不完整集的补集是回答你的问题。
另一种方法是让规则在不满足其中一个模式或约束时触发。例如,除了
rule abc when A() B() C() then ... end
你必须写
rule not_a when not A() then ... end
rule a_not_B when A() not B() then ... end
rule ab_not_c when A() B() not C() then ... end
但是,这不会告诉您所有缺失的条件:如果not_a
触发,也B
可能C
不匹配。