将不可满足的约束集转换为可满足的较小约束集

时间:2015-10-20 14:11:47

标签: constraint-programming satisfiability sat

我脑子里有一个项目,我很好奇以前是否做过类似的事情。假设存在一组不同类型的约束,并且这些约束不能一起满足。

C = {c1,c2,c3,...,cn}

(c1和c2和c3 ... cn):不满意

我的目标是将这一组划分为k组(可能k非常小),使得每组约束都可以单独满足。

基本解决方案是使用贪婪的方法。将选择约束作为第一个约束并标记为第一个组。然后,将选择第二个并检查它是否可用第一个约束求解。如果它们是可解的,则第二个约束也将在第一个组中,否则,它将被标记为第二个组。此过程将以此方式继续,直到集合中没有任何约束。另一种方法是将约束划分为2组,并检查这些集合是否可以单独解决。如果没有,继续递归分割。这两种方法的规模都很大,它们将约束集划分为非常小的集合。

我正在寻找一种将约束集划分为k集的有效方法,其中k接近最佳值(最小k值)。这里存在两个挑战:1)可伸缩性问题和2)约束结构事先是未知的。

1 个答案:

答案 0 :(得分:1)

一个可以做你想做的算法可以用最小的不可满足的子集来表达,这些子集经过深入研究。就我所知,这是他们最新的SAT比赛曲目:http://www.cril.univ-artois.fr/SAT11/results/results.php?idev=48

使用此代码,以下伪代码应该执行您想要的操作

def sat_partition(CNF):
    partitions = {}
    while CNF is not empty:
        MUS = compute_mus(CNF)
        Remove one arbitrary element of MUS
        partitions += {MUS}
        CNF -= MUS
    return partitions