Optaplanner多线程尝试在自定义移动上产生了“缺少基准”

时间:2018-10-13 02:18:01

标签: multithreading optaplanner

我将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

有人可以指出正确的方式吗?谢谢!

1 个答案:

答案 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));
    }

}