使用强力解决2Sat CNF形式

时间:2013-02-08 18:40:05

标签: java algorithm 2-satisfiability

我目前正在研究2SAT问题的考试,我真的不明白如何使用强力检查是否存在解决方案。我知道这看起来有点奇怪,但我理解如何更好地实现蕴涵图,但我不太清楚如何实施蛮力策略。

有人可以分享一些见解吗?也许用伪代码或java。

由于

2 个答案:

答案 0 :(得分:2)

公式中的变量可以编码为整数值中的位。然后,蛮力方法归结为整数“容器”可能采用的所有可能值的范围。

换句话说,你有一个整数数组,它代表你所有公式的变量,并用进位递增整数,并在每一步检查它代表你公式的解。当解决方案匹配时停止。

以下是这种变量容器的简单实现:

class OverflowException extends RuntimeException {}

public class Variables {
    int[] data;
    int size;

    public Variables(int size_){
        size = size_;
        data = new int[1 + size/32];
    }
    public boolean get(int i){
         return (data[i/32] & (1 << i%32)) != 0;
    }
    public void set(int i, boolean v){
        if (v)
            data[i/32] |= (1 << i%32);
        else
            data[i/32] &= ~(1 << i%32);
    }
    public void increment(){
         int i;
         for (i=0; i < size/32; i++){
             data[i]++;
             if (data[i] != 0) return;
         }
         if (size%32 != 0){
             data[i]++;
             if ((data[i] & ~((1 << (size%32)) - 1)) != 0)
                 throw new OverflowException();
        }
    }
}

(警告经纪人:代码未经测试)。

变量数组也可以更简单地表示为boolean容器,但由于增量步骤,您可能会失去一点性能(尽管可以通过使用gray code来减轻这种情况对于递增操作的纯二进制编码,但是这个implementation的复杂性似乎表明相反,如果你选择一个复杂的解决方案,它也可能是一个很好的sat2求解器。)

答案 1 :(得分:0)

这就是我们不使用强力解决方案的原因:),它们消耗了大量资源。 我的算法不是创建一个具有所有可能性的矩阵。但要创建一个任务,然后立即进行测试。然后创建下一个。当您找到第一个解决方案时,您可以暂停。