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 책 입니다.