もし、Gurobiがユーザーの想定していない解を返した時、最初にすべきことはその誤りがどのようなタイプかを特定することです。
よくある状況としては次のようなものがあります:
- Gurobi が想定されない変数の値を含む解を返した
- Gurobiが誤った目的関数値を返した
- 許容解が存在する問題に対して Gurobi がInfeasibleと判定した
- 同じ問題に対して Gurobi が二つの異なる解を返した
Gurobi が想定されない変数の値を含む解を返した
よくある原因:
- モデル内の変数が負の値をとるはずだがそうならない。 対象の変数の下限値が適切な負の値に設定されているかを確認してください。Gurobiの変数のデフォルトでは、下限値は0(非負変数)となっています。
- 整数変数やバイナリ変数が小数値をとる。 まず、対象の整数変数とバイナリ変数がgp.GRB.INTEGER と gp.GRB.BINARY として定義されているかを確認してください。また、整数またはバイナリ変数の値は、IntFeasTol パラメータ(デフォルトは1e-5)で定義された値よりも小さい誤差のもとで、最も近い整数から離れた値をとる可能性があることに注意してください。 詳細については Gurobiが整数変数に対して小数値を返すことがあるのはなぜ? を参照してください。
- モデルに複数の最適解がある。 一般に同じ目的関数値を持ち、変数の値が異なるような2つ以上の解が同じモデルに対して存在する可能性があります。
Numerical issues もこのような問題の一因となることがあります。
- IntFeasTol = 1e-09 や FeasibilityTol = 1e-09のような非常にタイトなトレランスで最適化を実行している 。 非常にタイトなトレランス下で最適化を実行するとNumerical issues の問題へつながることがあります。例えば"ほとんど1"に近い値をとるバイナリ変数がそのような厳しいトレランスを満たさない場合、0となってしまう場合があります。その結果、誤った値に変数が固定され、予期せぬ結果を生じることがあります。
- Big-Mとして必要以上に大きな値を利用している。 Big-M 制約における大きすぎるBig-Mの値は in a "Trickle Flows" と呼ばれる問題を引き起こすことがあります。例えば y <= 1000000 * x,(x はバイナリ変数、 y >=0)のような制約を考えます。デフォルトのIntFeasTol (1e-5)のもとで、 x = 0.0000099999, y = 9.9999 という解は整数条件を満たします。これは、 x≒0のもとでyが非負の値をとれることを意味しています。このようなふるまいによって、予期せぬ解が導かれることもあります。よってBig-Mの値は可能な範囲で小さくすることが推奨されます。Dealing with big-M constraints を参照してください。
- 非線形関数を利用している。FuncPieces, FuncPieceLength, FuncPieceError などのパラメータで、非線形関数の区分線形近似の粒度を調整してみてください。また、変数には可能な範囲でタイトな上下限値を設定することをお勧めします。
注意: もし古いバージョンのGurobiを利用しされている場合には、最新版のリリースにアップデートするようにしてください。各リリースでは、それ以前のバージョンにおけるバグ修正を含む数多くの改善が実施されています。
コメント
0件のコメント
記事コメントは受け付けていません。