2016-09-30 129 views
1

执行了我的项目的一些规则之后,我做了一个"ScoreConsistencyCheck"以确保我自己的规则正确实施。在Drools中调试Optaplanner规则

"ScoreConsistencyCheck"意思是实现我自己的Java方法,这个方法可以在我终止早期求解或者通过配置终止之后调用,这将会输出预期的分数。此方法的参数是Solution实例,基于解决方案的状态计算预期分数,然后将其与来自Solution实例的“分数”变量的分数进行比较。

当我使用FULL_ASSERT时,它不会抛出ScoreCorruption异常,但是当我尝试这种方式时,我有时会在构建启发式或本地搜索的特定步骤中得到分数差异。我的猜测是因为OptaPlanner不知道在FULL_ASSERT中基于解决方案的所有预期分数是否与其关注的是分步分数与撤销移动完成后重新计算的分数相同。

因此,因为"ScoreConsistencyCheck"只在求解结束后调用,所以我无法真正推导出是什么情况导致问题(如果导致了问题),因为发生此问题的移动和步骤未知。

因此,我正在寻找一种方法,在每次移动后都会显示我的预期分数(来自“ScoreConsistencyCheck”),因此我可以将其与OptaPlanner进行比较,找到错过的案例在计算中。为此,我需要一种方法在每次移动后获得工作解决方案。

经过一番搜索,我无法找到很多。但是,我也发现,在Optaplanner 7.0.0测试版有一个ScoreVerifier(使用Optaplanner 6.4.0),但该案件是:

  • 我不知道这是否会完成我期待因为几乎没有关于它的文档。
  • 我在执行时遇到问题。

我在这里的问题是:

  1. 如何获得每个移动后workingSolution,并用它来检查?
  2. Optaplanner 6.4.0中有一项功能可以让我做到这一点吗?
  3. 如果没有功能,是否有可能的解决方法?
  4. 有没有更好的方法来检查规则的分数一致性?
+0

“ScoreConsistencyCheck”听起来像是“assertionScoreDirectorFactory”配置的弱版本,请参阅文档。它允许您使用简单的java实现来检查DRL评分规则,以便在求解过程中计算每个单独的分数。 –

回答

1
  1. 是的,<assertionScoreDirectorFactory>(参见文档)。与FULL_ASSERT一起使用,你会对腐败开始的地方有更加独立的看法。
+0

谢谢,生病了,试试看看我得到了什么 –