介绍
为整数线性规划编写一个求解器。
挑战
您的任务是编写整数线性规划(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数组形式给出(或遵循标准规范的任何等效形式),每一行对应一个不等式,最后一行除外。数组中的数字是系数,该≤0
部分始终被省略。如果n
每一行中都有元素,则意味着存在n-1
未知数。
数组的最后一行对应于线性函数。列出系数。
例如,上面问题的输入数组是
[[4,2,-15],[1,2,-8],[1,1,-5],[-1,0,0],[0,-1,0],[3,2,0]].
输出应该是最小和最大,以任何合理的形式给出。
对于以下问题(上述问题排除了两个限制):
[[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]