我目前正在研究2SAT问题的考试,我真的不明白如何使用强力检查是否存在解决方案。我知道这看起来有点奇怪,但我理解如何更好地实现蕴涵图,但我不太清楚如何实施蛮力策略。
有人可以分享一些见解吗?也许用伪代码或java。
由于
答案 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)
这就是我们不使用强力解决方案的原因:),它们消耗了大量资源。 我的算法不是创建一个具有所有可能性的矩阵。但要创建一个任务,然后立即进行测试。然后创建下一个。当您找到第一个解决方案时,您可以暂停。