OptaPlanner的神话评分腐败

inj*_*cto 5 java optimization optaplanner

我为我的模型使用增量分数计算器.在"完全断言"模式下优化几小时/几天后,抛出了分数损坏异常:

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]
Run Code Online (Sandbox Code Playgroud)

这个分数在参数上有所不同timelineGapsScore.分数实例从分数计算对象字段创建的prioritiesScore,timelineGapsScore,requirementGapsScoretimelineVersionsScore.按日志记录,这两个分数的实例在这些字段中是等效的,但是optaplanner引擎找到差异(-86591/-2765/-422/-591)vs(-86591/-2873/-422/-591).怎么可能?

我怀疑解决方案克隆上的引用泄漏(它是特定的实现并进行深度复制),但仔细的代码检查不会显示此类错误.

UPD:我忘了提及:optaplanner以守护进程模式运行,模型能够实时更改事实.所以我怀疑模型中的竞争条件.但我不知道如何在optaplanner的引擎盖下实现注入变化(文档中的信息不够).

inj*_*cto 0

这是我的实现错误。准确执行增量分数计算器(或尝试使用 Drools)。