我有一个(可满足的)(线性)整数可满足性问题。除其他外,该问题包含一堆布尔值变量,称它们为 x 1 ...x n,其中一个约束是 sum(x 1 ...x n ) = C。我希望确定哪个这些变量中的一些是固定的,并且所述变量的固定值(如:在所有可能的解决方案中,这些变量中的哪些取特定值(0 或 1,因为它们又是布尔值))。
我有一个可行的解决方案,只是很慢(委婉地说):
- 添加 x 1 == 0的约束
- 检查问题是否可以解决
- 删除在步骤 1 中添加的约束。
- 添加 x 1 == 1的约束
- 检查问题是否可以解决
- 移除第 4 步中添加的约束
- 断言至少 2 和 5 之一成功。
- 如果两者都成功,则变量不固定。否则,该变量将固定为问题仍然可以满足的任何约束。
- 对 x 2 ...x n重复 1...8
这样做的问题是它很慢。特别是,它需要解决问题 O(n),或者更确切地说是 2*n 次。(我传递了以前的解决方案来热启动求解器,但只是启动求解器几乎需要所有时间。)
有没有更快的方法?特别是,需要更少调用求解器的次数?
我正在考虑的事情,不幸的是不能按原样工作,是将它变成一个 ILP 问题并解决它两次,一次以最大化 sum(x 1 ...x n) 为目标,一次以最大化 sum(x 1 ...x n ) 为目标最小化相同,并检查哪些变量发生变化。不幸的是,这通常不起作用。对于(反)示例:布尔变量x
和y
,其中x+y=1
。即使两个变量都不是固定的,最大化和最小化也可以产生相同的结果。