前書き
チャレンジ
あなたの仕事は整数線形計画法(ILP)のソルバーを書くことです。ILPでは、一連の未知数(すべて整数)の線形不等式が与えられ、目標は線形関数の最小または最大を見つけることです。
たとえば、不等式の場合(混合整数線形計画法からの例)
4x+2y-15≤0
x+2y- 8≤0
x+ y- 5≤0
- x ≤0
- y ≤0
目的関数3x+2y
、目的関数の最大値は12
(x=2,y=3
)で、最小値は0
(x=y=0
)でなければなりません。
入力は2D配列(または標準仕様に準拠する任意の同等物)として与えられ、各行は最終行を除く1つの不等式に対応します。配列内の数字は係数であり、その≤0
部分は常に省略されます。n
各行に要素がある場合、n-1
未知の要素があることを意味します。
配列の最後の行は、線形関数に対応しています。係数がリストされます。
たとえば、上記の問題の入力配列は次のとおりです。
[[4,2,-15],[1,2,-8],[1,1,-5],[-1,0,0],[0,-1,0],[3,2,0]].
出力は、適切な形式で指定された最小値と最大値である必要があります。
次の問題の場合(上記の問題から2つの制限が取り除かれます):
[[4,2,-15],[1,2,-8],[1,1,-5],[3,2,0]].
最大値はまだ12
ですが、最小値は存在せず、目的関数は任意の大きな(絶対値の意味で)負の値を持つことができます。この場合、プログラムは12
、回答者が決定した偽の値に従ってを出力する必要があります。別のケースは、解決策がまったくないことです。たとえば、
[[4,2,-15],[-1,-2,7],[-1,0,3],[0,1,0],[3,2,0]].
この場合、偽の値も出力する必要があります。目的関数の「最適値」が無限である場合と、解がまったくない場合を識別するのは良いことですが、これは必要ではありません。
入力には、不等式と目的関数の両方の整数係数のみが含まれます。未知数もすべて整数です。不等式の係数行列は、完全なランクを持つことが保証されています。
テストケース
@KirillLの功績。元のテストスイートでバグを見つけ、ILPの問題についての理解を深めてくれました。
Input
Output
[[4,2,-15],[1,2,-8],[1,1,-5],[-1,0,0],[0,-1,0],[3,2,1]]
[1,13]
[[4,2,-15],[1,2,-8],[1,1,-5],[3,2,0]]
[-inf, 12]
[[4,2,-15],[-1,-2,7],[-1,0,3],[0,1,0],[3,2,0]]
[NaN, NaN]
[[-1,-1,-1,-1,-1,8],[1,1,1,1,0,0],[5,5,5,5,6,7]]
[55, inf]
[[-1,-1,-1,-1,-1,8],[1,1,1,1,0,0],[0,0,0,0,0,4]]
[4, 4]
[[4,2,-15],[-1,-2,7],[-1,0,3],[0,1,0],[0,0,4]]
[NaN, NaN]