되추적(backtracking)elearning.kocw.net/kocw/document/2015/myongji/leechungki/... · 2016. 9....
TRANSCRIPT
-
되추적(Backtracking)
명지대학교
컴퓨터공학과
이 충기 교수
-
지난 강의 내용
• 동적 계획 알고리즘의 개념, 전략, 설계 과정
• 모든 쌍 최단 경로 찾기
• 행렬 곱셈
• 배낭 채우기
-
이번 주 강의 내용
• 되추적 개념
• 깊이 우선 검색
• 상태공간트리
• 되추적 알고리즘
• 그래프 색칠하기
• 해밀토니안 회로 문제
-
되추적 (Backtracking)
• 미로에서 출구 찾기 - 미로에서 출구를 찾다 보면 막다른 곳에 도달할 수 있다.
- 이 때 마지막 분기점으로 되돌아 가서 다른 길로 갈 수 있다.
- 미로 찾기에서 각 분기점에 막다른 곳으로 가는 길에 대한 안내 표지판이 있다면 훨씬 쉽게 미로를 찾을 수 있을 것이다.
• 되추적은 어떤 집합에서 어떤 기준(criterion)을 만족하면서 그 집합에 속한 대상의 순서(sequence)를 선택하는 문제를 푸는 데 사용한다.
• 되추적은 트리의 수정된 깊이 우선 검색(depth-first search)이다.
-
미로찾기
-
깊이 우선 검색
• 한 그래프의 종점들을 유용한 순서로 방문하는 방법
void DFSEARCH(v) { 종점 v 를 “방문함”으로 표시하라. v 에 인접한 모든 종점 w 에 대해 다음을 수행하라: w 가 “방문 안 함”으로 표시되어 있다면 DFSEARCH(w)
} 주: 처음에 모든 종점들은 “방문 안 함”으로 표시된다.
-
예: 깊이 우선 검색
그래프 G
1
2
3
4
5
8
6
7
-
예: 깊이 우선 신장 트리 (Depth-first Spanning Tree)
1번에서 시작한다.
1
2
3
4
5
8
6
7
트리 연결선들 (tree edges): 검색 중에 사용됨)
뒤 연결선들 (back edges)
-
깊이 우선 검색 (계속)
• 그래프가 연결되어 있다면 모든 종점들이 방문될 것이다. 트리 연결선들은 깊이 우선 신장 트리를 형성한다.
• 그래프가 연결되어 있지 않다면 트리 연결선들은 깊이 우선 신장 숲(depth-first spanning forest)를 형성한다.
-
깊이 우선 검색
보조정리: (v, w)가 뒤 연결선이라면 신장 트리에서 v 가 w의 선조이거나 아니면 w 가 v 의 선조이다.
증명: v 가 깊이 우선 검색에서 w 전에 방문되었다
고 가정하자(w 는 v 가 “방문함”으로 표시되기 전
에 “방문 안 함”으로 표시되어 있다).
v 로부터 도달할 수 있는 모든 “방문 안 함” 종점
들이 신장 트리에서 v 의 자손들이 될 것이기 때
문에 w 는 v 의 자손이 될 것이다.
-
깊이 우선 검색 알고리즘 데이터 구조 G(V, E ) : 주어진 그래프 (V 는 종점들의 집합, E 는 연결선들의 집합) num(x) : 종점 x 가 방문된 순서 T : 트리 연결선들의 집합 B : 뒤 연결선들의 집합 i : 방문 순서
for all x ∈ V { num(x) = 0; } i = 0 ; T = ∮ ; B = ∮ ; //공집합 for all x ∈ V { if (num(x) == 0) DFS(x, 0); }
void DFS (v, u) { // u는 v 의 부모 i = i + 1 ; num(v) = i ; for w ∈ Adj(v) { if (num(w) == 0) { // (v, w)는 트리 연결선이다 T = T ∪ {(v, w)}; DFS(w, v) } else { if (num(w) < num(v) and w ≠ u) // (v, w)는 뒤 연결선이다 B = B ∪ {(v, w)}; } }
분석: O( )
EV
-
상태 공간 트리(State Space Tree)
• 미로 찾기에서 입구에서 출구까지 가는 경로를 찾기 위해서 선택할 수 있는 모든 경로를 트리로 나타낼 수 있다. 막다른 곳이나 출구가 종단 노드(leaf node)가 된다. 이 트리가 상태 공간 트리이다.
• 상태 공간 트리에서 입구에서 종단 노드까지의 경로가 해답 후보가 된다. 해답 후보 중에 해답이 있다.
• 상태 공간 트리를 깊이 우선 검색을 하여 해답 후보중에서 해답을 찾을 수 있다.
• 그러나 이 방법을 사용하면 해답이 될 가능성이 전혀 없는 노드의 후손 노드들도 모두 검색해야 하므로 비효율적이다.
-
되추적 기술
• 노드의 유망성 - 전혀 해답이 나올 가능성이 없는 노드는 유망하지
않다(non-promising)고 한다.
- 그렇지 않으면 유망하다(promising)고 한다.
• 되추적이란?
어떤 노드의 유망성을 점검한 후, 유망하지 않다고 판정이 되면 그 노드의 부모 노드(parent)로 돌아가서(“backtrack”) 다음 자식 노드(child)에 대한 검색을 계속 하는 것이다.
-
되추적 알고리즘의 개념
• 되추적 알고리즘은 상태공간트리에서 깊이우선검색을 실시하면서
–유망하지 않은 노드들은 가지 쳐서 검색을 계속하지 않는다.
–유망한 노드에 대해서만 그 노드의 자식 노드를 검색한다.
-
되추적 알고리즘
1. 상태 공간 트리의 깊이 우선 검색을 실시한다.
2. 각 노드가 유망한지를 점검한다.
3. 만약 그 노드가 유망하면 그 노드의 자식 노드들에 대한 검색을 계속한다. 그렇지 않으면 그 노드의 부모 노드로 돌아가서 검색을 계속한다.
void checknode (node v)
{
if (promising(v ))
if (there is a solution at v )
write the solution ;
else
for (each child u of v ) checknode(u) ;
}
-
그래프 색칠하기(Graph Coloring)
m-색칠하기 문제 비방향 그래프에서 서로 인접한 종점이 같은 색을 갖지 않도록 최대 m개의 다른 색으로 칠하는 모든 방법을 찾아라.
예 :
위 그래프에서 2-색칠하기 문제에 대한 해답은 없다. 왜냐하면 v₁을 첫 번째 색으로 칠하면 v₂ 와 v₄는 두 번째 색으로 칠할 수 있지만 v₃는 v₁, v₂, v₄와 인접하므로 다른 색으로 칠해야 하지 만 더 이상 칠할 색이 없기 때문이다.
3-색칠하기 문제에 대한 해답 중 하나는 다음과 같다. 정점 색 v₁ R v₂ Y v₃ G
v₄ Y
이 문제에 대해서 총 6개의 해답이 있다. 모든 해답은 v₂와 v₄가 서로 인접하지 않으므로 같은 색을 칠하고 v₁과 v₃는 각각 남은 2가지 색 중 하나로 칠하면 된다.
1v
3v4v
2v
-
그래프 색칠하기
1v
3v4v
2v
5v
2v
1v
3v4v
2v
5v
2v
-
지도와 평면 그래프
지도에서 각 지역을 그래프의 종점으로 하고, 한 지역이 어떤 다른 지역과 인접해 있으면 그 지역들을 나타내는 종점들 사이에 연결선을 그으면, 모든 지도는 그에 상응하는 평면 그래프로 표시할 수 있다.
1v
3v4v
2v
1v2v
3v
4v
5v
5v
-
색칠하기 문제에 대응되는 상태공간트리
위 그래프를 3개의 색으로 색칠하기 문제에 대한 가지치기를 한 상태 공간 트리
1v
3v4v
2v
시작
1
1
1
1
2 3
2 3
2 3
2 3 1v
2v
3v
4v
x
x x
x x
-
M-색칠하기 되추적 알고리즘 입력 n : 그래프 내의 정점들의 수 m : 칠할 수 있는 색들의 수 W : 비방향 그래프를 나타내는 인접 배열(i 번째 정점과 j번째 정점을 잇는 연결선이 있으면 W[i][ j] = true 이고 그렇지 않으면 false이다)
void m-coloring (int i) { int color ; if (promising(i)) if (i == n) “vcolor [1‥n]을 출력한다” else //다음 정점에 모든 색을 시도해 본다 for (color = 1 ; color
-
분석: M-색칠하기 되추적 알고리즘
분석 : 상태 공간 트리상의 노드들의 총 수는
1
1.....1
12
m
mmmm
nn
-
해밀토니안 회로 문제
• 해밀토니안 회로 (Hamiltonian Circuit)
연결된 비방향성 그래프에서 어떤 한 종점에서 출발하여 그래프 상의 각 종점을 한번씩만 경유하여 다시 출발한 종점으로 돌아오는 경로
예:
해밀토니안 회로 : → → → → → → → →
해밀토니안 회로 문제
연결된 비방향성 그래프에서 해밀토니안 회로를 찾아라
1v 2v 3v 4v
5v8v
7v 6v
1v 2v 3v4v5v6v7v8v 1v
1v 2v
4v5v
3v
해밀토니안 회로가 없다
-
해밀토니안 회로 문제
• 해밀토니안 회로 문제에 대한 상태 공간 트리
- 시작 종점을 트리의 수준(level) 0에 놓는다. - 수준 1에 시작 종점이 아닌 종점들을 놓는다.
- 다른 수준에 같은 방식으로 종점들을 놓는다.
- 마지막으로 수준 (n - 1)에 시작 종점이 아닌 종점들을 놓는다.
• 되추적 방법을 적용하기 위해서 다음 사항을 고려해야 한다:
- 경로 상의 i번째 종점은 그 경로상의 (i - 1)번째 종점과 반드시 인접해야 한다.
- (n - 1)번째 종점은 반드시 시작 종점과 인접해야 한다.
- i 번째 종점은 첫 (i - 1)개의 종점들의 하나가 될 수 없다.
-
해밀토니안 회로 되추적 알고리즘 입력
n : 양의 정수 W : 비방향 그래프를 나타내는 인접배열(정점 i와 정점 j를 잇는 연결선이 있으면 W[i][j] = true이고 그렇지 않으면 false이다) 출력: 각 경로의 출력은 인덱스가 0부터 n – 1 까지인 인덱스의 배열 vindex 이다. vindex[i]는 경로상에서 i번째 정점의 인덱스임 void hamiltonian(int i) { int j; if (promising(i)) if (i == n - 1) “vindex[0‥n-1]을 출력한다” else //모든 정점의 다음 정점을 시도해 본다 for (j = 2; j 0 && ! W[vindex[i-1]][vindex[i]] ) switch = false; // 인접해야 하고, i번째 정점은 else { switch = true; // (i – 1)번째 정점과 인접해야 한다. j = 1; while (j < i && switch) { // 정점이 이미 선택되었는지를 검사한다. if (vindex[i] == vindex[j] ) switch = false ; j++ ; } } return switch ; }
-
분석: 해밀토니안 회로 문제
• 상태공간트리 상의 노드들의 총 수
2
1)1()1()1()1(1 )1(2
n
nnnn
nn
-
요약
• 되추적 개념
• 깊이 우선 검색
• 상태공간트리
• 되추적 알고리즘
• 그래프 색칠하기
• 해밀토니안 회로 문제