0
3-opt로 여행 세일즈맨 문제의 2-opt 구현을 변환하려고합니다. 2-opt와 비교하여 3 개의 가장자리를 제거하고 더 나은 거리를 얻기 위해 대체한다고 생각합니다. 나는 무엇을 바꾸고 싶은지를 알아내는 문제를 겪고있다. 나의 2-opt 스왑에 3 가지 옵션을 추가한다. 내가 가지고있는 주된 문제는 스왑의 8 가지 종류가 모두 단일 스왑 기능으로 설명되는지 확인하는 것입니다. 는2-opt to 3-to Travel Salesman
2 옵트 코드 감사 :
private static int[] TwoOpt(int[] TSP) {
double best = totalDistance;
int numCities = TSP.length;
int visited = 0;
int current = 0;
int[] newTour = TSP;
while (visited < numCities) {
for (int i = 0; i < numCities - 1; i++) {
for (int j = i + 1; j < numCities; j++) {
int[] newerTour = Swap(i, j, newTour);
int newDistance = distance(newerTour);
if (newDistance < best) {
visited = 0;
best = newDistance;
newTour = newerTour;
}
}
}
visited++;
}
return newTour;
}
private static int distance(int[] newTour) {
int distance = 0;
for (int i = 0; i < newTour.length - 1; i++) {
distance += mstList.get(i).get(i + 1).p;
}
distance += mstList.get(newTour.length).get(0).p;
return distance;
}
private static int[] Swap(int i, int j, int[] tour) {
int size = tour.length;
int[] newerTour = new int[tour.length];
for (int c = 0; c <= i - 1; c++) {
newerTour[c] = tour[c];
}
int change = 0;
for (int d = i; d <= j; d++) {
newerTour[d] = tour[d - change];
change++;
}
for (int e = j + 1; e < size; e++) {
newerTour[e] = tour[e];
}
return newerTour;
}
를이 내가 세 옵트, 아직 구현없고 스왑있는 것입니다.
private static int[] ThreeOpt(int[] TSP) {
double best = totalDistance;
int numCities = TSP.length;
int visited = 0;
int current = 0;
int[] newTour = TSP;
while (visited < numCities) {
for (int i = 0; i < numCities - 2; i++) {
for (int j = i + 1; j < numCities - 1; j++) {
for (int k = j + 1; k < numCities; k++) {
int[] newerTour = Swap(i, j, k, newTour);
int newDistance = distance(newTour);
if (newDistance < best) {
visited = 0;
best = newDistance;
newTour = newerTour;
}
}
}
}
visited++;
}
return newTour;
}