결론부터 말하자면, TSP(외판원 문제)는 도시 수가 20개 정도까지는 동적 프로그래밍으로, 그 이상은 근사 알고리즘을 통해 현실적인 시간 내에 풀 수 있습니다. 완전 탐색 방식으로는 도시 15개만 되어도 계산 폭발로 인해 사실상 풀이가 불가능합니다.
TSP, 왜 이렇게 유명한가요? (NP-hard 문제의 핵심)
TSP(Traveling Salesman Problem, 외판원 문제)는 모든 도시를 정확히 한 번씩 방문하고 출발점으로 돌아오는 최단 경로를 찾는 문제입니다. 정의는 매우 단순하지만, 도시 수 n이 증가함에 따라 가능한 경로의 수는 (n-1)!/2로 기하급수적으로 늘어납니다. 예를 들어 도시 20개일 경우 경우의 수는 약 6 x 10¹⁶가지에 달하며, 이는 일반적인 컴퓨터로는 우주의 나이를 넘어서는 시간이 소요될 수 있습니다. 이러한 특성 때문에 TSP는 NP-hard 문제로 분류되며, 물류 경로 최적화, 반도체 회로 설계 등 다양한 실제 산업 문제 해결에 중요한 열쇠가 됩니다. 수십 년간 전 세계 연구자들이 TSP의 효율적인 해법을 찾기 위해 노력하고 있습니다.
실제 산업 현장에서 TSP의 중요성을 보여주는 사례는 매우 많습니다. 예를 들어, 택배 회사의 배송 경로 최적화, 건설 현장의 장비 이동 경로 계획, 심지어는 DNA 염기서열 분석에서도 TSP와 유사한 문제들이 등장합니다. 이러한 문제들을 얼마나 빠르고 정확하게 해결하느냐에 따라 기업의 경쟁력이 좌우되기도 합니다. 따라서 TSP 알고리즘 연구는 단순히 학문적인 호기심을 넘어 실질적인 경제적 가치를 창출하는 분야입니다.
도시 20개까지 가능한 완전 탐색과 동적 프로그래밍 (Held-Karp)
가장 직관적인 TSP 해결 방법은 완전 탐색(Brute Force)입니다. 이는 가능한 모든 경로를 탐색하고 그중 최단 경로를 찾는 방식이며, 시간 복잡도는 O(n!)입니다. 도시 10개 정도까지는 비교적 빠르게 계산되지만, 15개를 넘어가면 응답이 없을 정도로 느려집니다. 단순히 느린 것이 아니라, 도시 수가 증가함에 따라 계산량이 폭발적으로 늘어나기 때문에 구조적으로 비효율적입니다.
완전 탐색의 한계를 극복하기 위해 동적 프로그래밍 기반의 Held-Karp 알고리즘이 개발되었습니다. 이 알고리즘은 이미 계산된 부분 경로의 결과를 저장해두고 재사용하는 메모이제이션(Memoization) 기법을 활용합니다. 시간 복잡도는 O(n² x 2ⁿ)으로, 완전 탐색보다는 훨씬 빠르며 도시 20개 정도까지는 실용적으로 최적해를 구할 수 있습니다. 비트마스킹을 사용하여 방문한 도시들의 상태를 정수 하나로 표현하는 방식은 처음에는 복잡해 보일 수 있으나, 알고리즘 최적화의 효율성을 잘 보여주는 예시입니다.
수백 개 도시, 현실적인 해법은 근사 알고리즘
물류나 배달 경로처럼 도시 수가 수백 개 이상으로 많아지면, 최적해를 찾는 것은 현실적으로 불가능합니다. 이럴 때는 최적해는 아니더라도 '충분히 좋은 해'를 빠르게 찾는 근사 알고리즘(Approximation Algorithm)을 사용합니다. 가장 대표적인 근사 알고리즘 중 하나는 Nearest Neighbor Heuristic(NN)입니다. 현재 위치에서 가장 가까운 아직 방문하지 않은 도시로 계속 이동하는 방식입니다. NN 알고리즘의 시간 복잡도는 O(n²)으로 매우 빠르지만, 최적해보다 평균 20~25% 정도 더 긴 경로를 생성할 수 있습니다.
NN 알고리즘은 더 복잡하고 성능이 좋은 근사 알고리즘들의 기초가 됩니다. 실제 산업 현장에서는 LKH(Lin-Kernighan-Helsgaun) 알고리즘, 유전 알고리즘, 시뮬레이티드 어닐링과 같은 메타휴리스틱 기법들이 경로 최적화에 널리 활용됩니다. 이러한 알고리즘들은 완벽한 정답을 보장하지는 않지만, 매우 짧은 시간 안에 실용적으로 유용한 해를 제공하는 데 초점을 맞춥니다. 더 정교한 근사치를 원한다면 2-opt 개선과 같은 기법을 적용하여 해의 품질을 높일 수 있습니다.
TSP 코딩 경험으로 얻은 알고리즘 복잡도 이해
8년간 알고리즘 강의를 진행하면서 '경우의 수 폭발'이라는 개념을 이론적으로만 설명해왔습니다. 하지만 TSP 문제를 직접 파이썬 코드로 구현하고 실행해보니, 이 말이 단순한 수사가 아니라 실제 계산 과정에서의 물리적인 한계라는 것을 피부로 느낄 수 있었습니다. 이론과 실제 구현 사이의 간극이 이렇게 클 수 있다는 것을 깨달으며 오히려 제가 더 많이 배운 경험이었습니다. TSP는 완전 탐색, 동적 프로그래밍, 근사 알고리즘의 차이를 가장 명확하게 보여주는 훌륭한 예시입니다. AI 프로그래밍이나 알고리즘 최적화를 공부하는 분이라면, TSP를 직접 코드로 구현해보는 경험은 이론적 지식을 실제 문제 해결 능력으로 전환하는 데 큰 도움이 될 것입니다. 강의실 슬라이드에서만 보던 NP-hard 문제가 코드 한 줄을 통해 이렇게 생생하게 다가올 줄은 몰랐습니다.
TSP 알고리즘 비교 요약: - **Brute Force (완전 탐색)**: 시간 복잡도 O(n!), 최적해 보장, 도시 약 10개까지 실용적. - **Held-Karp (DP)**: 시간 복잡도 O(n² x 2ⁿ), 최적해 보장, 도시 약 20개까지 실용적. - **Nearest Neighbor (근사)**: 시간 복잡도 O(n²), 최적해 미보장(근사치), 수백 개 이상 도시에서 실용적.
TSP 알고리즘의 모든 것을 직접 코드로 확인해보세요.







