Epso

TwoOpt

Jan 16th, 2013
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 1.92 KB | None | 0 0
  1.     // TODO Local Search
  2.     /**
  3.      * Обязан быть полносвязный граф. Поиск локального оптимума
  4.      *
  5.      * @param a
  6.      * @param localChain
  7.      */
  8.     public void localSearch(int a[][], byte curChain[])
  9.     {
  10.         byte N = (byte) curChain.length;
  11.         long curWeight = getWeight(a, curChain);
  12.         operationCounter2 = 0;
  13.  
  14.         System.out.printf("\nМетод поиска локального оптимума:\n\nВес: %d, Начальная цепочка:", curWeight);
  15.         printArrayInc(curChain);
  16.         System.out.printf("\n\n");
  17.  
  18.         long nextWeight = 0;
  19.         operationCounter = 0;
  20.         byte nextChain[] = new byte[N];
  21.  
  22.         // copy Chain;
  23.         for (int i = 0; i < N; i++)
  24.             nextChain[i] = curChain[i];
  25.  
  26.         for (int i = 1  ; i <= (N - 3); i++)
  27.             for (int j = (i + 2); j <= (N - 1); j++)
  28.             {
  29.                 // swap;
  30.                 byte tmp = nextChain[i];
  31.                 nextChain[i] = nextChain[j - 1];
  32.                 nextChain[j - 1] = tmp;
  33.                 // если между поменянными вершинами, больше двух вершин, их нужно сделать в обратном порядке
  34.                 if (j-i >= 3) doReverse(nextChain, i + 1, j - 2);
  35.  
  36.                 // Считаем новый вес
  37.                 nextWeight = getWeight(a, nextChain);
  38.  
  39.                 // Проверяем
  40.                 operationCounter2++; // счетчик элементарных операций
  41.                 if (nextWeight < curWeight)
  42.                 {
  43.                     // copy Chain;
  44.                     for (int k = 0; k < N; k++)
  45.                         curChain[k] = nextChain[k];
  46.  
  47.                     curWeight = nextWeight;
  48.                     operationCounter++; // счетчик кол-ва оптимизаций
  49.                     System.out.println("Оптимизация " + operationCounter + " Вес " + curWeight);
  50.                     printArrayInc(curChain);
  51.                     System.out.println();
  52.                     i = 0; // если была оптимизация, возвращаем циклы на исходную
  53.                     j = 2;
  54.                 }
  55.             }
  56.         System.out.println("\nОпераций:" + operationCounter2);
  57.     }
Advertisement
Add Comment
Please, Sign In to add comment