multithreading - 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
有人可以指点我正确的方法吗?谢谢!
解决方案
我建议阅读这篇出色的博客文章: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));
}
}
推荐阅读
- javascript - 如何创建一个 jquery validate 自定义方法来验证邮政编码数组
- boost - Cmake 错误:找不到 Boost(缺少:Boost_INCLUDE_DIR)
- docker - 使用自定义路径和自定义文件名构建的 Docker 不起作用
- c# - 如何设置每行具有不同列数的表格?
- microsoft-graph-api - Microsoft Graph 客户端在获取照片时抛出异常 ErrorApiQuarantined
- reactjs - 反应中的部分 css 出现在整个应用程序中
- sql-server - SQL Server:将 Varchar 转换为 XML - 然后对其进行操作并选择数据?
- swiftui - SwiftUI - 向视图添加两个手势?
- python-3.x - 我的第一个自定义日志记录处理程序不起作用
- c# - 我们如何确保所有 NUnit [Test] 方法都是公开的?