알고리즘/SWExpertAcademy

Advanced05 백트래킹 (1)백트래킹

헤옹스 2018. 2. 15. 14:54

1) 소개

* 8퀸 문제

  : 퀸 8개를 8x8 크기의 체스판 안에서 서로 위협하지 않도록 배치하는 모든 경우의 수를 구하는 문제.

- 퀸은 현재 위치에서 상하좌우의 직선방향, 대각선 방향으로 움직일 수 있음.

- 어떤 두 Queen도 서로를 위협하지 않아야함.

- Queen을 배치한 n개의 위치를 어떻게 찾을 수 있을까? 효율적으로 가능한 모든 경우를 찾는 방법은??


* 백트래킹 기법

  : 해가 아니면 되돌아가서 다시 를 찾아가는 기법.

-> 최적화(optimization) 문제와 결정(decision) 문제 해결 가능.

- 결정 문제 : 문제의 조건을 만족하는 해의 존재 여부를 yes, no로 답하는 문제

ex)  미로찾기 - 미로의 입구에서 출구까지 가는 경로의 존재 유무. 

부분집합의 합(Subset Sum) 문제 - 원소의 합이 조건에 맞는 부분 집합 존재 유무.

n-Qeen, Map coloring 등

- 최적화 문제 : 

ex) 미로찾기 - 출구까지 가는 경로 중 최단 경로를 찾는 문제.

부분집합의 합 문제 : 원소의 개수가 최대인 부분 집합을 찾는 문제.


  : 초기 상태에서 목표 상태로 가는 경로를 탐색하는 기법.

- 여러 선택지(옵션) 중 1가지 선택 -> 선택 후 새로운 선택지 생성 -> 선택을 반복하다 최종 상태에 도달.

   => 올바른 선택들을 계속하면 목표 상태에 도달할 것.


- 당첨 단말 노드 찾기.

: 당첨 노드까지 가기 위한 모든 경로에 대해서 탐색하는 과정.

1. 루트에서 갈 수 있는 노드 선택.

2. 꽝 노드까지 도달 시 최근 선택부터 다시 시작.

3. 더 이상 선택지가 없을 경우 이전 선택지로 돌아가 다른 선택.

4. 루트까지 돌아갔을 때 더 이상 선택지가 없는 경우, 찾는 답이 없음.


- 상태 공간 트리

: 해를 찾기 위한 과정을 트리로 표현한 것.

 - 중간노드 : 최종상태로 가는 중간 상태 표현.

 - 단말노드 : 하나의 후보에 대한 최종 상태.

 - 상태 공간 트리 탐색 => 모든 후보 해 탐색.

*** 트리를 깊이 우선 탐색하는 방법 : 백트래킹 알고리즘 기본 형태.


- 백트래킹과 깊이 우선 탐색과의 차이

: 백트래킹은 경로가 해결책으로 이어지지 않을것 같으면 더 이상 그 경로를 따라가지 않음 => 시도 횟구를 줄임.

+깊이 우선 탐색

- 최종상태로 가는 중간 상태 표현.(모든 경로를 추적함.)

- 경우의 수가 너무 많으면(N! 가지 경우의 수를 가진 문제) 처리 불가능.

+백트래킹

- 가지치기로 불필요한 경로 조기 차단.

- 일반적으로 경우의 수가 줄어 처리 가능.

   but, 최악의 경우, 지수 함수 시간을 요하여 처리 불가능.



* 8퀸 문제

- 모든 후보 해의 수 : 64칸에서 8칸을 선택하는 경우의 수.    64 C 8 = 44억개.

- 실제 해의 수 : 92개.

=> 44억 개가 넘는 후보해들에서 실제 해 92개를 최대한 효율적으로 찾아내는 것이 관건!


* 4퀸 문제

- 퀸들은 같은 행에 존재할 수 없음.

- 각 퀸에 대해 행의 위치를 미리 결정하고, 열의 위치에 대해서만 고려.

- 각 퀸의 위치 결정을 위해 4개의 선택지가 존재함.

- 모든 후보 해의 개수 = 4*4*4*4 = 256 개 = 단말 노드의 개수

- 후보해 : 루트노드 ~ 단말노드의 경로.

- 깊이 우선 탐색을 하여 모든 단말 노드를 방문하면서 후보해들 중 해를 찾음.



- 해답이 될 가능성이 전혀 없는 노드의 후손노드들도 모두 검색해야 하므로 비효율적.

- 해답으로 가는 길이 아니라면(조건을 만족하지 않을 경우) 포기하고 다른 경로 탐색.



방문하는 노드에서 해답 가능성이 없는 경우 탐색 중지

=> 깊이 우선 탐색에 비해 방문하는 노드 수 줄어듦.