第 9 章 OptaPlanner SolverManager
SolverManager 是一个或多个 Solver 实例的一个常见问题,可简化 REST 和其他企业服务中的规划问题。
与 Solver.solve (…) 方法不同,SolverManager 具有以下特征:
-
SolverManager.solve (…)立即返回:它会在不阻止调用线程的情况下调度异步解决的问题。这可避免 HTTP 和其他技术的超时问题。 -
SolverManager.solve (…)可以并行解决同一域的多个规划问题。
在内部,SolverManager 管理解决程序线程的线程池,它调用 Solver.solve (…) 和消费者线程的线程池,用于处理最佳解决方案更改事件。
在 Quarkus 和 Spring Boot 中,SolverManager 实例会自动注入到您的代码中。如果您使用 Quarkus 或 Spring Boot 以外的平台,请使用 create (…) 方法构建 SolverManager 实例:
SolverConfig solverConfig = SolverConfig.createFromXmlResource(".../cloudBalancingSolverConfig.xml");
SolverManager<CloudBalance, UUID> solverManager = SolverManager.create(solverConfig, new SolverManagerConfig());
SolverConfig solverConfig = SolverConfig.createFromXmlResource(".../cloudBalancingSolverConfig.xml");
SolverManager<CloudBalance, UUID> solverManager = SolverManager.create(solverConfig, new SolverManagerConfig());
每个提交给 SolverManager.solve (…) 方法的问题都必须有一个唯一的问题 ID。稍后调用 getSolverStatus (problemId) 或 terminationEarly (problemId) 使用问题 ID 来区分规划问题。问题 ID 必须是不可变类,如 Long,String, 或 java.util.UUID。
SolverManagerConfig 类有一个 parallelSolverCount 属性,用于控制并行运行多少个 solvers。例如,如果 parallelSolverCount 属性设置为 4,并且您提交五个问题,则四个问题会立即解决问题,并在第一个问题之一结束时启动第五个问题。如果这些问题每五分钟解决,则第五个问题需要 10 分钟才能完成。默认情况下,parallelSolverCount 设置为 AUTO,它解析到一半的 CPU 内核,无论解决者的 moveThreadCount 是什么。
要检索最佳解决方案,在解决问题后,通常会使用 SolverJob.getFinalBestSolution () :
但是,有更好的方法,在用户需要解决方案以及实时解决之前解决批处理问题,同时用户主动等待解决方案。
当前 SolverManager 实施在单一计算机节点上运行,但未来的工作旨在在云中分发可解决者负载。
9.1. 批量解决问题 复制链接链接已复制到粘贴板!
批量解决正在并行解决多个数据集。批量解决在夜间特别有用:
- 夜间通常有一些或没有问题更改。例如,一些组织会强制使用截止时间,例如,在 午夜前提交所有一天发出的请求。
- 解决者可能会运行更长的时间,通常是数小时,因为 nobody 正在等待结果和 CPU 资源成本低得多。
- 当员工参与下一工作日时,即可使用解决方案。
流程
要批量解决问题,由 parallelSolverCount 的限制,每个数据集都会创建以下类的 call solve (…) :
+