第 7 章 使用 OptaPlanner solver

解决者为您规划问题找到最佳和最佳解决方案。一个解决者一次只能解决一个规划问题实例。solvers 使用 Solver Factory 方法 构建:

public interface Solver<Solution_> {

    Solution_ solve(Solution_ problem);

    ...
}

一个 solver 应该只从单个线程访问,除了 javadoc 中特别记录为 thread-safe 的方法。solve () 方法调整当前线程。拖放线程可能会导致 REST 服务的 HTTP 超时,它需要额外的代码来并行解决多个数据集。要避免这些问题,请使用 SolverManager

7.1. 解决问题

使用解决方案解决计划问题。

先决条件

  • 从 solver 配置构建的 Solver
  • 代表规划问题实例的 @PlanningSolution 注释

流程

提供计划问题作为 solve () 方法的参数。解决者将返回找到最佳解决方案。

以下示例解决了 NQueens 问题:

    NQueens problem = ...;
    NQueens bestSolution = solver.solve(problem);

在本例中,solve () 方法将返回 NQueens 实例,每个 Queen 分配到一个 Row

注意

提供给 solve (Solution) 方法的解决方案实例可以部分或完全初始化,这通常是重复规划的情况。

图 7.1. 用于 8ms 中 Four Queens Puzzle 的最佳解决方案(Also a Optimal Solution)

8ms 中 Four Queens Puzzle 的最佳解决方案

solve (Solution) 方法可能需要很长时间,具体取决于问题大小和 solver 配置。Solver 智能地通过可能的解决方案搜索空间,并记住在解决过程中遇到的最佳解决方案。根据很多因素,包括问题大小、Solver 配置等因素、解决者配置等,最佳解决方案 可能是或 可能不是最佳 解决方案。

注意

提供给方法 解决(Solution) 的解决方案实例由 Solver 更改,但不要将其错误地用于最佳解决方案。

方法 解决(Solution)getBestSolution () 返回的解决方案实例最有可能是提供给方法 解决(Solution) 的规划克隆,这意味着它是一个不同的实例。