如何在整数可满足实例的解决方案中确定固定和非固定变量?

时间:2014-06-26 18:28:02

标签: linear-programming integer-programming constraint-satisfaction

我有一个(可满足的)(线性)整数可满足性问题。该问题包含一堆布尔值变量,称为x 1 ... x n ,其中一个约束是sum(x < sub> 1 ... x n )= C.我希望确定哪些变量是固定的,以及所述变量的固定值(如:这些变量中的哪一个在所有可能的解决方案中,一个特定的值(0或1,因为它们再次是布尔值)。

我有一个有效的解决方案,它只是缓慢(温和地说):

  1. 添加x 1 == 0
  2. 的约束
  3. 检查问题是否可解决
  4. 删除步骤1中添加的约束。
  5. 添加x 1 == 1
  6. 的约束
  7. 检查问题是否可解决
  8. 删除在步骤4中添加的约束
  9. 断言2和5中至少有一个成功。
  10. 如果两者都成功,则变量不固定。否则,变量将固定为问题仍可满足的约束条件。
  11. 对于x 2 重复1 ... 8 ... x n
  12. 问题在于它的速度很慢。特别是,它需要解决问题O(n),或者更确切地说是2 * n次。 (我在前面的解决方案中传递了一个热启动求解器,但只是启动解算器几乎所有的时间。)

    有更快的方法吗?特别是需要更少次调用解算器的那个?


    我正在考虑的事情,遗憾的是它不能按原样工作,就是把它变成一个ILP问题并解决它两次,一次是为了最大化和(x 1 ... x n ),其中一个目标是最小化它,并检查哪些变量发生变化。不幸的是,这一般都不起作用。对于(计数器)示例:布尔变量xy,其中x+y=1。即使两个变量都没有修复,最大化和最小化也可以产生相同的效果。

2 个答案:

答案 0 :(得分:1)

您在问题中描述的对于变量的操作通常称为MILP(混合整数线性编程)社区中的探测,不幸的是,理论上没有什么比您能做的更好。但是,在实践中,你可以加快速度。

正如您在自己的回答中所指出的,对于每个变量,您可以跟踪您是否在某些解决方案中将该变量视为False和True,并仅测试您之前未见过的设置。 (请注意,修复x_1时获得的第一个解决方案将为每个变量设置一个seenFalse或seenTrue,将要解决的实例数减少一半。)

你可以做得更多。当您查看特定实例时(例如,当未设置seenFalse_i并将x_i设置为False时),您可以使用随机目标将ILSAT转换为ILP。有一个目标有几个目的

  • 通过在每个实例中使用不同的随机目标,您必须解决,希望您将获得各种各样的解决方案,并且您将能够设置许多看到的...标志。
  • 使用此ILP的最佳解决方案值和ILP的LP松弛,您可以执行降低成本的修复,即,基于基于布尔变量的基础上降低的成本,您可能能够证明他们不能采取任何其他价值,而不是他们目前的价值,因此可能设置更多看到的......旗帜。

答案 1 :(得分:0)

看起来好像我有自己问题的解决方案。这不是理想的,因此我会接受其他答案,但这里有:

  1. 将ILSAT变为ILP。
  2. 对于要检查的每个变量,请将该变量的seenTrueseenFalse设置为False
  3. 设置目标函数以最大化已被视为False但不是True的变量之和,减去已被视为True但未变为的变量之和False
  4. 解决ILP。
  5. 如果自上次迭代以来未知未知的值都没有改变,则中断为8.
  6. 对于解决方案中的每个变量,请将seenTrueseenFalse设置为True,具体取决于变量是True还是False
  7. 转到2
  8. 对于每个变量,如果它只被视为TrueFalse之一,则变量固定为该值。否则(它被认为是两者)它没有修复。
  9. 有效地我正在做的是总是试图最大化设置为尚未设置的值的变量数。