🧭 방문 경로 최적화 — 여러 지점을 모두 한 번씩 들르는 가장 짧은 순서를 찾습니다 (외판원 문제, TSP). 지점 수가 적으면 모든 경우를 따져 진짜 최적해를, 많으면 최근접 이웃 + 2-opt 휴리스틱으로 근사해를 구하고, 전략별 결과를 나란히 비교합니다.
거리는 두 지점을 잇는 직선 거리(대권 거리)입니다. 실제 도로 주행 거리보다 짧게 나오지만, 방문 순서는 대개 도로 기준과 같습니다. 배경지도는 국토교통부 브이월드이며, 지도 오른쪽 위에서 일반·위성 지도를 바꿀 수 있습니다.
1. 지점 입력
위치 정보 빌더(/builder/location)에서 저장한 지점을 같은 브라우저에서 바로 가져옵니다. CSV는 name, lat, lng 열을 찾아 읽고(빌더의 CSV 내보내기 그대로), 지도를 클릭해도 지점이 추가됩니다. 최대 200개.
2. 설정
3. 지점 목록 0
#출발이름위도경도
아직 지점이 없습니다
🧭
지점을 두 개 이상 넣으면 경로가 그려집니다
지도를 클릭해 직접 찍어도 됩니다
출발경유도착
0
지점 수
—
총 거리 (km, 직선)
—
입력 순서 대비
—
사용한 방법
전략 비교 — 줄을 누르면 그 경로를 지도에 그립니다
전략총 거리 (km)입력 순서 대비설명
지점을 두 개 이상 넣으면 계산됩니다
방문 순서
순서지점위도경도구간 (km)누적 (km)
—

왜 "다 따져보면" 안 되나요? 출발점을 정한 뒤 나머지 지점의 순서를 모두 나열하면 (n−1)! 가지, 순환 경로는 방향이 같으므로 그 절반입니다.

지점 수510152030
순환 경로 수12181,4404.4 × 10¹⁰6.1 × 10¹⁶4.4 × 10³⁰

최적해 (동적 계획법, Held-Karp) — "어느 지점들을 거쳐 지금 여기 있나"만 기억하면 같은 상황을 두 번 계산하지 않아도 됩니다. 계산량이 2ⁿ·n² 로 줄어 15개 지점이면 수백만 번 계산으로 끝나지만, 30개면 다시 불가능해집니다.

최근접 이웃 — 지금 있는 곳에서 가장 가까운 미방문 지점으로 갑니다. 순식간에 끝나지만 마지막에 멀리 떨어진 곳이 남아 크게 돌아오는 함정이 있습니다. 2-opt — 경로에서 서로 교차하는 두 변을 골라 풀어 다시 잇기를 반복합니다. 교차가 없어질 때까지 다듬으면 최근접 이웃의 결과가 보통 5~15% 짧아집니다.

직선 거리의 한계 — 강·산·일방통행은 모릅니다. 실제 도로 거리로 바꾸려면 길찾기 API(카카오모빌리티·OSRM 등)로 지점 사이 거리 행렬을 받아 같은 알고리즘에 넣으면 됩니다.