11. 조합 탐색
11.1 도입
동적 계획법, 분할 정복 등의 디자인 패러다임은 유용하지만, 모든 문제에 적용할 수는 없다
결국 우리는 시작점인 완전 탐색으로 돌아와 다시 시작할 필요성도 있다
완전 탐색은 대개 답을 만드는 과정을 여러 개의 선택으로 나눈 뒤, 재귀 호출을 이용해 각각의 선택지를 채워가는 형태로 구현됨.
- 이때 부분 답과 완성된 답의 집합을 탐색 공간(search space) 라고 한다
완전 탐색은 문제의 규모가 조금이라도 클 경우 사용하기 어려운 단점이 있다.
완전 탐색을 포함해, 이렇게 유한한 크기의 탐색 공간을 뒤지면서 답을 찾아내는 알고리즘을 이 책에서는
조합 탐색(combinatorial search)
라고 한다.조합 탐색은 많은 최적화 방법이 있지만, 모두 기본적으로 최적해가 될 가능성이 없는 답들을 탐색하는 것을 방지하여 탐색할 답의 수를 줄이는 것을 목표로 함
조합 탐색 최적화는 시공간, 입력 형태 등 모두 고려해야 하고, 깊은 식견이 요구됨, 딱히 정답이 없음
조합 탐색 최적화는 크게 두 가지로 분류한다.
- 가지치기(pruning): 탐색 과정에서 최적해로 연결될 가능성이 없는 부분들을 잘라냄
- 지금가지 찾아낸 최적해 보다 부분해가 이미 더 나빠졌다면, 현재 상태를 탐색하지 않고 종료
- 탐색의 순서 바꾸기, 탐색 시작 전에 탐욕법을 이용해 적당히 좋은 답 찾기, 휴리스틱(경험에 의거한 어림짐작) 을 이용한 가지치기
- 완전 탐색의 경우 답을 어떤 순서로 찾던 상관 없지만, 가지치기와 함께 사용할 경우, 더 일찍 탐색이 중단 됨으로 탐색의 효율이 높아짐
- 가지치기(pruning): 탐색 과정에서 최적해로 연결될 가능성이 없는 부분들을 잘라냄
11.2 조합 탐색 기법들
간단한 휴리스틱을 이용한 가지치기
- 조합 탐색에서 방문하는 상태의 수는 탐색의 깊이가 깊어질수록 증가, 따라서 ’이 부분에서는 최적해가 나올 수 없다’ 를 빨리 알아내는 것이 유리하다.
메모이제이션
11.3, 11.4 게임판 덮기 2, BOARDCOVER2, 난이도: 하
- 최적화 문제에서 낙관적인 휴리스틱들은 문제를 과소평가 하는 대신, 과대평가 한다.
- 휴리스틱 함수를 만드는 쉬운 방법은 블록을 통째로 내려놓아야 한다는 제약을 없애서, 블록들을 한 칸씩 쪼개서 놓을 수 있도록 문제를 변형
- 우리가 놓을 수 있는 블록의 수: (남은 빈 칸의 수 / 블록의 크기)
- 이것은 우리가 실제 놓을 수 있는 블록의 수 이상이기에 우리가 얻을 수 있는 답의 상한이 된다.
- 각 경우에 계산된 상한이 현재 찾은 최적해 이하라면 탐색을 수행할 필요 없다. => 가지치기 수행
Reference
- 프로그래밍 대회에서 배우는 알고리즘 문제 해결 전략 (구종만, 인사이트)
- https://www.algospot.com/