2017-04-13 6 views
0

私は、オプトインのセールスマン問題の2-opt実装を3-optに変換しようとしています。 2-optと比較して、3つのエッジを取り除いて、より良い距離を得るためにそれらを置き換えることが理解されています。私は何を変更するかを考え出す問題を抱えています.2つのオプトスワップを追加して3つにすることができます。私が抱えている主な問題は、8種類のスワップがすべて1回のスワップ機能で確実に処理されるようにする方法です。 は2オプトアウトから3オプトネスセールスマン

2-OPTコードありがとう:

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; 

    } 

を、これは私が3-OPT、まだ実装されていないスワップのために持っているものです。

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つの形式のうち3つしかありません。

3つの部分にツアーを破る

- > B - >を、C->を

をAとCとBを接続する2つのエッジ上の2-OPTである:

  • A-> 、< -B、C->

すなわち今B.

のツアーを逆にするために3-選ぶ

  • A->、< -B、-C <
  • A - > C - > B->
  • A - > C->、< -B
  • A-> < -C、B->

なおA->、< -B、C->、及びA - > B->、< -C及びA->、< -C、< - Bはすべて2-optです。

リバーサルは簡単に実装でき、4つのバリエーションを考慮する必要があります。

関連する問題