我将Optaplanner库从7.5更新到7.9,以与不同的Nurserstering代码一起使用,并使用发行说明(例如,某些方法名称已更改)成功地重建和重新运行。然后,我在求解器配置xml中添加了“ moveThreadCount” xml行(用于多线程)。
<moveThreadCount>AUTO</moveThreadCount>
运行然后立即引发错误:
Caused by: java.lang.UnsupportedOperationException: The custom move class (class westgranite.staffrostering.solver.move.EmployeeChangeMove) doesn't implement the rebase() method, so multithreaded solving is impossible.
我确实有很多自定义动作。在发行说明中,我没有看到需要添加rebase()方法的任何参考,在当前的(较新的)文档部分中,关于构建自定义动作的参考也没有看到对rebase()的参考。 https://docs.optaplanner.org/7.12.0.Final/optaplanner-docs/html_single/index.html#customMoves
有人可以指出正确的方式吗?谢谢!
答案 0 :(得分:1)
我建议阅读这篇出色的博客文章:http://www.optaplanner.org/blog/2018/07/03/AGiantLeapForwardWithMultithreadedIncrementalSolving.html,因为它可以更深入地说明多线程求解的工作原理。
我还建议阅读有关rebase方法的javadoc,它应该为您指明正确的方向:https://docs.optaplanner.org/7.12.0.Final/optaplanner-javadoc/org/optaplanner/core/impl/heuristic/move/Move.html#rebase-org.optaplanner.core.impl.score.director.ScoreDirector-
这是一个例子:
public class CloudComputerChangeMove extends AbstractMove<CloudBalance> {
private CloudProcess cloudProcess;
private CloudComputer toCloudComputer;
...
@Override
public CloudComputerChangeMove rebase(ScoreDirector<CloudBalance> destinationScoreDirector) {
return new CloudComputerChangeMove(
destinationScoreDirector.lookUpWorkingObject(cloudProcess),
destinationScoreDirector.lookUpWorkingObject(toCloudComputer));
}
}