第7章 OptaPlanner ソルバーの使用
ソルバーは、計画の問題に対する最適で最適なソリューションを見つけます。ソルバーで解決できる計画問題インスタンスは度に 1 つずつです。ソルバーは、SolverFactory メソッドを使用して構築されます。
public interface Solver<Solution_> {
Solution_ solve(Solution_ problem);
...
}
スレッドセーフであることが javadoc に具体的に記載されているメソッドを除いて、ソルバーには単一のスレッドからアクセスする必要があります。solve() メソッドは、現在のスレッドを占有します。スレッドを占有すると、REST サービスの HTTP タイムアウトが発生する可能性があり、複数のデータセットを並行して解決するために追加のコードが必要になります。このような問題を回避するには、代わりに SolverManager を使用してください。
7.1. 問題の解決
ソルバーを使用して、計画の問題を解決します。
前提条件
-
ソルバー設定で構築された
Solver -
計画問題インスタンスを表す
@PlanningSolutionアノテーション
手順
計画問題を solve() メソッドの引数として提供します。ソルバーは、見つかった最良の解を返します。
次の例は、NQueens の問題を解決します。
NQueens problem = ...;
NQueens bestSolution = solver.solve(problem);
この例では、 solve() メソッドは、すべての Queen が Row に割り当てられた NQueens インスタンスを返します。
solve (Solution) メソッドに指定されたソリューションインスタンスは、部分的または完全に初期化できます。これは、繰り返して計画する場合によくあります。
図7.1 8ms のフォークイーンズパズルのベストソリューション (最適なソリューションでもあります)

solve (Solution) メソッドは、問題のサイズとソルバーの設定によっては時間がかかる場合があります。Solver は、可能な解決策の検索スペースをインテリジェントに処理し、解決中に遭遇した最良の解決策を記憶します。問題の大きさ、Solver が持っているどのくらいの時間、ソルバーの設定、等々の数ある要因により、最善の 解決策は、最適な 解決策ではない可能性もあります、
メソッド solve (Solution) に 与えられたソリューションインスタンスは Solver によって変更されますが、それを最良のソリューションと間違えないでください。
solve (Solution) または getBestSolution() メソッドによって返されたソリューションのインスタンスは、solve (Solution) に渡された計画インスタンスのクローンである可能性が高いです。この場合、つまりは別のインスタンスであることを意味しています。