【问题标题】:Checking containment using integer programming使用整数规划检查遏制
【发布时间】:2015-08-11 16:51:39
【问题描述】:

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

问题:有没有一种好方法,使用整数规划(或其他方法?)来检查一个区域是否包含在有限多个其他区域的联合中?

我知道一种检查收容的方法,我将在下面描述,但我希望有人能够提供一些改进,因为它不是太有效。


这是我知道的检查收容措施的方法。首先,整数编程库可以直接检查区域是否为空:在整数编程术语中(据我理解),区域的空性对应于模型的不可行性。我使用 gurobi 库编写了一些代码来检查空虚,它在实践中似乎对我关心的那种区域效果很好。

现在假设我们要检查一个区域 X 是否包含在另一个区域 Y 中(问题的一个特例)。令ZXY 的补集的交集。那么X 包含在Y 中当且仅当Z 为空。现在,Z 本身并不是我所理解的区域,而是区域Z_1, ..., Z_n 的联合,其中n 是用于定义Y 的不等式数量。我们可以通过检查每个Z_1, ..., Z_n 是否为空来检查Z 是否为空,我们可以按照上面的说明进行操作。

一般情况可以用完全相同的方式处理:如果Y 是区域Y_1, ..., Y_k 的有限联合,那么Z 仍然是区域Z_1, ..., Z_n 的有限联合,因此我们只需检查每个区域Z_i 为空。如果Y_im_i 不等式定义,那么n = m_1 * m_2 * ... * m_k

总而言之,我们可以将包含问题简化为空性问题,图书馆可以直接解决。问题是我们可能必须解决大量的空性问题来解决遏制(例如,如果每个Y_i 仅由两个不等式定义,那么n = 2^kk 呈指数增长),因此这可能需要很多时间。

【问题讨论】:

  • 我不确定我是否遵循您的方法如何推广到许多地区。特别是,属于区域的并集并不意味着与每个区域的补集的交集是空的。示例:R1 = {(0,0), (0,2), (1,0), (2,2)}; R2 = {(1,0), (1,1), (3,1), (3,0)}。区域 R = R1 union R2 \ {(0,0), (0, 1)} 确实包含在两个区域的并集中,但它与 R1 和 R2 的补集的交集不为空。

标签: gurobi integer-programming


【解决方案1】:

你真的不能期待一个简单的答案。假设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 完全的)。我没有看到任何直接的方法可以做到这一点,尽管我怀疑用于识别冗余约束的一些技术是相关的。

【讨论】:

  • 感谢您的回复。我应该说,在我的情况下,d(=变量数)相当小(大约 15),但 k(=联合中的区域数)很大(大约 100)。因此,您提到的情况 (0
  • 我的办公室里有一个名为 Optimization and Computational Logic(由 McAloon 和 Tretkoff 编写)的小部分,其中有一小部分是关于他们谈论的称为 Disjunctive Programming 的东西关于多面体区域的联合。谷歌搜索该术语有很多点击量,其中一些看起来很有希望,但不是以非常直接的方式。有趣的是,分支定界算法本身可以被认为是一种解决方法,它通过将原始可行区域表示为较小可行区域的联合来工作,因此也许某种分支定界可以起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多