【发布时间】:2021-03-18 17:54:00
【问题描述】:
说实话,我有一个复杂的模型,而且我的 OptaPlanner 模型中可能存在错误。
我不确定以下是否可能和正常,或者我的映射中某处存在错误,我应该根据我的实体创建一个 MCVE。
TLDR:
我的项目中某处有以下 Kotlin 代码:
val solverJob = solverManager.solveAndListen(problem.id, problemMap::get) {
val hardScore = it.score!!.hardScore
if (scoreManager.explainScore(it).score.hardScore != hardScore) {
throw IllegalStateException()
}
onBetterSolutionFoundCallback(mapSolutionToFrontendObject(it))
}
这很简单,它会给 OptaPlanner 带来问题,并在找到更好的解决方案时调用回调。这里的诀窍是它会仔细检查解决方案是否可行。
Aaaaand,有时会抛出 IllegalStateException。 scoreManager.explainScore(it).score 报告存在一个硬约束违规,而solution.score 表示没有硬约束违规。
棘手的部分是solution.score 在调用scoreManager.explainScore 方法后更新。
我查看了解决方案,ScoreManager 是正确的:解决方案中有一个硬约束违规。但一切都报告说,在我调用 scoreManager.explainScore 方法之前,这是一个可行的解决方案。
在我的案例中,OptaPlanner 在引发此异常之前找到了 2 个正确的解决方案,因此存在可行的解决方案,但 OptaPlanner 将它们替换为不可行的解决方案。
这是正确的行为吗?
或者我的领域模型有什么错误?
或者是 OptaPlanner 中的一个 bug,我应该基于此创建一个 bugreport?
我正在使用 Quarkus 1.11.1.Final 和 OptaPlanner 8.1.0.Final。
谢谢,
【问题讨论】:
标签: optaplanner constraint-programming