2014-04-27 4 views
4

현재 Optaplanner 및 drools을 사용하는 Java 프로젝트에서 Constraint Satisfaction 문제를 해결하고 있습니다.Optaplanner : 솔루션 평가

문제가 해결되었습니다. 그러나 solver이 해결책을 제시 한 후에 해결책을 평가하고자합니다. 어떤 제약 조건이 위반되었는지, 즉 어떤 규칙이 해고되었는지, 몇 번이나 반복되었는지를 알고 싶습니다.

이것이 가능하며 어떻게 시작하나요?

답변

4

문서 섹션 Reusing the score calculation outside the 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(); 
     ... 
    } 
} 

자세한 고급 drools 특정 기술/트릭에 대한 Laune의 답변을 참조하십시오.

+0

OptaPlanner 예제에서 데이터 세트를 해결 한 후 왼쪽 하단의 "Constraint matches"버튼을 클릭하면이 작업을 볼 수 있습니다. –

+0

'justificationList'에는 규칙이 일치했을 때 규칙의 LHS에있는 변수가 포함되어 있다고 말하는 것이 맞습니까? –

+0

예, 규칙이 1 일치하는 경우. –

1

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 

이것은, 그러나, 조건없는 당신에게 모든을 말하지 않을 것이다 쓰기 : 또한 not_a 화재, 경우 BC이 일치하지 않는 수 있습니다.

관련 문제