【发布时间】:2015-04-16 10:35:35
【问题描述】:
我为我的模型使用增量分数计算器。 在“完全断言”模式下优化几个小时/天后抛出分数损坏异常:
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 的引擎下实现的(信息不足in docs)。
【问题讨论】:
-
只要您正确使用
addProblemFactChange()在求解器中修改模型(因为该回调在求解器线程中执行),就不可能出现竞争条件。 -
请注意
addProblemFactChange()确实很棘手。它通常需要进行更深层次的克隆,而不仅仅是计划克隆。例如,要在 CB 示例中添加新计算机,需要克隆 computerList(这在计划克隆中不会发生)。
标签: java optimization optaplanner