- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我为我的模型使用增量分数计算器。 在“完全断言”模式下优化数小时/数天后 分数损坏异常被抛出:
java.lang.IllegalStateException: Score corruption: the workingScore (-86591/-2765/-422/-591) is not the uncorruptedScore (-86591/-2873/-422/-591) after completedAction [...]:
Uncorrupted: Score calculator 3718238 [schedule=Schedule6422-2015-04-16T09:47:36.932[-86591/-2873/-422/-591], prioritiesScore=-422, timelineGapsScore=-2873, requirementGapsScore=-86591, timelineVersionsScore=-591]
Corrupted: Score calculator 3717237 [schedule=Schedule6422-2015-04-16T09:47:36.932[-86591/-2873/-422/-591], prioritiesScore=-422, timelineGapsScore=-2873, requirementGapsScore=-86591, timelineVersionsScore=-591]
分数在参数 timelineGapsScore
中有所不同。分数实例是从分数计算器对象字段 prioritiesScore
、timelineGapsScore
、requirementGapsScore
和 timelineVersionsScore
创建的。通过日志,两个分数的实例在这些字段中是等效的,但 optaplanner 引擎发现差异 (-86591/-2765/-422/-591) 与 (-86591/-2873/-422/-591)。怎么可能?
我怀疑解决方案克隆的引用泄漏(它是特定的实现并进行深度复制),但仔细的代码检查没有显示此类错误。
UPD: 我忘了说:optaplanner 以守护进程模式运行,模型能够实时更改事实。所以我怀疑模型中的竞争条件。但我不知道在 optaplanner 的引擎盖下如何实现更改注入(inject)(信息不够 in docs )。
最佳答案
“当解决方案发生变化时,增量分数计算(也称为基于增量的分数计算)将计算与先前状态的增量以找到新的分数,而不是在每次解决方案评估时重新计算整个分数。
例如,如果单个女王 A 从第 1 行移动到第 2 行,它不会费心去检查女王 B 和 C 是否可以互相攻击,因为他们都没有改变。"
当增量分数和真实分数(= 未损坏的分数)不同步时,就会发生分数损坏。
可能有多种原因。如果您使用 Drools 分数计算,它甚至可能是 Drools 中的错误。如果您可以隔离它并使用复制器归档一个 jira,那么我们通常会快速查看它。
隔离方式(按此顺序!):
关于java - OptaPlanner 神话般的分数腐败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29672171/
我是一名优秀的程序员,十分优秀!