首页 > 解决方案 > Optaplanner 多线程尝试在自定义移动时产生“缺少变基”

问题描述

我将 Optaplanner 库从 7.5 更新到 7.9,以便与护士排班代码的变体一起使用,并使用发行说明(例如,某些方法名称已更改)成功重建并重新运行。然后,我将“moveThreadCount”xml 行(用于多线程)添加到我的求解器配置 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() 方法的参考,我也没有在当前(较新的)文档部分中看到关于构建自定义移动的参考。 https://docs.optaplanner.org/7.12.0.Final/optaplanner-docs/html_single/index.html#customMoves

有人可以指点我正确的方法吗?谢谢!

标签: multithreadingoptaplanner

解决方案


我建议阅读这篇出色的博客文章: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));
    }

}

推荐阅读