Как получить значения 2-Sat - PullRequest
4 голосов
/ 22 февраля 2010

Всякий раз, когда я ищу алгоритм для 2-Sat, я возвращаюсь алгоритм для формы решения проблемы: существует ли допустимый набор значений, который удовлетворяет всем пунктам. Однако это не позволяет мне легко найти набор удовлетворяющих логических значений.

Как мне эффективно найти допустимый набор значений, который будет удовлетворять экземпляру 2-Sat?

Я работаю в c ++ с библиотекой boost и был бы признателен за код, который можно легко интегрировать.

Заранее спасибо

Ответы [ 2 ]

1 голос
/ 22 февраля 2010

Если у вас есть алгоритм принятия решения для определения наличия действительного назначения для 2-SAT, вы можете использовать его для фактического определения фактического назначения.

Первый запуск алгоритма принятия решения 2-SAT для всего выражения. Предположим, он говорит, что есть правильное назначение.

Теперь, если x_1 является литералом, присвойте x_1 значение 0. Теперь вычислите 2-SAT для полученного выражения (из-за этого вам нужно будет назначить некоторые другие литералы, например, если появится x_1 ИЛИ x_3, вам также необходимо установить x_3 на 1).

Если полученное выражение является 2-удовлетворяемым, то вы можете принять x_1 равным 0, в противном случае - x_1 к 1.

Теперь вы можете узнать это о каждом литерале.

Для более эффективного алгоритма я бы посоветовал вам попробовать подход с использованием графа импликации.

Вы можете найти больше информации здесь: http://en.wikipedia.org/wiki/2-satisfiability

Соответствующая часть:

экземпляр 2-выполнимости разрешимо тогда и только тогда, когда каждая переменная экземпляра принадлежит другому сильно связанный компонент Граф импликации, чем отрицание та же переменная. Так как сильно подключенные компоненты можно найти в линейное время по алгоритму на основе поиск в глубину, тот же линейный срок также относится к 2-выполнимости.

Литералы в каждом сильно связанном компоненте либо все ноль, либо все 1.

0 голосов
/ 22 февраля 2010

Существует по крайней мере один алгоритм, который перечисляет все решения 2-х задач, по Томасу Федеру: http://www.springerlink.com/content/j582276p06276l12/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...