第8章 OptaPlanner ソルバー

ソルバーは、計画の問題に対する最適で最適なソリューションを見つけます。ソルバーで解決できる計画問題インスタンスは度に 1 つずつです。ソルバーは、SolverFactory メソッドを使用して構築されます。

public interface Solver<Solution_> {

    Solution_ solve(Solution_ problem);

    ...
}

スレッドセーフであることが javadoc に具体的に記載されているメソッドを除いて、ソルバーには単一のスレッドからアクセスする必要があります。solve() メソッドは、現在のスレッドを占有します。スレッドを占有すると、REST サービスの HTTP タイムアウトが発生する可能性があり、複数のデータセットを並行して解決するために追加のコードが必要になります。このような問題を回避するには、代わりに SolverManager を使用してください。

8.1. 問題の解決

ソルバーを使用して、計画の問題を解決します。

前提条件

  • ソルバー設定で構築された Solver
  • 計画問題インスタンスを表す @PlanningSolution アノテーション

手順

計画問題を solve() メソッドの引数として提供します。ソルバーは、見つかった最良の解を返します。

次の例は、NQueens の問題を解決します。

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

この例では、 solve() メソッドは、すべての QueenRow に割り当てられた NQueens インスタンスを返します。

注記

solve (Solution) メソッドに指定されたソリューションインスタンスは、部分的または完全に初期化できます。これは、繰り返して計画する場合によくあります。

図8.1 8ms のフォークイーンズパズルのベストソリューション (最適なソリューションでもあります)

solvedNQueens04

solve(Solution) メソッドは、問題のサイズとソルバーの設定によっては時間がかかる場合があります。Solver は、可能な解決策の検索スペースをインテリジェントに処理し、解決中に遭遇した最良の解決策を記憶します。問題の大きさ、Solver が持っているどのくらいの時間、ソルバーの設定、等々の数ある要因により、最善の 解決策は、最適な 解決策ではない可能性もあります、

注記

メソッド solve (Solution) に 与えられたソリューションインスタンスは Solver によって変更されますが、それを最良のソリューションと間違えないでください。

solve (Solution) または getBestSolution() メソッドによって返されたソリューションのインスタンスは、solve (Solution) に渡された計画インスタンスのクローンである可能性が高いです。この場合、つまりは別のインスタンスであることを意味しています。