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 - кількість пропозицій. Я впевнений, що ми можемо зробити краще, звідси питання:
Багато алгоритмів локального пошуку перевертають призначення змінної, що максимально збільшує кількість задоволених пропозицій. На практиці, з якими структурами даних ефективно підтримується ця операція?
Це те, що я відчуваю, що підручники часто опускають. Одним із прикладів є навіть відома книга Russell & Norvig .