Menu Close
Settings Close

Language and Page Formatting Options

第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)に渡された計画インスタンスのクローンである可能性が高いです。この場合、つまりは別のインスタンスであることを意味しています。