我有一个(可满足的)(线性)整数可满足性问题。该问题包含一堆布尔值变量,称为x 1 ... x n ,其中一个约束是sum(x < sub> 1 ... x n )= C.我希望确定哪些变量是固定的,以及所述变量的固定值(如:这些变量中的哪一个在所有可能的解决方案中,一个特定的值(0或1,因为它们再次是布尔值)。
我有一个有效的解决方案,它只是缓慢(温和地说):
问题在于它的速度很慢。特别是,它需要解决问题O(n),或者更确切地说是2 * n次。 (我在前面的解决方案中传递了一个热启动求解器,但只是启动解算器几乎所有的时间。)
有更快的方法吗?特别是需要更少次调用解算器的那个?
我正在考虑的事情,遗憾的是它不能按原样工作,就是把它变成一个ILP问题并解决它两次,一次是为了最大化和(x 1 ... x n ),其中一个目标是最小化它,并检查哪些变量发生变化。不幸的是,这一般都不起作用。对于(计数器)示例:布尔变量x
和y
,其中x+y=1
。即使两个变量都没有修复,最大化和最小化也可以产生相同的效果。
答案 0 :(得分:1)
您在问题中描述的对于变量的操作通常称为MILP(混合整数线性编程)社区中的探测,不幸的是,理论上没有什么比您能做的更好。但是,在实践中,你可以加快速度。
正如您在自己的回答中所指出的,对于每个变量,您可以跟踪您是否在某些解决方案中将该变量视为False和True,并仅测试您之前未见过的设置。 (请注意,修复x_1时获得的第一个解决方案将为每个变量设置一个seenFalse或seenTrue,将要解决的实例数减少一半。)
你可以做得更多。当您查看特定实例时(例如,当未设置seenFalse_i并将x_i设置为False时),您可以使用随机目标将ILSAT转换为ILP。有一个目标有几个目的
答案 1 :(得分:0)
看起来好像我有自己问题的解决方案。这不是理想的,因此我会接受其他答案,但这里有:
seenTrue
和seenFalse
设置为False
False
但不是True
的变量之和,减去已被视为True
但未变为的变量之和False
。seenTrue
或seenFalse
设置为True
,具体取决于变量是True
还是False
。True
或False
之一,则变量固定为该值。否则(它被认为是两者)它没有修复。有效地我正在做的是总是试图最大化设置为尚未设置的值的变量数。