2012-04-19 6 views
2

Я использую Drools планировщик-5.4.0.CR1, и я хочу получить список сломанных ограничений для окончательного оптимального решенияполучать список невыполненных ограничений для окончательного оптимального решения в Drools-планировщик

, а также посмотрел примеры из 5.4.0.CR1

Я реализовал, как в примере, но она возвращает пустой список , другими словами getScoreDetailList(). размер() равно 0 , но solution.getScore() равно до -54.

Есть ли какие-либо предложения?

public class SomeClass { 
... 
private volatile Solver solver; 
private ScoreDirector scoreDirector; 
... 
public void someMethod() { 
    SolverFactory solverFactory = new XmlSolverFactory(SOLVER_CONFIG); 
    solver = solverFactory.buildSolver(); 
    scoreDirector = solver.getScoreDirectorFactory().buildScoreDirector(); 
    ... 
    this.scoreDirector.setWorkingSolution(solution); 
    this.solver.setPlanningProblem(this.scoreDirector.getWorkingSolution()); 
    this.solver.solve(); 

    SomeSolution solution = (SomeSolution) solver.getBestSolution(); 
    this.scoreDirector.setWorkingSolution(solution); 
    System.out.println("Score: " + solution.getScore()); 
    System.out.println("getScoreDetailList size:" + getScoreDetailList().size()); 
} 

public List<ScoreDetail> getScoreDetailList() { 
    if (!(scoreDirector instanceof DroolsScoreDirector)) { 
     return null; 
    } 
    Map<String, ScoreDetail> scoreDetailMap = new HashMap<String, ScoreDetail>(); 
    WorkingMemory workingMemory = ((DroolsScoreDirector) scoreDirector).getWorkingMemory(); 
    if (workingMemory == null) { 
     return Collections.emptyList(); 
    } 
    Iterator<ConstraintOccurrence> it = (Iterator<ConstraintOccurrence>) workingMemory.iterateObjects(
      new ClassObjectFilter(ConstraintOccurrence.class)); 
    while (it.hasNext()) { 
     ConstraintOccurrence constraintOccurrence = it.next(); 
     ScoreDetail scoreDetail = scoreDetailMap.get(constraintOccurrence.getRuleId()); 
     if (scoreDetail == null) { 
      scoreDetail = new ScoreDetail(constraintOccurrence.getRuleId(), constraintOccurrence.getConstraintType()); 
      scoreDetailMap.put(constraintOccurrence.getRuleId(), scoreDetail); 
     } 
     scoreDetail.addConstraintOccurrence(constraintOccurrence); 
    } 
    List<ScoreDetail> scoreDetailList = new ArrayList<ScoreDetail>(scoreDetailMap.values()); 
    Collections.sort(scoreDetailList); 
    return scoreDetailList; 
} 
} 

ответ

2

После

this.scoreDirector.setWorkingSolution(solution); 

Вы забыли позвонить

this.scoreDirector.calculateScore(); 

Я буду документы об использовании Solver.getScoreDirectorFactory() в 5.4.0.Final.

+0

ОК, спасибо, что ответили! – Nurlan