Java Optaplanner:评估解决方案

Java Optaplanner:评估解决方案,java,drools,optaplanner,Java,Drools,Optaplanner,我目前正在从事一个Java项目,该项目使用Optaplanner和drools解决约束满足问题 解决方法很有效。但是在给了我一个解决方案之后,我想评估这个解决方案:我想知道哪些约束被违反了,即哪些规则被触发了,以及触发了多少次 这可能吗?我该如何开始?可以通过实现org.kie.api.event.rule.AgendaEventListener并将其附加到KieSession.addEventListener(AgendaEventListener listener)来观察规则的触发 规则引擎

我目前正在从事一个Java项目,该项目使用Optaplanner和drools解决约束满足问题

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


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

可以通过实现
org.kie.api.event.rule.AgendaEventListener
并将其附加到
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 
但是,这并不能告诉您所有缺失的条件:如果
未触发a
,则
B
C
也可能不匹配

参见文档部分。以简单的方式提供您所需的所有数据

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();
        ...
    }
}
for(ConstraintMatchTotal ConstraintMatchTotal:guiScoreDirector.getconstraintMatchTols()){
字符串constraintName=constraintMatchTotal.getConstraintName();
Number weightTotal=constraintMatchTotal.getWeightTotalAsNumber();
对于(ConstraintMatch ConstraintMatch:constraintMatchTotal.getConstraintMatchSet()){
List justicationList=constraintMatch.getjusticationList();
Number-weight=constraintMatch.getWeightAsNumber();
...
}
}

更多高级drools特定技术/技巧,请参见Laune的答案。

在OptaPlanner示例中,在解决数据集后,单击左下角的“约束匹配”按钮,查看这些内容的实际操作。我说的
justicationList
包含规则LHS中的变量是否正确,规则何时匹配?是,规则匹配1次。由于解决方案的简单性,接受答案。