[英]Optaplanner early termination deltas between Incremental Score state and solution
我正在使用增量分数计算器类,因为大量使用地图和计算,这些地图和计算在流口水中不能很好地扩展。
它似乎运行良好,但由于我不得不调试,我注意到最终解决方案中使用的移动次数与我的 before/afterVariableChanged 处理程序处理的移动次数之间存在差异。 这会导致解决方案中实际分配的内容与增量分数对象中的状态之间存在差异。 根据一些日志,增量似乎不知道解决方案何时因提前终止而停止接受移动(我使用的是 secondsSpentLimit)。
如何阻止我的增量分数实施接收由于提前终止而不会在解决方案中考虑的 before/afterVariableChanged 事件?
您能否打开TRACE
日志记录以确认此行为?
本质上,LocalSearch 看起来像这样( moveThreadCount=NONE
(= 默认)):
for (each step && not terminated) {
stepStarted()
for (each move && not terminated) {
doMove(); // Triggers variable listeners
if (better move) updateBestSolution();
undoMove(); // Triggers variable listeners
}
stepEnded()
}
所以终止是原子与移动评估。 所以你的问题应该有另一个原因。
使用moveThreadCount=4
等,这个故事变得有点复杂,但每个移动线程都有自己的 ScoreDirector,所以它们几乎是独立工作的。
话虽这么说,增量Java分数计算和影子变量一起可以让人发疯......这主要是因为before
事件发生在doMove()的中间,就在变量改变之前。 当时,模型的一半可能已经处于无法理解的中间状态,因为移动的其他变量已经发生了变化。 FWIW,看看VariableListener.requiresUniqueEntityEvents()
,它可能会有所帮助......或者尝试 ConstraintStreams (如果你喜欢速度而不是功能,BAVET 实现)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.