4

我目前正在研究一个使用 Optaplanner 和 drools 来解决约束满足问题的 Java 项目。

解决工作正常。但是在求解器给了我一个解决方案之后,我想评估这个解决方案:我想知道哪些约束被违反了,即哪些规则被触发了以及多少次。

这可能吗?我该如何开始?

4

2 回答 2

5

请参阅文档部分在 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 的答案。

于 2014-04-28T07:55:21.380 回答
1

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不匹配。

于 2014-04-28T05:00:38.217 回答