본문으로 건너뛰기
김신건의 로그

TSP (Traveling Salesman Problem): 외판원 순회

· 수정 · 📖 약 1분 · 107자/단어 #algorithm #graph #tsp #np-hard #dp
Traveling Salesman Problem, TSP, 외판원 순회, 외판원 문제

정의

N 개 도시를 정확히 한 번씩 방문 후 시작점으로 돌아오는 최소 비용 경로. NP-hard.

Bitmask DP (N ≤ 20)

상태: dp[mask][i] = “방문 집합 = mask, 현재 도시 i” 상태의 최소 비용.

int dp[1<<20][20];  // INF 초기화

dp[1][0] = 0;   // 도시 0 에서 출발
for (int mask = 1; mask < (1<<n); mask++) {
    for (int i = 0; i < n; i++) {
        if (!(mask & (1<<i)) || dp[mask][i] == INF) continue;
        for (int j = 0; j < n; j++) {
            if (mask & (1<<j)) continue;
            int nm = mask | (1<<j);
            dp[nm][j] = min(dp[nm][j], dp[mask][i] + cost[i][j]);
        }
    }
}

int ans = INF;
int all = (1<<n) - 1;
for (int i = 1; i < n; i++)
    ans = min(ans, dp[all][i] + cost[i][0]);

시간 O(2^N · N²), 공간 O(2^N · N).

근사

  • MST + DFS: 2-approximation
  • Christofides: 1.5-approximation (metric TSP)
  • LKH (Lin-Kernighan): 휴리스틱, 실전 최강

참고

이 글의 용어 (3개)
비트마스크 DP (Bitmask DP)algorithm
정의 비트마스크 DP (Bitmask DP) 는 상태 공간이 부분집합 으로 표현될 때, 각 부분집합을 정수의 비트로 인코딩해 DP 상태로 삼는 기법. N ≤ 20 범위에서 O(2…
Hamiltonian Path: 모든 정점 한 번씩algorithm
정의 Hamiltonian Path 는 그래프의 모든 정점을 정확히 한 번씩 방문하는 경로. 시작 = 끝이면 Hamiltonian Cycle. 일반 그래프에서 NP-complet…
Spanning Tree, MST: 최소 신장 트리algorithm
정의 Spanning Tree 는 그래프의 모든 정점을 포함하는 부분 트리. MST (Minimum Spanning Tree) 는 간선 가중치 합이 최소인 spanning tre…

💬 댓글

사이트 검색 / 명령어

검색

스크롤 = 확대/축소 · 드래그 = 이동 · 0 = 원래 크기 · ESC = 닫기