Переменные в формуле могут быть закодированы как биты в интегральном значении. Метод грубой силы затем сводится к диапазону по всем возможным значениям, которые может иметь интегральный «контейнер».
Другими словами, у вас есть массив целых чисел, который представляет все переменные формулы, и вы увеличиваете целые числа с переносом, и на каждом шаге проверяете решение, которое оно представляет против вашей формулы. Вы останавливаетесь, когда решение соответствует.
Вот мертвое простая реализация такой переменной емкости:
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).
Возможно, вам не хватает оснований 2-SAT? Метод грубой силы просто генерирует все перестановки между true и false для всех ваших переменных, тогда вы проверяете, удовлетворяет ли текущая перестановка набору заданных условий. – mmgp
Извините, Возможно, вопрос был сформулирован плохо. Я понимаю, что метод грубой силы генерирует все перестановки, но я чувствую себя так, как я это делаю, даже для реализации грубой силы, это очень грубо. Я создал 2D-массив, содержащий все возможные комбинации с учетом ввода, а затем проверил решений по строкам. Казалось, что это работает для небольшого числа дизъюнкций, но размер массива быстро выходит из-под контроля, и я получаю исключение кучи. –
Сильно подключенные компоненты достаточно просты для реализации и гораздо более эффективны, и расскажут вам, есть ли решение или нет. В чем проблема? – mmgp