1 / 49

차근차근 이해하는 알고리즘

제 5 장 백트래킹. 차근차근 이해하는 알고리즘. 목차. 백트래킹의 기초 n - 여왕 해밀턴 사이클 k - 그래프 채색 부분집합의 합 0-1 배낭 문제 백트래킹을 마치며. 백트래킹의 기초 (1/6). 백트래킹 : 되돌아감 “ back ”과 “ tracking ”의 합성어 : “되돌아가다” 혹은 “되짚어 가다” 퇴각검색 혹은 되추적 기법 되돌아가거나 되짚어 가려면 당연히 이미 지나온 길이 반드시 존재

jwalker
Télécharger la présentation

차근차근 이해하는 알고리즘

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 제5장 백트래킹 차근차근 이해하는알고리즘

  2. 목차 백트래킹의 기초 n-여왕 해밀턴 사이클 k-그래프채색 부분집합의 합 0-1배낭 문제 백트래킹을 마치며 차근차근 이해하는 알고리즘

  3. 백트래킹의 기초(1/6) • 백트래킹: 되돌아감 • “back”과 “tracking”의 합성어: “되돌아가다” 혹은 “되짚어 가다” • 퇴각검색 혹은 되추적기법 • 되돌아가거나 되짚어 가려면 당연히 이미 지나온 길이 반드시 존재 • 왜 되돌아가는가?: 더 이상 이 길로 갈 수(필요)가 없거나 이미 다 가본 길 • 되돌아가는 목적:새로운 길을 찾기 위함이다. • 예1) 미로(maze) 찾기 • 출구를 찾을 때까지 다음을 반복 ➊ 분기점이 나올 때까지 길을 따라 간다. 이 때 지나가는 길은 표시 ➋ 분기점을 만나면 한 길을 선택하여 역시 표시하면서 계속 진행 ➌ 길을 따라 가다가 막혀 있으면 직전 분기점까지 되돌아감 ➍ 시도하지 않은 다른 길을 선택하여 ➊부터 다시 시작 ➎ 모든 길을 시도하였다면 직전 분기점까지 되돌아간 후 ➍부터시작 • 위의 단계 ➌과 ➎에서 되돌아감 • 백트래킹은 어떤 일을 한 이후에 그 일을 되물리는 것까지 포함 차근차근 이해하는 알고리즘

  4. 백트래킹의 기초(2/6) voidDFS(vertexv) { vertexadjacent; visited[v] =true; do_something(v); foreach(v에인접한정점adjacent) if(!visited[adjacent]) DFS(adjcent); } 1 2 3 4 5 6 7 • 예2) 깊이 우선 탐색(DFS) : 시작정점은 1로 가정 차근차근 이해하는 알고리즘

  5. 백트래킹의 기초(3/6) • 상태 (state) • 문제를 해결해나가는 과정에서 있을 수 있는 어떤 순간의 모습 • 예)0-1배낭 문제: 어떤 한 순간의 배낭 모습 (어떤 물건들이 들어 있고 총 무게와 이익은 얼마인가) • 예)오목 게임: 어떤 한 순간의 바둑판 모습 • 시작 상태에서 출발 • 예) 0-1 배낭 문제: 빈 배낭 • 예) 오목 게임:빈 바둑판 • 시작 상태로부터 주어진 규칙에 따라 상태를 계속적으로 변화시켜 나감 • 예) 0-1배낭 문제: 해당 물건을 집어넣거나 집어넣지 않거나를결정할 때마다 • 예) 오목 게임:번갈아 가며 바둑돌을 둘 때마다 • 최종 상태에 도달하면 종료 • 더 이상 진행할 수 없는 상태(백트래킹이 가능) • 예) 0-1 배낭 문제: 모든 물건에 대한 결정이 끝난 상태 • 예) 오목 게임: 누군가 승리한 상태 • 원하는 해답인 최종 상태도 있을 수 있고 해답이 아닌 최종 상태도 가능 • 예) 0-1배낭 문제:이익이 최대인 최종 상태와 그보다는 작은 최종 상태 • 예)오목 게임: 우리편이 이긴 최종 상태와 상대방이 이긴 최종 상태  최종 상태는 후보해(candidate solution)라 부르기도 함 차근차근 이해하는 알고리즘

  6. 백트래킹의 기초(4/6) • 상태 공간 트리 • 상태 공간(statespace)또는 문제 공간(problemspace): 가능한 모든 상태 • 각 상태는이전 상태로부터 변한 것이고 이후 상태로 변화해나감 • 시작 상태에서 출발하여 전이(transition)가 가능한 이후 상태를 자식 노드로 연결하고 이 과정을 최종 상태에 이르기까지 반복 상태 공간 트리 • 노드: 상태, 부모 노드:이전 상태,자식 노드:이후 상태 • 예) 0-1배낭 문제의 상태 공간 트리 • 유망하지 않은 노드(nonpromisingnode): 자식의 상태를 확인할 필요가 없음 • 유망한 노드(promising node): 해답을 얻기 위해 자식 노드로 진행할 필요가 있음 • 유망하지 않은 노드를 가능한 많이 걸러내는 전략이 매우 중요 차근차근 이해하는 알고리즘

  7. 백트래킹의 기초(5/6) 1 2 3 4 5 voidDFS_tree(nodevertex) { nodechild; do_something; foreach(자식노드child) DFS_tree(child); } 알고리즘 5.2 상태 공간 트리의DFS • 백트래킹 알고리즘의 구조 • 상태 공간 트리의 탐색: DFS • 상태 변화를 추적하기 용이한 기본 탐색 알고리즘인 DFS를 사용 • 그래프에 대한 DFS를수정하면 트리에대한 DFS를 구할 수 있음 • 이진 트리의 전위 순회를 트리의 전위 순회로 일반화 • 모든 자식 노드는 이전에 방문하지 않은 노드이고자식 노드만을 대상으로 DFS가 이루어지기 때문에 노드를 방문했다는 사실을 기억하거나 확인할 필요가 없음 • 방문하는 자식의 순서는 트리의왼쪽에서 오른쪽으로 탐색하는 것으로 가정 • 유망한 노드와 유망하지 않은 노드를 구분하지 않고 방문 차근차근 이해하는 알고리즘

  8. 백트래킹의 기초(6/6) 알고리즘 5.3 백트래킹 1 2 3 4 5 6 voidbacktracking(nodev) { nodechild; if(promising(v)) //pruning if(is_solution(v)) output_solution(v); elseforeach(v의자식child) backtracking(child); } • 상태 공간 트리의탐색(개선 1): 유망하지 않은 노드를걸러내기(pruning) • 상태 공간 트리의탐색(개선 2): 유망한 노드에 대해서만 순환호출 • 주의 1) 메모리 낭비를 줄이기 위해 순환 함수를 호출할 때 값이 변하는 변수만 파라미터로 넘기고 순환호출에서 변하지 않는 변수는 전역 변수로 선언 2) 백트래킹 알고리즘에서는 실제로 상태 공간 트리를 만드는 것이 아니라 탐색하는 노드의 상태를 배열에 기록하고 추적 • 상태 공간 트리의 탐색 과정을 배열을 이용하여 시뮬레이션 • 유망한 노드에대해서만 배열에 기록하는 작업이 필요 차근차근 이해하는 알고리즘

  9. n-여왕(1/9) • n-여왕 문제 • n×n체스판에서n개의 여왕을 서로 공격할 수 없도록 배치하는 문제 • 어떤 두 여왕도 같은 행, 같은 열, 같은 대각선상에 위치할 수 없음 • n이 4이상일 때만 해가 존재 • [그림 5.3]은 8-여왕 문제의 해답 중 하나 차근차근 이해하는 알고리즘

  10. n-여왕(2/9) • 상태 공간 트리 • 같은 줄에 두 여왕을 배치할 수 없음  첫 번째 줄부터 한 줄에 하나씩 여왕을 배치 • i번째 줄에 여왕을 배치할 때는,i-1번째 줄까지 배치 한 여왕을 공격하지 않도록 • 상태 공간 트리의 각 상태가 여왕의 배치 상황이라면 • 첫 번째 여왕의 배치 • 두 번째 여왕의 배치 차근차근 이해하는 알고리즘

  11. n-여왕(3/9) • 상태공간 트리의 일부 • 최종 상태의 예 차근차근 이해하는 알고리즘

  12. n-여왕(4/9) 차근차근 이해하는 알고리즘

  13. n-여왕(5/9) • 백트래킹 알고리즘 • 배열을 이용하여 상태 공간 트리를 관리하는 방법 • 기억해야 할 정보는 “걸어온 길” • 레벨 i노드는i번째 행까지 놓인 i개의 여왕 위치를 기억해야 함 • 해당 노드가유망하여 자식 노드로 내려간다면 i+1개의 여왕 위치를 기억 • 유망하지 않아 부모 노드로백트래킹한다면i-1개의 여왕 위치를 기억 • 배열 인덱스: 행, 배열 값:해당 행에서 놓인 여왕의 열 위치 ∴ n개의 열을 저장할 수 있는 1차원 배열이 필요 차근차근 이해하는 알고리즘

  14. n-여왕(6/9) • 상태 공간 트리에 대응하는 배열 상태 • 각 노드에 해당하는 배열의 값들은 부분해 • 아래로 이동하면 다음 인덱스에 값을 저장하고 위로 이동하면 마지막에 저장된 배열 원소는 덮어쓰기가 가능 전진할 때 기억하고 후진할 때 기억에서 지움 차근차근 이해하는 알고리즘

  15. n-여왕(7/9) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 voidqueen_BT(inti) { intcol; if(promising(i)) if(i==n) output_solution(i); else for(col=1;col<=n;col++) { column[i+1] =col; queen_BT(i+1); } } boolpromising(inti) { intj; for(j=1;j<i;j++) if(column[i]==column[j]||abs(column[i]-column[j])==i-j) returnfalse; returntrue; } • 알고리즘: queen-BT(0);을호출함으로써 시작 차근차근 이해하는 알고리즘

  16. n-여왕(8/9) • 유망하지 않은 노드: i행과 j행에 있는 두 여왕이 서로 공격하는 상황 규칙 1)같은 행에 있는 경우: 한 줄에 하나씩의 여왕을 배치하기 때문에 절대로 발생하지 않음 규칙 2)같은 열에 있는 경우: column[i]=column[j] 규칙 3)같은 대각선 위에 있는 경우: 두 여왕을 잇는 선분의 기울기=1 또는 –1 차근차근 이해하는 알고리즘

  17. n-여왕(9/9) • 알고리즘 분석 • 상태 공간 트리의노드수(최악의 경우 상태 공간의 모든 노드를방문) • 4-여왕 문제:341개,8-여왕 문제:19,173,961개 • 유망한 노드 수 • 같은 열에 두 여왕을 배치할 수 없으므로 상태 공간 트리에서 레벨이 하나씩 증가할수록 유망한 노드의 수는 하나씩 줄어듦. 따라서 유망한 노드의 수는 최대 • 4-여왕 문제:최대 65개,8-여왕 문제:최대 109,601개 • 단지 유망한 노드의상한 • 실제 방문하는 노드의수 차근차근 이해하는 알고리즘

  18. 해밀턴 사이클(1/7) • 기본 정의 • 해밀턴경로(Hamiltonian path) • 연결된 그래프에서 모든 정점을 단 한번만 지나는 경로 • 해밀턴 사이클(Hamiltonian cycle) 또는 해밀턴 회로(Hamiltonian circuit) • 해밀턴 경로가 사이클을 이룸 • 한 정점에서 출발하여 나머지 정점을 한 번씩만 방문하여 출발 정점으로 돌아오는 경로 • 문제: 간선 가중치가 없는 비방향성 그래프에서 해밀턴사이클이 존재? • (a)는 {1,2,6,4,5,3,1}의 해밀턴 사이클을 포함,(b)는 해밀턴사이클을 포함하지 않음 • 해밀턴사이클 문제는 최적화 문제 TSP에 대한 결정 문제 버전 • 해밀턴사이클이 존재하는지 여부를 묻는 문제는 TSP와 마찬가지로 NP-완전 문제 차근차근 이해하는 알고리즘

  19. 해밀턴 사이클(2/7) • 상태 공간 트리 • 간선의 가중치가 없는 비방향성 그래프, 정점은 1~n, 출발점은 정점 1이라 가정 • 각 노드의 자식 노드 수는 n-1개(출발점제외) • 레벨 0의 루트 노드는 정점 1을 방문한 상태 cf) n-여왕 문제는 비어있는 체스판에서출발 • 레벨 i의 노드들은 출발점에서 i번째까지 방문한 정점들의 경로 차근차근 이해하는 알고리즘

  20. 해밀턴 사이클(3/7) • 단말 노드의레벨 • 출발점으로부터 n-1개의 정점을 거쳐 다시 출발점으로 되돌아와야 하므로 원칙적으로는 n • 유망한 노드를 판별하는 방법을 잘 만들면 단말 노드의 레벨을 n-1로 하여도 충분 • 유망하지 않은 노드를판별: 세 조건 중 어느 하나라도 만족하면 유망하지 않음 규칙 1)출발점으로부터 i번째 방문한 정점이 i-1번째 방문한 정점과 인접하지 않음 규칙 2)단말 노드에 나타나는 n-1번째 방문한 정점이 출발점과 인접하지 않음 다시 출발점으로 돌아오는 상황을 단말 노드에 표현하지 않아도 됨 규칙 3)출발점으로부터 i번째 방문한 정점은 이미 방문한 i-1개의 정점 중 하나 차근차근 이해하는 알고리즘

  21. 해밀턴 사이클(4/7) 차근차근 이해하는 알고리즘

  22. 해밀턴 사이클(5/7) • 백트래킹 알고리즘 • 배열을 이용하여 상태 공간 트리를 관리하는 방법: n-여왕 문제와 유사 • 기억해야 할 정보는 “걸어온 길” • 레벨 i노드는 출발점으로부터 방문한 i개의 정점을 기억해야 함 • 해당 노드가 유망하여 자식 노드로 내려간다면 i+1개의 정점을 기억 • 유망하지 않아 부모 노드로백트래킹한다면i-1개의 정점을기억 • 배열 인덱스:방문 순서,배열 값: 해당 순서에서 방문한 정점 ∴ 출발점을 포함하여n개의 정점을 저장할 수 있는 1차원 배열이 필요 • [그림 5.12]의 해답 상태 차근차근 이해하는 알고리즘

  23. 해밀턴 사이클(6/7) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 voidhamiltonian_cycle_BT(inti){ intvertex; if(promising(i)) if(i==n-1) { output_solution(i); exit(0); } else for(vertex=2;vertex<=n;vertex++) { path[i+1] =vertex; hamiltonian_cycle_BT(i+1); } } boolpromising(inti){ intj; if(i!=0&&!graph[path[i-1]][path[i]]) returnfalse; if(i==n-1&&!graph[path[n-1]][path[0]]) returnfalse; for(j=1;j<i;j++) if(path[i]==path[j]) returnfalse; returntrue; } • 알고리즘: path[0] = 1; hamiltonian_cycle_BT(0); 을호출함으로써 시작 차근차근 이해하는 알고리즘

  24. 해밀턴 사이클(7/7) • 알고리즘 분석 • 상태 공간 트리의노드수 • 4 정점 문제:40개,8 정점: 960,800개 • 대한민국에서 특별시와 광역시 8곳과 도청소재지 9곳 도합 17도시만을 대상 19,676,527,011,956,855,057개 • 결정 문제이므로 실제 방문하는 노드 수는 훨씬 적음 • 유망한 노드 수 • n-여왕 문제와는달리 유망한 노드 개수를 계산할 수 없음 • 같은 개수의 정점이라 하더라도 입력 그래프에 따라 유망한 노드의수가 달라짐 • 아주 빨리 해답을 얻을 수도 있고 상태 공간 트리를 모두 뒤져야 할 수도 있음 차근차근 이해하는 알고리즘

  25. k-그래프 채색(1/8) • 그래프 채색(graph coloring) 문제 • 정점, 간선, 면을 기준으로 인접한 구성 요소가 같은 색이 되지 않도록 칠하는 문제 • 정점 채색:인접한 두 정점이 같은 색을 갖지 않도록 모든 정점을 칠하는 문제 • 간선 채색:인접한 두 간선이 같은 색을 갖지 않도록 모든 간선을 칠하는 문제 • 면 채색:인접한 두 면이 같은 색을 갖지 않도록 모든 면을 칠하는 문제 • 대개 정점 채색을 의미 • 간선 채색의 경우 선 그래프(line graph)에 대한 정점 채색 문제로 변환가능 • 면 채색의 경우 이중 그래프(dual graph)에 대한 정점 채색 문제로 변환가능 • 루프를 갖는 정점은 채색이 불가능하므로 루프가 없는 그래프를 대상 • k-그래프 채색 문제 • 최대 k개의 서로 다른 색을 가지고,정점 채색이 가능한지 확인하는 결정 문제 • 무슨 색으로 칠하는가는 중요하지 않기 때문에 색은 1,2,3과 같이 정수로 표현 • 그래프 G의 채색수(chromaticnumber) • 그래프 G를 채색하기 위해 최소로 필요한 색깔의 수를 알아내는 문제 • n개의 정점을 갖는 완전 그래프의 채색수=n, 트리의채색수=2 • 단순한 지도에는 3색이면 충분.홀수개의 영역에 둘러싸인 영역이 있다면 4색이 필요 차근차근 이해하는 알고리즘

  26. k-그래프 채색(2/8) • 상태 공간 트리(지도 채색 문제를 대상으로) • 지도에 있는 영역: 정점,영역 사이의 인접 여부: 간선 평면 그래프 • 그래프의 정점은 1부터 n까지 차례대로 번호가 매겨져 있다고 가정 차근차근 이해하는 알고리즘

  27. k-그래프 채색(3/8) • 아무것도 칠하지 않은 비어있는 지도에서 출발 • 레벨 i의 노드들은 정점 1에서부터 차례대로 정점 i까지 채색한 상태 • 단말 노드의 레벨은 당연히 n • 유망하지 않은 노드를 판별:인접한 정점은 같은 색으로 칠해서는 안 된다!! 차근차근 이해하는 알고리즘

  28. k-그래프 채색(4/8) 차근차근 이해하는 알고리즘

  29. k-그래프 채색(5/8) • 백트래킹 알고리즘 • 배열을 이용하여 상태 공간 트리를 관리하는 방법 • 기억해야 할 정보는 “걸어온 길” • 레벨 i노드는i개의 정점의 색을 기억해야 함 • 해당 노드가 유망하여 자식 노드로 내려간다면 i+1개 정점의 색을 기억 • 유망하지 않아 부모 노드로백트래킹한다면i-1개 정점의색을기억 • 배열 인덱스:정점,배열 값: 해당 정점을 칠한 색 ∴ n개의 색을 저장할 수 있는 1차원 배열이 필요 • [그림 5.16]의 해답 상태 차근차근 이해하는 알고리즘

  30. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 voidcoloring_BT(inti){ intc; if(promising(i)) if(i==n) { output_solution(i); exit(0); } else for(c=1;c<=k;c++) { color[i+1] =c; coloring_BT(i+1); } } k-그래프 채색(6/8) boolpromising(inti){ intj; for(j=1;j<i;j++) if(graph[i][j] &&color[i]==color[j]) returnfalse; returntrue; } • 알고리즘: coloring_BT(0); 을호출함으로써 시작 차근차근 이해하는 알고리즘

  31. k-그래프 채색(7/8) • 알고리즘 분석 • 상태 공간 트리의노드수 • 아시아 46개국만을 대상  약 1.3 ×1022 • 결정 문제이고 효율적 가지치기가 이루어지므로 실제 방문 노드 수는 훨씬 적음 • [그림 5.16]의 경우 총 29,524개의 노드 가운데 17개 노드만 방문 • 유망한 노드 수 • 해밀턴 사이클 문제처럼 유망한 노드 개수를 계산할 수 없음 • 같은 개수의 정점이라 하더라도 입력 그래프에 따라 유망한 노드의수가 달라짐 • 아주 빨리 해답을 얻을 수도 있고 상태 공간 트리를 모두 뒤져야 할 수도 있음 차근차근 이해하는 알고리즘

  32. k-그래프 채색(8/8) • 응용 분야 • 컴파일러에서의 레지스터 할당 문제를 모델링 • 목적 코드의 실행 시간을 줄이기 위하여 코드최적화에서 사용하는 기술 중 하나는 컴파일된 프로그램내의 자주 쓰이는 값을 이왕이면 빠른 레지스터에 배정 • 변수를 정점으로, 동시에 필요한 변수들 사이를 간선으로 나타내는 간섭 그래프를 구축하고 k색으로 채색 가능하다면 어떤 경우라도 동시에 필요한 변수들을 최대 k개의 레지스터에 저장 가능 • 스도쿠(Sudoku) • 가로와 세로 9칸씩 모두 81칸으로 이루어진 정사각형의 가로줄과 세로줄에 각각 1에서 9까지 숫자를 한 번씩만 써서 채우기 • 큰 정사각형은 가로와 세로 각 3칸으로 모두 9칸인 작은 사각형 9개로 이루어져 있는데 그 9칸짜리 작은 사각형 안에서도 1에서 9까지 숫자가 겹치지 않아야 함 • 9-채색 문제를 81개의 정점을 가진 그래프에 적용하는 것이나 마찬가지 • 다양한 스케줄링 문제 • 각 작업들에 동일한 시간을 할당한다고 가정할 때, 각 작업을 정점으로 하고, 겹쳐서 진행할 수 없는 작업들을 간선으로 연결한 그래프를 생각해보자. 이 그래프를 대상으로 채색수를 구한다면 이로부터 최소 완료 시간을 구할 수 있음 차근차근 이해하는 알고리즘

  33. 부분집합의 합(1/7) • 부분집합의 합 문제(sumofsubsetsproblem,subsetsumproblem) • 유한개의 정수를 원소로 하는 집합이 있을 때 원소의 합이 0이 되는 부분집합이 존재하는지 알아내는 문제(단 공집합은 제외) • 예) 집합{-4,-2,1,3}의 경우 부분집합 {-4,1, 3}의 원소 합이 0 • 원소 합에 관한 조건을 임의의 정수로 일반화 가능 • 물건의 단위 무게당 이익이 동일한 0-1배낭 문제 • 최대 이익은 배낭 용량 M을 꽉 채울 경우: 원소를 양수로 한정하는 부분집합의 합 문제와 동일 • 각 물건의 이익에 대한 정보는 더 이상 필요 없음 • 주의) 물건을 무게에 따라 오름차순으로 정렬 차근차근 이해하는 알고리즘

  34. 부분집합의 합(2/7) • 상태 공간 트리 • 기본적으로 0-1 배낭 문제의 상태 공간 트리와 동일 차근차근 이해하는 알고리즘

  35. 부분집합의 합(3/7) • 레벨 i의 노드가유망하지 않음을 판별하는 기준 • 현재 i번째 물건까지 결정된 상태이고 현재까지 배낭에 넣은 물건들의 무게의 합을 weight라 하면 다음 경우에 유망하지 않은 노드 규칙 1)현재까지의 무게가 배낭의 무게를 초과: weight >M 규칙 2)아직은 배낭에 여유가 있지만 어떤 물건을 추가로 넣더라도 초과 • 물건을 무게에 따라 오름차순으로 정렬한 이유 • 규칙 2를 조사하여 가지치기를 하게 되면 규칙 1에 의한 유망하지 않은 경우는 절대로 발생 불가능 규칙 1은 검사할 필요 없음 규칙 3)남은 물건을 모두 배낭에 넣어도 배낭 용량에 미치지 못함 남은 물건들의 무게 합을 rest라 할 때 차근차근 이해하는 알고리즘

  36. 부분집합의 합(4/7) 차근차근 이해하는 알고리즘

  37. 부분집합의 합(5/7) • 백트래킹 알고리즘 • 배열을 이용하여 상태 공간 트리를 관리하는 방법 • 기억해야 할 정보는 “걸어온 길” • 레벨 i노드는i개 물건가운데 배낭에 넣은 물건들을 기억해야 함 • 해당 노드가 유망하여 자식 노드로 내려간다면 i+1개 물건가운데 배낭에 넣은 물건들을 기억 • 유망하지 않아 부모 노드로백트래킹한다면i-1개 물건가운데 배낭에 넣은 물건들을 기억 • 배열 인덱스:물건,배열 값:물건의 포함 여부 ∴ n개의 값(true/false)색을 저장할 수 있는 1차원 배열이 필요 • [그림 5.18]의 해답 상태 • 단말 노드가 아닌 노드가 해답이라면 해답 노드의 레벨까지 저장된 값만이 유효 차근차근 이해하는 알고리즘

  38. 부분집합의 합(6/7) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 voidsum_of_subsets_BT(inti,intweight,intrest) { if(promising(i,weight,rest)) if(weight==M) { output_solution(i); exit(0); } else{ X[i+1] =true; sum_of_subsets_BT(i+1,weight+W[i+1],rest-W[i+1]); X[i+1] =false; sum_of_subsets_BT(i+1,weight,rest-W[i+1]); } } boolpromising(inti,intweight,intrest) { if(weight+rest<M) returnfalse; if(weight!=M&&weight+W[i+1]>M) returnfalse; returntrue; } • 알고리즘: sum_of_subsets_BT(0,0,rest);를 호출함으로써 시작 변수 rest의 초기 값은 모든 물건의 무게 합 즉 배열 W[]의 값을 모두 더한 값 차근차근 이해하는 알고리즘

  39. 부분집합의 합(7/7) • 알고리즘 분석 • 상태 공간 트리의노드 수 • 2-그래프 채색 문제와 같은 노드수 • NP-완전 문제 중에는 비교적 노드수가 적지만 여전히 지수 복잡도 • 유망한 노드 수 • 해밀턴사이클 문제처럼 유망한 노드 개수를 계산할 수 없음 • 같은 개수의 정점이라 하더라도 배낭 용량이나 물건 무게에 따라 유망한 노드의 수가 달라짐 • 아주 빨리 해답을 얻을 수도 있고 상태 공간 트리를 모두 뒤져야 할 수도 있음 • 가장 무거운 물건을 제외한 나머지 물건들의 무게 합이 배낭의 용량보다 작고, 가장 무거운 물건의 무게가 배낭의 용량과 같다면 해답을 찾기 위해 모든 노드를 탐색하여야 함 차근차근 이해하는 알고리즘

  40. 0-1 배낭 문제(1/9) • 0-1 배낭 문제는 • 욕심쟁이 방법으로 해결할 수 없음(2장) • 분할정복과 동적 계획법을 이용하여 해결(4장) • 문제 • 각 물건을 통째로 넣거나 아예 안 넣거나 택일해야 한다는 조건이 있을 때, 배낭의 용량을 넘지 않으면서 배낭에 담을 수 있는 물건들의 최대 이익이 얼마인가? • 최대 이익을 얻어내기 위해 어떤 물건들을 담아야 하는가? • 주의) 물건을 단위 무게당 이익에 따라 내림차순으로 정렬 차근차근 이해하는 알고리즘

  41. 0-1 배낭 문제(2/9) 1 2 3 4 5 6 voidbacktracking_opt(nodev) { nodechild; optimal=winner(optimal,solution(v)); if(promising(v)) foreach(v의자식노드child) backtracking_opt(child); } • 최적화 문제 해결을 위한 백트래킹 알고리즘 구조 • 모든 해답을 다 찾아야 하는 문제에 대한 백트래킹:n-여왕 문제 • 결정 문제에 대한 백트래킹:해밀턴 사이클 문제 • 최적화 문제에 대한 백트래킹 • 상태 공간 트리를 모두 뒤지는 것이 목표 • 현재까지의 최적해를 항상 기억하고 있다가 방문하는 새 노드의 해와 비교한 후 새 노드의 해가 더 낫다면 최적해 값을 변경 차근차근 이해하는 알고리즘

  42. 0-1 배낭 문제(3/9) • 상태 공간 트리 • 주요 변수 • weight= 현재까지 담은 물건의 무게 합 • profit= 현재까지 담은 물건의 이익 합 • max_profit= 현재까지의 최적해 즉 현재까지의 최대 이익 • 최적해를변경하는 조건 • 배낭에 물건을 넣어야 하는 노드를방문 weight와 profit의 값이 증가 • 배낭의 용량을 넘어서지 않으면서 지금까지의 최대 이익보다 큰 이익이 발생하면 max_profit값은 변경된 profit값으로 바뀌어야 함 • 따라서 다음 조건을 만족하면 최적해가 변경 차근차근 이해하는 알고리즘

  43. 0-1 배낭 문제(4/9) • 유망하지 않은 노드의판별(현재 i번째 물건까지 결정된 상태) 규칙 1)더 이상 물건을 담을 수 없는 경우 규칙 2)아직은 배낭에 여유가 있지만 현 상태에서 어떻게 진행하더라도 현재까지의 최대 이익보다 더 큰 이익을 기대하지 못하는 경우(현재까지 담은 물건의 이익에다가 남아있는 물건들을 최적으로 추가하여 얻을 수 있는 이익을 합한다 하더라도 현재까지의 최대 이익을 능가하지 못하는 경우) • 부분 배낭 문제로 풀었을 때의 최대 이익 ≥ 0-1배낭 문제로 풀었을 때의 최대 이익 ∴최대 이익의 상한을 구하기 위해 부분 배낭 문제로 변신 • 현재까지 담은 물건의 이익(profit)+남은 물건을 대상으로 부분 배낭 문제로 전환하여 풀었을 때의 최대 이익(exp_profit)이 현재까지의 최대 이익(max_profit)보다 작다면 절대로 유망할 수가 없음  처음에 물건을 단위 무게 당 이익의 순에 따라 내림차순으로 정렬한 이유 차근차근 이해하는 알고리즘

  44. 0-1 배낭 문제(5/9) 차근차근 이해하는 알고리즘

  45. 0-1 배낭 문제(6/9) 차근차근 이해하는 알고리즘

  46. 0-1 배낭 문제(7/9) • 백트래킹 알고리즘 • 배열을 이용하여 상태 공간 트리를 관리하는 방법 • 부분 집합의 합 문제와 동일 • 기억해야 할 정보는 “걸어온 길” • 레벨 i노드는i개 물건가운데 배낭에 넣은 물건들을 기억해야 함 • 해당 노드가 유망하여 자식 노드로 내려간다면 i+1개 물건가운데 배낭에 넣은 물건들을 기억 • 유망하지 않아 부모 노드로백트래킹한다면i-1개 물건가운데 배낭에 넣은 물건들을 기억 • 배열 인덱스: 물건, 배열 값: 물건의 포함 여부 ∴ n개의 값(true/false)색을 저장할 수 있는 1차원 배열이 필요 • [그림 5.19]의 해답 상태 • 단말 노드가 아닌 노드가 해답이라면 해답 노드의 레벨까지 저장된 값만이 유효 차근차근 이해하는 알고리즘

  47. 0-1 배낭 문제(8/9) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 void01_ks_BT(inti,intprofit,intweight){ if(weight<= M&&profit>max_profit) { max_profit=profit; //최대이익의변경 optimal=(X[1]..X[i]);//i개의물건들의포함여부 } if(promising(i,profit,weight)) { X[i+1] =true; 01_ks_BT(i+1,profit+P[i+1],weight+W[i+1]); X[i+1] =false; 01_ks_BT(i+1,profit,weight); } } boolpromising(inti,intprofit,intweight) { intk,exp_weight=0; floatexp_profit=0; if(weight>= M) returnfalse; for(k=i+1;k<= n;k++) { if(weight+exp_weight+W[k] >M) break; exp_weight+=W[k];exp_profit+=P[k]; } if(k<=n) exp_profit+=(M-(weight+exp_weight))*P[k]/W[k]; if(profit+exp_profit<= max_profit) returnfalse; returntrue; } • 알고리즘 01_ks_BT(0,0,0);을호출함으로써 시작 전역변수 max_profit의초 기값은0

  48. 0-1 배낭 문제(9/9) • 알고리즘 분석 • 상태 공간 트리의노드 수 • 부분집합의 합 문제와 상태 공간 트리가 동일: 1+2+22+…+2n=2n+1-1 • NP-완전 문제 중에는 비교적 노드수가 적지만 여전히 지수 복잡도 • 유망한 노드 수 • 유망한 노드 개수를 계산할 수 없음 • 같은 개수의 노드를 갖더라도 배낭 용량이나 물건 무게에 따라 유망한 노드의 수가 달라짐 • 최적화 문제 상태 공간 트리를 모두 뒤져야 함.단지 탐색하는 노드의 수가 달라질 뿐 • 동적 계획법 vs. 백트래킹 • Horowitz와 Sahni의 명저 “Fundamentals of Computer Algorithms”에는 Venkatesh가실제 컴퓨터상에서 실행시켜 본 결과가 수록:다음 4가지 경우의 데이터 집합 사용 ➊ 각 물건의 무게와 이익을 1~1,000범위 안에서 임의로 생성한 경우 ➋ 각 물건의 무게와 이익을 1~100범위 안에서 임의로 생성한 경우 ➌ 각 물건 무게를 1~100범위 안에서 임의로 생성하고 이익은 무게에 10을 더한 경우 ➍ 각 물건 무게를 1~100범위 안에서 임의로 생성하고 이익은 무게에 1.1을 곱한 경우 • 배낭 용량 M은 물건 무게의 합에 절반이 되도록 하고 물건의 개수 n에 대해 10개씩의 인스턴스에대한 측정값을 비교 일반적으로 백트랙킹 알고리즘이 동적 계획법 알고리즘보다 우수 차근차근 이해하는 알고리즘

  49. 백트래킹을 마치며 • 백트래킹 • DFS를 기반으로 하여 지수 시간 이상의 시간 복잡도를 갖는 문제를 해결하기 위한 기법 • DFS와 차별되는 거의 유일한 특성은 가지치기 • 가지치기가 거의 이루어지지 않으면 모든 경우의 수를 다 확인해야 하는 무작위 기법과 유사 • 가지치기가 일어나는 노드가 단말 노드에 가까울수록 효과가 없음. But 루트 노드에서 가까운 노드 에서 가지치기는 잘 발생하지 않음 • 상대적으로 많은 정보가 축적된 단말 노드 쪽에서 발생할 확률이 높음 • 분기한정(branchandbound) • 백트래킹과 유사하지만 대개 BFS을 기반으로 한 최고 우선 검색(best-firstsearch)사용 • 노드를방문한 후 자식 노드들을 대상으로 각각의 최적해의한계값(bound) 계산 • 한계값이 현 최적해보다 좋지 않다면 유망하지 않은 노드 • 유망한 노드 중에 한계값이 최고인 노드를선택하여 방문(branch)하며 더 이상 선택할 노드가 존재하지 않을 때까지 선택과 계산을 반복 • 최적해가 있을 확률이 높은 노드 쪽으로 방문을 유도하여 가급적 빨리 최적해에 도달하게 함으로써 유망하지 않은 노드의 비율을 높이는 전략을 사용 • 노드방문 순서가 정해져 있는 백트래킹과 차별 • BFS는 일반 큐를 사용하여 구현하지만 최고 우선 탐색은 우선순위 큐를 사용하여 구현 차근차근 이해하는 알고리즘

More Related