Алгоритм GSAT здебільшого прямий вперед: ви отримуєте формулу в кон'юнктивному звичайному вигляді і перегортаєте буквальні пункти до тих пір, поки не знайдете рішення, яке задовольняє формулі, або ви не досягнете граничного значення max_tries / max_flips і не знайдете рішення.
Я реалізую такий алгоритм:
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 <- the variable whose flip yield the most important raise in the number of satisfied clauses;
Чи не максимальна кількість задоволених пропозицій, що ми шукаємо? Мені здається, що ми намагаємось використати рішення чи наближення до нього, щоб знайти рішення.
Я думав про деякі способи цього зробити, але було б добре почути інші точки зору (припущення полягає в тому, що як тільки змінна буде перевернута, як тільки вона буде обрана.):
- Створіть простір стану з усіма можливими переворотами та пошукайте простір у прямому значенні, що призводить до найкращого наближення до стану цілі.
- Випадково виберіть змінну, яку я переверну, починаючи з більш поширених літералів.
- Виберіть випадковий буквал.