我目前正在使用ObservabilityPhaseListener
挂接优化运行。一个特定的用例是调试为什么某个组合/移动会导致较低的分数(因此没有被选中(。
目前,stepEnded
是我能达到的最低值,但已经太晚了,因为;坏的";移动将不会被选择,因此永远不会被解释。
我也一直在使用一个破解,在stepEnded
中执行一个移动并解释它,但有时它不可行,或者只是太费力了。
有人知道如何在优化过程中解释所有动作(以及它们糟糕的分数(吗?
谢谢。
--edit:我已经设法实现了一个自定义的ScoreDirectoryFactory
,但在将其插入config:时遇到了问题
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 {
... // ?
}
}
人们经常会问为什么某个组合被拒绝,这就是打破限制的派上用场的地方
让用户在UI中进行更改,并通过ScoreManager.explain(Solution)
运行结果,以显示分数和指标的热图。
为了它的价值(这里是龙!(:
启用TRACE
日志记录,以确定该步骤中的哪个步骤索引和哪个移动索引的行为与您预期的不同。在LocalSearchDecider
中放置一个条件断点,条件是步骤索引和移动索引匹配(在达到该断点之前跳过数千次移动求值(。在那里,在移动完成之前和之后(在撤消之前(使用ScoreManager.explainScore()
运行一个代码片段。