Підтримка структур даних для локального пошуку SAT


20

WalkSAT і GSAT - це відомі та прості алгоритми локального пошуку для вирішення булевої задачі про задоволення. Псевдокод для алгоритму GSAT скопійований із запитання " Реалізація алгоритму GSAT" - Як вибрати, яку буквальну частину слід перевернути? і представлені нижче.

procedure GSAT(A,Max_Tries,Max_Flips)
  A: is a CNF formula
  for i:=1 to Max_Tries do
    S <- instantiation of variables
    for j:=1 to Max_Iter do
      if A satisfiable by S then
        return S
      endif
      V <- the variable whose flip yield the most important raise in the number of satisfied clauses;
      S <- S with V flipped;
    endfor
  endfor
  return the best instantiation found
end GSAT

Тут ми гортаємо змінну, яка максимально збільшує кількість задоволених пропозицій. Як це робиться ефективно? Наївний метод полягає у перегортанні кожної змінної та за кожен крок через усі пропозиції та підрахунок, скільки з них буде задоволено. Навіть якщо застереження можна було б запитати на відповідність в постійному часі, наївний метод все-таки буде працювати в час, де V - кількість змінних, а C - кількість пропозицій. Я впевнений, що ми можемо зробити краще, звідси питання:О(VС)VС

Багато алгоритмів локального пошуку перевертають призначення змінної, що максимально збільшує кількість задоволених пропозицій. На практиці, з якими структурами даних ефективно підтримується ця операція?

Це те, що я відчуваю, що підручники часто опускають. Одним із прикладів є навіть відома книга Russell & Norvig .


Що ж, ці хлопці будують це обладнання. Мабуть , імовірнісний та евристичний підходи більш популярні; це підказало б, що ви дійсно не можете швидко вибрати «найкращу» (зрештою, тільки жадібну) змінну, або що цей вибір взагалі не є корисним.
Рафаель

@Raphael Можливо, ти маєш рацію, що не можеш її вибрати дуже швидко, але я б не наважувався сказати: "вибір взагалі не є добрим". Можливо, я неправильно зрозумів вашу думку, але я впевнений, що вибір "правильної" змінної має величезний вплив. Спасибі, я копаю трохи глибше. Я думаю, що один з авторів слайдів, які ви пов’язали (Hoos), має книгу на цю тему.
Джухо

"Правильний" був би оптимальним, але чи є підстави вважати, що той, який максимізує зараз, є правильним? Адже проблема не вирішується (канонічною) жадібністю.
Рафаель

Відповіді:


9

Необхідна структура даних - це список подій , перелік кожної змінної, що містить пропозиції, в яких відбувається змінна. Ці списки складаються один раз, коли CNF вперше читається. Вони використовуються на кроках 3 та 5 нижче, щоб уникнути сканування всієї формули CNF для підрахунку задоволених пунктів.

Кращим алгоритмом, ніж гортання кожної змінної, є:

  1. Складіть список лише змінних, які зустрічаються в незадоволених застереженнях.
  2. х
  3. х
  4. х
  5. х
  6. х
  7. х
  8. Повторіть кроки 2-7 для решти змінних, знайдених на кроці 1.
  9. Переверніть змінну з найбільшою кількістю, записаною на кроці 7.

Посилання на структуру даних (часто також відомий як список суміжності) є, наприклад, Lynce та Marques-Silva, Efficient Structures Data for Backtracking SAT solvers, 2004.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.