백트래킹 기법 (Backtracking)
해를 찾는 도중에 막히면(해가 아니면) 되돌아가서 다시 해를 찾아가는 기법
깊이 우선 탐색을 통해 해를 찾음
TSP(Traveling Salesman Problem)를 위한 백트래킹 알고리즘
tour = [] : 방문한 지점(방문 순서)
bestSolution = (tour, tour의 거리) : 현재까지 찾은 가장 거리가 짧은 해
BacktrackTSP(tour) 함수
① tour가 완전한 해일 때 (모든 지점을 다 방문했을 때)
② tour가 완전하지 않을 때 (모든 지점을 방문하지 않았을 때)
① tour가 완전한 해일 때 (모든 지점을 다 방문했을 때)
만약 tour의 거리가 bestSolution의 거리보다 작으면 bestSolution = (tour, tour의 거리)
② tour가 완전하지 않을 때 (모든 지점을 방문하지 않았을 때)
tour에서 확장 가능한 각각의 점 v에 대해서 아래의 반복문 수행
newTour = tour + v // 기존 tour의 뒤에 점 v 추가
만약 newTour의 거리가 bestSolution의 거리보다 작으면 BackTrackTSP(newTour) 수행
시작점 : A
tour = [A], bestSolution = ([A], ∞) // 초기에 tour는 시작점만 가지고 있으므로 거리는 가장 큰 상수로 초기화
BacktrackTSP(tour) 호출
tour가 완전하지 않음 → A에서 확장 가능한 점은 B, C, D, E
네 점에 대해 각각 아래의 반복문 수행
먼저 B일 때,
newTour = [A, B], newTour의 거리 = 2
newTour의 거리(2)가 bestSolution의 거리(∞)보다 작으므로 BacktrackTSP([A, B]) 수행
tour가 완전하지 않음 → [A, B]에서 확장 가능한 점은 C, D, E
세 점에 대해 각각 아래의 반복문 수행
먼저 C일 때,
newTour = [A, B, C], newTour의 거리 = 5
newTour의 거리(5)가 bestSolution의 거리(∞)보다 작으므로 BacktrackTSP([A, B, C]) 수행
계속 탐색을 하다보면 tour가 완전해짐(모든 점들을 방문)
처음에 bestSolution의 거리를 무한대로 초기화했으므로 30으로 update
bestSolution = ([A, B, C, D, E, A], 30)
이런 식으로 완전하지 않은 tour에 대해서 점점 확장해 가면서 더 짧은 bestSolution의 거리를 찾아감
만약 tour가 완전하지 않아서 확장가능한 점이 남았는데 bestSolution보다 그 tour의 거리가 더 길다면 그 아래로 탐색할 필요 X (가지치기)
'파이썬 알고리즘 > 해 탐색 알고리즘' 카테고리의 다른 글
분기 한정 기법 (Branch-and-Bound) (0) | 2023.06.28 |
---|