Menu Close
Settings Close

Language and Page Formatting Options

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モードを使用してください。実際には、シードが指定されていない場合、このモードは固定ランダムシードを使用しません。