对于这个问题, region 是 Z d 的一个子集,由有限多个具有整数系数的线性不等式定义,其中 Z d 是整数的d元组的集合。例如,(x, y)
的非负整数的2x+3y >= 10
对组合构成一个d=2
的区域(非负性只会强加额外的不等式x>=0
和{{1 }})。
问题:有没有一种好的方法,使用整数编程(或其他什么?)来检查一个区域是否包含在有限多个其他区域的并集中?
我知道一种检查遏制的方法,我将在下面介绍,但我希望有人可以提供一些改进,因为它不太有效。
这是我知道检查遏制的方式。首先,整数编程库可以直接检查区域是否为空:在整数编程术语中(据我所知),区域的空虚对应于模型的不可行性。我已经使用gurobi库编写了一些东西来检查空虚,并且它似乎在实践中适用于我关心的那种区域。
现在假设我们要检查区域y>=0
是否包含在另一个区域X
中(问题的特例)。让Y
成为Z
与X
的补集的交集。然后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_i
由Y_i
不等式定义,则为m_i
。
总而言之,我们可以将遏制问题减少到空白问题,库可以直接解决。问题是我们可能必须解决大量空虚问题以解决遏制问题(例如,如果每个n = m_1 * m_2 * ... * m_k
仅由两个不等式定义,那么Y_i
会以n = 2^k
呈指数增长) ,这可能需要很长时间。
答案 0 :(得分:0)
你真的不希望得到一个简单的答案。假设A
由0 <= 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完全的)。我没有看到任何直接的方法,但我怀疑用于识别冗余约束的一些技术是相关的。