Gurobiは決定論的に設計されています。すなわち同じコンピュータ上、同じGurobiのバージョン、同じ入力(モデルとパラメータ)を与えたとき、常に同じ結果が得られます。Gurobiは並列最適化においても決定論的です。複数のスレッド動作した場合にも常に同じ結果が得られます。しかし、以下のような小さな変更も含め、何らかの入力を変更した場合、異なる結果が得られる可能性があります。
- パラメータの値
- 係数のRounding
- 制約や変数の順番
- 初期解
また、次のような時間に依存するパラメータを利用する場合、決定論的動作をしない場合があります。
- TimeLimit: 実行時のワークロードによって同一時間内の処理が変わりうる
- NoRelHeurTime: 同上
- Method: 連続モデルやroot緩和で使用されるアルゴリズムを決定するパラメータで、デフォルト(Method=-1)では非決定性のある並列処理が実行されるケースがある。決定論的動作を担保したい場合にはMethod=0, 1, 2, 4のいずれかを使用する。
- ConcurrentMIP: 並列MIPは決定論的ではない。異なる独立したMIPソルバーの実行時間が非常に近く、数理モデルに複数の最適解が存在する場合には、同じモデルでも実行の度にわずかに違う解が出力され得る。デフォルトではGurobiは並列MIPを使用しない。
TimeLimitパラメータの決定論的な代替案は、WorkLimitパラメータです。同じくNoRelHeurTimeについてはNoRelHeurWorkが利用できます。
結果の再現性を保証するためには、Gurobiで解くモデルを構築するスクリプトも決定論的であるべきです。例えばPythonの集合(set)のようないくつかのデータ構造は決定論的ではなく、同じデータを使って同じコードを実行しても、モデル内の変数や制約の順序が異なる可能性があります。2つのモデルが同じかどうかを確認するには、それらのFingerprintを比較します。