250x250
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 27 | 28 | 29 | 30 |
Tags
- 즉시로딩
- 힙
- SQL프로그래밍
- 다대일
- FetchType
- fetch
- 연결리스트
- 백트래킹
- dfs
- shared lock
- eager
- exclusive lock
- 유니크제약조건
- 비관적락
- querydsl
- 낙관적락
- 일대다
- BOJ
- 연관관계
- 데코레이터
- CHECK OPTION
- PS
- 다대다
- JPQL
- 지연로딩
- 스프링 폼
- 이진탐색
- 스토어드 프로시저
- 동적sql
- execute
Archives
- Today
- Total
흰 스타렉스에서 내가 내리지
외판원 문제 (Traveling Salesman Problem, TSP) 본문
728x90
외판원 문제 (Traveling Salesman Problem, TSP)
TSP문제는 해밀토니안 사이클을 이용해 다음과 같이 정의된다.
가중치 그래프 G = (V, E)가 주어졌다. G에서 모든 가능한 해밀토니안 사이클 중에서 경로의 합이 최소인 사이크르이 경로의 합을 구하라.
완전 탐색을 이용하면 항상 확실한 해를 구할 수 있다. 임의의 한 점을 출발점으로 잡고 아직 가보지 않은 모든 이웃 정점으로 계속 이동하면서 검사하면 된다. 그래프가 N개의 정점을 갖는 완전그래프라면 모든 해밀토니안 사이클은 (N-1)! 개가 된다.
- 임의의 도시를 출발점으로 잡는다.
- 이 도시를 시작으로 하여 (N-1)!가지의 순열 객체를 생성한다.
- 모든 순열 객체에서 경로의 합을 구하고, 경로의 합이 최소인 순열 객체와 경로 합을 찾는다.
- 최소 경로의 합을 반환한다.
도시의 수가 n이라면 이 알고리즘의 복잡도는 O(n!)이고, n이 조금만 커지더라고 계산량이 비현실적으로 늘어난다.
따라서 계산량을 줄이거나 보다 현실적인 알고리즘이 필요하다.
백트래킹과 분기한정 기법을 사용하면 가지치기를 통해 상태공간트리를 보다 효율적으로 탐색할 수 있다.
관련 알고리즘 문제
from itertools import permutations
import sys
input = sys.stdin.readline
n = int(input())
graph = [list(map(int, input().split())) for _ in range(n)]
arr = [i for i in range(n)]
ans = 1e9
for p in permutations(arr, n):
val = 0
for i in range(n):
if graph[p[i]][p[(i+1)%n]] == 0:
val += 1e9
else:
val += graph[p[i]][p[(i+1)%n]]
ans = min(ans, val)
print(ans)
'Algorithm' 카테고리의 다른 글
효율적으로 거듭제곱 계산하기 (2) | 2024.01.05 |
---|---|
그래프 알고리즘- union·find, mst - kruskal·prim, topology (0) | 2023.12.28 |
탐욕 알고리즘 (Greedy Algorithm) (0) | 2022.01.06 |
[알고리즘] 에라토스테네스의 체(Sieve of Eratosthenes) (0) | 2022.01.03 |
[알고리즘] 이진 탐색 알고리즘 (Binary Search Algorithm) (0) | 2022.01.02 |