执行了我的项目的一些规则之后,我做了一个"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),但该案件是:
- 我不知道这是否会完成我期待因为几乎没有关于它的文档。
- 我在执行时遇到问题。
我在这里的问题是:
- 如何获得每个移动后
workingSolution
,并用它来检查? - Optaplanner 6.4.0中有一项功能可以让我做到这一点吗?
- 如果没有功能,是否有可能的解决方法?
- 有没有更好的方法来检查规则的分数一致性?
“ScoreConsistencyCheck”听起来像是“assertionScoreDirectorFactory”配置的弱版本,请参阅文档。它允许您使用简单的java实现来检查DRL评分规则,以便在求解过程中计算每个单独的分数。 –