整数線形計画法
前書き 整数線形計画法のソルバーを記述します。 チャレンジ あなたの仕事は整数線形計画法(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] …