2013-02-08 2 views
0

В настоящее время я изучаю проблему 2SAT для экзамена, и я действительно не понимаю, как проверить, существует ли решение с использованием грубой силы. Я знаю, это кажется немного странным, но я понимаю, как реализовать график импликации немного лучше, но я не слишком уверен, как реализовать стратегию грубой силы.Решение формы 2Sat CNF с использованием грубой силы

Может ли кто-нибудь поделиться некоторым пониманием? Может быть, в псевдокоде или java.

Благодаря

+1

Возможно, вам не хватает оснований 2-SAT? Метод грубой силы просто генерирует все перестановки между true и false для всех ваших переменных, тогда вы проверяете, удовлетворяет ли текущая перестановка набору заданных условий. – mmgp

+0

Извините, Возможно, вопрос был сформулирован плохо. Я понимаю, что метод грубой силы генерирует все перестановки, но я чувствую себя так, как я это делаю, даже для реализации грубой силы, это очень грубо. Я создал 2D-массив, содержащий все возможные комбинации с учетом ввода, а затем проверил решений по строкам. Казалось, что это работает для небольшого числа дизъюнкций, но размер массива быстро выходит из-под контроля, и я получаю исключение кучи. –

+0

Сильно подключенные компоненты достаточно просты для реализации и гораздо более эффективны, и расскажут вам, есть ли решение или нет. В чем проблема? – mmgp

ответ

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).

+0

Я не владею Java, поэтому мой код, вероятно, не соответствует стандартным практикам, пожалуйста, советую или отредактируйте. – didierc

0

Это причина, почему мы не используем грубую силу решения :), они потребляют в гораздо ресурсы. Моим алгоритмом было бы не создание матрицы со всеми возможностями. Но создать одно задание, а затем проверить его немедленно. Затем создайте следующий. Вы можете остановиться, когда найдете первое решение.

+0

На данный момент я просто смотрю, есть ли решение 2SAT или нет. Найти все возможности слишком много: D –

+0

Как я уже говорил, вы можете остановить прогон первого положительного задания. Таким образом вам не нужно выделять пространство для всех назначений, а просто проверять их и останавливать. – dolbi

+0

@dolbi Я не уверен, шутите вы или нет, но это решение так же плохо, как любая грубая сила (независимо от того, пытаются ли они сразу сохранить все перестановки). Генерация одной перестановки за другой не сохраняет какое-либо вычислительное время, она все еще 'O (n!)' В худшем случае. Создание всех перестановок сразу бессмысленно, его даже не следует рассматривать. – mmgp

Смежные вопросы