2013-02-18 4 views
1

Мне поручена задача создания генетического алгоритма, который является проблемой распределения, когда объект должен распределять компоненты на две стойки оборудования, минимизируя степень межсоединения.Специфическая функция генерации генетического алгоритма

В основном то, что мне нужно сделать, читается в матрице A, которая является списком компонентов связи компонентов. cij представляет количество соединений между компонентом i и компонентом j. Он должен быть симметричным каждый раз. У нас есть совокупность, все значения хранятся в 2D-массивах, такова моя реализация.

Матрица A прочитанная в нашей матрице смежности, и численность населения определяет, как мы будем бить предметы. Стеллажи bin0 и bin1, если population[cij] = 0, соответствующий элемент в матрице A, прочитанный в, помещается в bin0 и применяется к тому же правилу, если population[cij] = 1.

Теперь проблема заключается в том, чтобы найти строку в матрице совокупности, которая дает наименьшее количество межсоединений, которое представляет собой сумму весов между компонентами в разных ячейках.

Это изображение нашего базового случая:

Screen capture

..., в котором матрица A читать находится справа, население показано ниже, и как элементы в матрице A binned показано посередине. На данный момент я могу рассчитать штраф, это ограничение, данное профессором, я также могу определить, сколько элементов в каждом ящике, но расчет стоимости, описанной и как показано на картинке, до сих пор ускользает от меня. Пока еще это моя стоимость функция:

public static int[] calcCost(int[][] matrix, int[][] population){ 
int cost[] = new int[size]; 

for(int m=0;m<size;m++){ 
    for(int i=0; i<size; i++){ 
     for(int j=0; j<size; j++){ 
      //System.out.println(m + "\t" + i + "\t" + j); 
      if(population[i][j] == 1){ 
       cost[m] += matrix[i][j]; 
       } 
      }//end for 3 
     }// end for 2 
    }//end for 1 
    //printArrayI(cost); 
    return cost; 
} 

Идея заключается в том, чтобы иметь m отслеживать, где мы находимся в общем расчете и элементы i и j сканирование строк и столбцов для соединений в популяции, когда обнаружено соединение cost[i] должно отражать это соединение как сумму весов ребер, пересекающих два бункера. На данный момент это не работает должным образом.

ответ

1

Я решил проблему, я просто повторил ошибку. Вот решение, которое я нашел.

public static int[] calcCost(int[][] matrix, int[][] population){ 
int cost[] = new int[size]; 

for(int m=0;m<size;m++){ 
    for(int i=0; i<size; i++){ 
     if(population[m][i] == 0){ 
      for(int j=0; j<size; j++){ 
       if(population[m][j] == 1){ 
        cost[m] += matrix[i][j]; 
        } 
       } 
      } 
     }// end for 2 
    }//end for 1 
    printArrayI(cost); 
    return cost; 
} 
Смежные вопросы