The Traveling Salesperson Problem
-> 비행기타고 여기저기 출장 다녀오기 (ง˙∇˙)ว
+ 최소값으로 다녀와야함
Input
- 값이 있는 방향 그래프
- 음수 x
- 행과 열이 1부터 n까지인 2차원 배열 W
- W[i][j] : i번째 정점에서 j번째 정점까지의 간선 위의 가중치
Output
- 최적 투어의 길이를 값으로 하는 변수 minlength, 그를 구성하는 행렬 P
Dynamic Programming for TSP
- Brute force algorithm(전부 찾기)
: (n - 1)!
- The length of the optimal path(최적 경로 방법?)
아무튼 최단 거리를 찾는게 목표
일반적으로 i가 1이 아니고 vi가 A가 아니라면
a가 0이 아니면(내가 나한테 갈 수 없자나)
min값 중에서 찾고
∅ 라면 시작지로 돌아감!
Practice to solve TSP using Dynamic Programming
전에 했던 그 노가다 방법..https://meongjeong.tistory.com/entry/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98Graph-Theory-%EA%B7%B8%EB%9E%98%ED%94%84-%EC%9D%B4%EB%A1%A0
[알고리즘]Graph Theory | 그래프 이론
Graph Theory - 그래프는 G = (V, E)의 두 요소로 구성된다. - vertex : 정점 - E : 간선들의 집합 | 간선들은 2개의 endpoint를 가진다. - directed graph(digraph) : 방향성이 있는 그래프 - weighted graph(weights) : 값이 있
meongjeong.tistory.com
DP for TSP
void travel(int n, const number W[][], index P[][], number& minlrngth) {
index i, j, k;
number D[1..n][subset of V-{v1}]; //배열 선언?
for(i = 2; i <= n; i++) D[i][emptyset] := W[i][1]; // 공집합이면 원점으로 돌아가는 값 주기
for(k = 1;k <= n - 2; k++)
for all subsets A in(V-{v1}) containing k vertices
for(i != 1 and vi is not in A) { //A == n - 1 - k? 시작지에서 출발이 아니고 목적지가 vi(경유지)가 아니라면
D[i][A] = minimum_vj∈A (W[i][j] + D[vj][A-{vj}]);
P[i][A] = value of j that gave the minimum;
}
D[1][A] = minimum_2≤j≤n (W[1][j] + D[vj][A-{v1}]); //시작지부터?
P[1][A] = value of j that gave the minimum;
minilength = D[1][V - {v1}]; //아무튼 다 구하고 내가 원하는 값 넣어주기?
Theorem
Time complexity analysis for TSP in DP
하지만 DP가 brute force algorithm(n-1)!보단 낫다..
Branch and bound in TSP
위에서부터 천천히 타고 내려감..
0 Level
: 자기 자신을 제외한 노드들 중에 출발하는 경우 중 가장 min한 값을 찾아서 더함
bound
= min(14, 4, 10, 20) //1번행에서 출발
+ min(14, 7, 8, 7) //2번 행 출발
+ 3번 행에서 갈 수 있는 도시, + 4번 도시 + 5번 도시
= 4 + 7 + 4 + 2 + 4 = 21 //근데 왜 ml은 무한? << 초기 값은 무한이라?
1 Level
ex. B([1, 2]) //1다음에는 2를 가야함
1 -> 2 : 14(정해져있음)
2 -> : min(7, 8, 7) -> 7 // 1, 2(X) < 출발지와 자기 자신으로 갈 수 없음
3 -> : min(4, 7, 16)-> 4 //2, 3(x) < 2에서 옴(1에서 2로 갔으니 2에서 출발한다고 할 수 있음), 3은 자기 자신, 1은 귀국이라 가능
4 -> : 2, 4(x)
5-> : 2, 5(x)
=> 31
그니까..
1. 일단 bound가 가장 작은걸 하나 골라서 length가 나올 때 까지 살펴보기 -> ml
2. backtracking 해서 ml보다 bound가 더 작은 노드랑 비교하기 ex)6번 비교하고 bound = 27짜리 방문
3. 반복하다가 bound랑 length랑 동일하면 선택(더이상 더 작은 length는 없으므로)
라는거지 아무튼 그런거지
Another Bound Functions
1. in the rows //출발 기준
2. in the columns //도착 기준
3. in the rows & columns //평균 기준..?
이런 방법도 생각해 볼 수 있다~
'아무튼 공부중 > algorithm' 카테고리의 다른 글
[알고리즘]Heap sort 그리고 조금의 merge sort &Quick sort (0) | 2023.12.14 |
---|---|
[알고리즘] problem Analysis in Insertion Sort (0) | 2023.12.13 |
[알고리즘] Branch and Bound Algorithm | 분기 한정법 (0) | 2023.12.11 |
[알고리즘] Monte Carlo Algorithm | Sum of Subsets Problem | Hamiltonian Circuits Problem (1) | 2023.12.06 |
[알고리즘] Backtracking | n Queens Problem (0) | 2023.12.03 |