使用整数编程检查包含

时间:2015-08-11 16:51:39

标签: gurobi integer-programming

对于这个问题, region Z d 的一个子集,由有限多个具有整数系数的线性不等式定义,其中 Z d 是整数的d元组的集合。例如,(x, y)的非负整数的2x+3y >= 10对组合构成一个d=2的区域(非负性只会强加额外的不等式x>=0和{{1 }})。

  

问题:有没有一种好的方法,使用整数编程(或其他什么?)来检查一个区域是否包含在有限多个其他区域的并集中?

我知道一种检查遏制的方法,我将在下面介绍,但我希望有人可以提供一些改进,因为它不太有效。

这是我知道检查遏制的方式。首先,整数编程库可以直接检查区域是否为空:在整数编程术语中(据我所知),区域的空虚对应于模型的不可行性。我已经使用gurobi库编写了一些东西来检查空虚,并且它似乎在实践中适用于我关心的那种区域。

现在假设我们要检查区域y>=0是否包含在另一个区域X中(问题的特例)。让Y成为ZX的补集的交集。然后Y包含在X中,当且仅当Y为空时。现在,Z本身不是我所说的区域,但它是区域Z的联合,其中Z_1, ..., Z_n是用于定义n的不等式的数量}。我们可以通过检查每个Y是否为空来检查Z是否为空,我们可以按照上述说明执行此操作。

一般情况可以用完全相同的方式处理:如果Z_1, ..., Z_n是区域Y的有限联合,那么Y_1, ..., Y_k仍然是区域Z的有限联合,所以我们只检查每个Z_1, ..., Z_n是否为空。如果Z_iY_i不等式定义,则为m_i

总而言之,我们可以将遏制问题减少到空白问题,库可以直接解决。问题是我们可能必须解决大量空虚问题以解决遏制问题(例如,如果每个n = m_1 * m_2 * ... * m_k仅由两个不等式定义,那么Y_i会以n = 2^k呈指数增长) ,这可能需要很长时间。

1 个答案:

答案 0 :(得分:0)

你真的不希望得到一个简单的答案。假设A0 <= x_i <= 1形式的所有约束定义。 A可以被认为是真值表的所有可能行的集合。给出表格的任何逻辑表达,例如x or (not y) or z,您可以将其表达为线性不等式 例如x + (1-y) + z >= 1(以及0-1约束)。使用此方法,任何联合正规形式(CNF)的布尔公式都可以表示为Z^n中的区域。如果A定义如上,B_1, B_2, ...., B_k是与CNF对应的区域列表,则A包含在B_i的并集中,当且仅当这些区别为CNF是一种重言式。但是,重言式检查是NP完全问题的典型例子。

这并不是说它不能有效地减少到ILP(它本身就是NP完全的)。我没有看到任何直接的方法,但我怀疑用于识别冗余约束的一些技术是相关的。