首页 > 解决方案 > 解释 Optaplanner 中的所有动作

问题描述

我目前正在使用ObservabilityPhaseListener挂钩到优化运行。一个特定的用例是调试为什么某个组合/移动会导致较低的分数(因此没有被选中)。

目前,stepEnded这是我能走的最低点,但已经太晚了,因为不会选择“坏”的举动,因此从未解释过。

我也一直在使用 hack 来执行移动stepEnded并解释它,但它有时是不可行的,或者只是太费力了。

有没有人知道如何在优化过程中完成解释所有动作(及其差的分数)?

谢谢。

-- 编辑:我已经设法实现了一个自定义ScoreDirectoryFactory,但在将其插入配置时遇到了问题:

class MyScoreDirectorFactory<Solution_>(solutionDescriptor: SolutionDescriptor<Solution_>?, kieContainer: KieContainer?, ksessionName: String?) : DroolsScoreDirectorFactory<Solution_>(solutionDescriptor, kieContainer, ksessionName) {
    @Override
    override fun buildScoreDirector(lookUpEnabled: Boolean, constraintMatchEnabledPreference: Boolean): DroolsScoreDirector<Solution_> {
        return super.buildScoreDirector(lookUpEnabled, true)
    }
}

val config = SolverConfig().apply {
        environmentMode = REPRODUCIBLE
        solutionClass = XYZ::class.java
        entityClassList = listOf(...)

        scoreDirectorFactoryConfig = ScoreDirectorFactoryConfig().apply {
             ... // ?
        }
}

标签: javakotlinoptaplanner

解决方案


人类经常会问为什么某个组合被拒绝,而这正是打破约束可以派上用场的地方

让用户在 UI 中进行更改并运行结果ScoreManager.explain(Solution)以显示分数和起诉书的热图


推荐阅读