8.2. ソルバー環境モード

ソルバー環境モードを使用すると、実装の一般的なバグを検出できます。ロギングレベルには影響しません。

ソルバーには単一のランダムインスタンスがあります。一部のソルバー設定は、他の設定よりもランダムインスタンスを多く使用します。たとえば、シミュレーテッドアニーリングアルゴリズムは乱数に大きく依存しますが、Tabu Search はスコアの同点を解決するために乱数にのみ依存します。環境モードは、そのランダムインスタンスのシードに影響を与えます。

ソルバー設定 XML ファイルで環境モードを設定できます。次の例では、 FAST_ASSERT モードを設定します。

<solver xmlns="https://www.optaplanner.org/xsd/solver" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="https://www.optaplanner.org/xsd/solver https://www.optaplanner.org/xsd/solver/solver.xsd">
  <environmentMode>FAST_ASSERT</environmentMode>
  ...
</solver>

次のリストは、ソルバー設定ファイルで使用できる環境モードについて説明しています。

  • FULL_ASSERT モードは、すべてのアサーションをオンにします。たとえば、増分スコアの計算が移動ごとに破損していないというアサーション、Move 実装のバグ、制約、エンジン自体などでフェイルファストします。このモードは再現可能です。また、非アサートモードよりも頻繁に calculateScore() メソッドを呼び出すため、煩わしいものです。FULL_ASSERT モードは、増分スコア計算に依存しないため、非常に低速です。
  • NON_INTRUSIVE_FULL_ASSERT モードは、Move 実装のバグ、制約、エンジン自体などでフェイルファストするためにいくつかのアサーションをオンにします。このモードは再現可能です。非アサートモードよりも頻繁に calculateScore() メソッドを呼び出さないため、邪魔になりません。NON_INTRUSIVE_FULL_ASSERT モードは、増分スコア計算に依存しないため、非常に低速です。
  • FAST_ASSERT モードは、undoMove のスコアが Move の前と同じであるというアサーションなど、ほとんどのアサーションをオンにして、Move 実装のバグ、制約、エンジン自体などをフェイルファストします。このモードは再現可能です。また、非アサートモードよりも頻繁に calculateScore() メソッドを呼び出すため、煩わしいものです。FAST_ASSERT モードは遅いです。FAST_ASSERT モードをオンにして、計画の問題を短時間実行するテストケースを作成します。
  • REPRODUCIBLE モードは、開発中に推奨されるため、デフォルトのモードです。このモードでは、同じ OptaPlanner バージョンで 2 回実行すると、同じコードが同じ順序で実行されます。次の注意事項が当てはまる場合を除いて、これら 2 つの実行はすべてのステップで同じ結果になります。これにより、バグを一貫して再現できます。また、スコア制約のパフォーマンスの最適化など、特定のリファクタリングを実行全体で公平にベンチマークすることもできます。

    注記

    REPRODCIBLE モードを使用しているにもかかわらず、次の理由により、アプリケーションが完全に再現できない場合があります。

    • 特にソリューションの実装において、計画エンティティーまたは計画値のコレクションに対して、JVM 実行間で順序が一貫していないが、通常の問題の事実ではない HashSet または別の コレクション を使用する。LinkedHashSet に置き換えます。
    • 時間勾配に依存するアルゴリズム、特にシミュレーテッドアニーリングアルゴリズムを、終了に費やした時間と組み合わせます。割り当てられた CPU 時間大きな違いがあると、時間勾配値に影響を与えます。シミュレーテッドアニーリングアルゴリズムをレイトアクセプタンスアルゴリズムに置き換えるか、終了に費やした時間をステップカウント終了に置き換えます。
  • REPRODUCIBLE モードは、NON_REPRODUCIBLE モードよりもわずかに遅くなる可能性があります。実稼働環境で再現性の恩恵を受けることができる場合は、実稼働でこのモードを使用してください。実際には、 REPRODUCIBLE モードでは、シードが指定されていない場合、デフォルトの固定ランダムシードが使用され、ワークスティーリングなどの特定の同時実行の最適化も無効になります。
  • NON_REPRODUCIBLE モードは、REPRODUCIBLE モードよりもわずかに高速です。デバッグやバグ修正が困難になるため、開発中の使用は避けてください。実稼働環境で再現性が重要でない場合は、実稼働で NON_REPRODUCIBLE モードを使用してください。実際には、シードが指定されていない場合、このモードは固定ランダムシードを使用しません。