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

时间:2014-10-24 13:13:11

标签: java optimization optaplanner scoring drools-planner

我仍在使用OptaPlanner来优化类似于VehicleRoutingExample的链式规划问题。我的计划实体有一个计划变量,它是另一个计划实体。分数是HardSoftScores。

我已经初始化了一个IncrementalScore来解决我的运行时问题,但有些东西不能正常工作,我无法找到原因。 (有调试,system.out等等......)

问题是Solver没有使用IncrementalScore创建我的测试数据集的可行解决方案。我知道有可能找到一个可行的解决方案,因为解算器使用我的EasyScore创建了一个解决方案。

EasyScore创建的最佳解决方案为我提供了得分:(0hard / -151763soft)当IncrementalScore解决时,我得到了一些奇怪的值。

solver.getBestsolution()。getScore()给出的分数是(-25hard / -207111soft),当我实例化额外的IncrementalScoreCalculator并让它计算bestSolution的分数时,我得到的值(-34hard / - 207111soft)。我检查了解决方案,发现第一个值是错误的,但第二个值是“正确的”(但不可行)。

有人知道错误在哪里吗?或者还有其他方法可以找到原因吗?

1 个答案:

答案 0 :(得分:1)

在手册中,请参阅“5.3.6。无效分数检测”一章,了解简易分数和增量分数计算何时不同步。

<environmentMode>FULL_ASSERT</environmentMode>
...
<scoreDirectorFactory>
  <scoreDefinitionType>...</scoreDefinitionType>
  <incrementalScoreCalculatorClass>...IncrementalScoreCalculator</incrementalScoreCalculatorClass>
  <assertionScoreDirectorFactory>
    <easyScoreCalculatorClass>...EasyScoreCalculator</easyScoreCalculatorClass>
  </assertionScoreDirectorFactory>
</scoreDirectorFactory>

然后将两个实现中的约束类型注释掉,以对不同实现的约束进行归零。它看起来像是你的无法计算的硬约束之一。