2017-04-13 3 views
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; 
    } 

답변

0

실제로는 3 가지 형식의 4 가지 형식 만 있습니다.

3 부분 (A) 내로 여행 휴식

-> B -> C->

A 및 C에 B를 연결하는 두 개의 가장자리의 2 옵트 인

:

  • A-> , < -B, C->

즉 지금 B.

의 여행을 반전하기위한 3 선택

  • A-> < -B, -C <
  • A -> C -> B->
  • A -> C-> < -B
  • A-> < -C, B->

참고 A-> < -B, C-> 및 A -> B-> A- 및 -C <> < -C, < - B는 모두 2-opt입니다.

역전은 쉽게 구현할 수 있으며 4 가지 변수 만 고려하면됩니다.