Gurobiは \(x<a\) のような等号なしの不等式制約をサポートしていません。このような制約式をモデルへ追加しようとすると、NotImplementedError や次のような例外を引き起こします。
TypeError: '<' not supported between instances of 'Var' and 'int'.
言い換えれば、すべての制約は等号付きの不等式 \(x \leq a\) か等式制約 \(x = a\) の形である必要があります。
等号なしの不等式制約を利用できない理由には、理論的な理由と実用的な理由の両方の側面があります。
- 等号の無い不等式制約は、閉集合ではなく開集合を形成します。その結果、その最適化問題は最適解を持たない可能性があります。
- 浮動小数点数値計算のため、Gurobiのようなソルバーはトレランスのもとで問題を解きます。その仮定の下では、実用上 \(x<a\) 制約は制約 \(x \leq a\) と変わりません。なぜならば、互いに十分に近い2つの数値は、有限浮動小数点演算を使用する機械では区別できないからです。
もし、厳密に \(x\) は \(a\) より小さい という制約を記述したければ、\(a\) に等しいとみなす有限の閾値を定義する必要があります。閾値を使って例えば\(x \leq a - 10^{-3}\)というような制約を書くことができます。実際の閾値(例では \(10^{-3}\) )はアプリケーションによって異なり、個々のアプリケーションに大きく依存するため、閾値の決定はユーザ個別の判断で行う必要があります。
コメント
0件のコメント
記事コメントは受け付けていません。