我为我的模型使用增量分数计算器。 经过几个小时/几天的优化"完全断言"模式分数腐败异常被抛出:
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)vs(-86591 / -2873 < /强> / - 422 / -591)。它怎么可能?
我怀疑解决方案克隆上的引用泄漏(它的具体实现并进行深度复制),但仔细的代码检查并未显示此类错误。
UPD:我忘了提及:optaplanner以守护进程模式运行,模型能够实时更改事实。所以我怀疑模型中的竞争条件。但我不知道在optaplanner的引擎盖下如何实现注入变化(这不足以提供信息in docs)。
答案 0 :(得分:1)
“当解决方案发生变化时,增量分数计算(基于AKA delta的分数计算)将计算与之前状态相关的增量,以找到新分数,而不是在每次解决方案评估时重新计算整个分数。
例如,如果单个女王A从第1行移动到2,则不会费心去检查女王B和C是否可以相互攻击,因为它们都没有改变。“
当增量分数和实际分数(=未损坏的分数)不同步时,会发生分数损坏。
可能有几个原因。如果您使用Drools分数计算,它甚至可能是Drools中的一个错误。如果您可以将其隔离并使用复制器提交jira,那么我们通常会快速查看它。
隔离意味着(按此顺序!):
答案 1 :(得分:0)
这是我的实施错误。准确计算增量分数计算器(或尝试使用Drools)。