Мне поручена задача создания генетического алгоритма, который является проблемой распределения, когда объект должен распределять компоненты на две стойки оборудования, минимизируя степень межсоединения.Специфическая функция генерации генетического алгоритма
В основном то, что мне нужно сделать, читается в матрице A
, которая является списком компонентов связи компонентов. cij
представляет количество соединений между компонентом i
и компонентом j
. Он должен быть симметричным каждый раз. У нас есть совокупность, все значения хранятся в 2D-массивах, такова моя реализация.
Матрица A
прочитанная в нашей матрице смежности, и численность населения определяет, как мы будем бить предметы. Стеллажи bin0
и bin1
, если population[cij] = 0
, соответствующий элемент в матрице A
, прочитанный в, помещается в bin0
и применяется к тому же правилу, если population[cij] = 1
.
Теперь проблема заключается в том, чтобы найти строку в матрице совокупности, которая дает наименьшее количество межсоединений, которое представляет собой сумму весов между компонентами в разных ячейках.
Это изображение нашего базового случая:
..., в котором матрица 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]
должно отражать это соединение как сумму весов ребер, пересекающих два бункера. На данный момент это не работает должным образом.