drools-planner - 在 drools-planner 中获取最终最佳解决方案的破坏约束列表

标签 drools-planner

我正在使用 drools-planner-5.4.0.CR1,我想获取最终最佳解决方案的破坏约束列表

还查看了 5.4.0.CR1 的示例

我已经像示例中那样实现了,但它返回空列表,换句话说,getScoreDetailList().size()等于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;
}
}

最佳答案

之后

this.scoreDirector.setWorkingSolution(solution);

你忘了打电话

this.scoreDirector.calculateScore();

我将记录有关在 5.4.0.Final 中使用 Solver.getScoreDirectorFactory() 的文档。

关于drools-planner - 在 drools-planner 中获取最终最佳解决方案的破坏约束列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10222382/

相关文章:

集合中不存在口水

java - 检查对象是否在列表中的规则

java - 如何使用 Drools Planner?

parallel-processing - 在集群上部署 optaplanner

java - Drools Planner 构造启发式 java.lang.ClassCastException

java - IncrementalScore 在 Optaplanner 中产生不可行的解决方案

java - OptaPlanner CVRPTW - 持续交付

java - 在解决时间问题的同时移动链式规划实体