第 8 章 OptaPlanner Solver
解决者为您的规划问题找到最佳、最佳解决方案。解决者只能一次解决一个规划问题实例。解决者使用 SolverFactory 方法构建:
解决者应只从单个线程访问,除了 javadoc 中特别记录的方法作为线程安全的方法。solve () 方法会占用当前的线程。Hogging the thread 可能会导致 REST 服务的 HTTP 超时,它需要额外的代码来并行解决多个数据集。要避免这个问题,请改为使用 SolverManager。
8.1. 解决问题 复制链接链接已复制到粘贴板!
使用问题解决计划问题。
先决条件
-
从 solver 配置构建的
Solver -
代表规划问题实例的
@PlanningSolution注释
流程
将计划问题作为 solve () 方法的参数提供。解决者将返回找到的最佳解决方案。
以下示例解决了 NQueens 问题:
NQueens problem = ...;
NQueens bestSolution = solver.solve(problem);
NQueens problem = ...;
NQueens bestSolution = solver.solve(problem);
在本例中,solve () 方法将返回一个 NQueens 实例,每 Queen 分配给一个 Row。
为 solve (Solution) 方法提供的解决方案实例可以部分或完全初始化,这通常是重复计划中的情况。
图 8.1. 在 8ms (Also a Optimal Solution)中 Four Queens Puzzle 最佳解决方案。
解决(Solution) 方法可能需要很长时间,具体取决于问题大小和解决者配置。Solver 智能地完成可能解决方案的搜索空间,并记住解决过程中遇到的最佳解决方案。根据多个因素,包括问题大小、Solver 具有多少时间、解决者配置等,最好的 解决方案可能是或者 可能不是最佳 解决方案。
给方法 解决 的解决方案实例由 Solver 更改,但不会误认为最佳解决方案。
方法返回的解决方案实例 solve (Solution) 或 getBestSolution () 最有可能是提供给方法 解决(Solution) 的实例的计划克隆,这意味着它是不同的实例。