第8章 OptaPlanner ソルバー
ソルバーは、計画の問題に対する最適で最適なソリューションを見つけます。ソルバーで解決できる計画問題インスタンスは度に 1 つずつです。ソルバーは、SolverFactory
メソッドを使用して構築されます。
public interface Solver<Solution_> { Solution_ solve(Solution_ problem); ... }
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);
NQueens problem = ...;
NQueens bestSolution = solver.solve(problem);
この例では、 solve()
メソッドは、すべての Queen
が Row
に割り当てられた NQueens
インスタンスを返します。
solve (Solution)
メソッドに指定されたソリューションインスタンスは、部分的または完全に初期化できます。これは、繰り返して計画する場合によくあります。
図8.1 8ms のフォークイーンズパズルのベストソリューション (最適なソリューションでもあります)

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