되추적(Backtracking)elearning.kocw.net/KOCW/document/2015/myongji/leechungki/... · 2016. 9....

26
되추적(Backtracking) 명지대학교 컴퓨터공학과 충기 교수

Transcript of 되추적(Backtracking)elearning.kocw.net/KOCW/document/2015/myongji/leechungki/... · 2016. 9....

  • 되추적(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

  • 요약

    • 되추적 개념

    • 깊이 우선 검색

    • 상태공간트리

    • 되추적 알고리즘

    • 그래프 색칠하기

    • 해밀토니안 회로 문제