我被分配了创建遗传算法的任务,这是一个分配问题,其目标是将组件分配到两个设备机架中,以最小化互连程度。
基本上我要做的就是读取一个矩阵A
,它是组件连接的邻接列表。cij
表示组件i
和组件之间的连接数j
。每次都应该是对称的。我们有一个人口,所有的值都存储在二维数组中,这就是我的实现。
读入的矩阵A
是我们的邻接矩阵,而人口将决定我们如何对项目进行分类。如果将读入的矩阵中的相应元素放入其中,则机架是bin0
和bin1
,并且如果 ,则适用相同的规则。population[cij] = 0
A
bin0
population[cij] = 1
现在的问题是在人口矩阵中找到提供最少互连量的行,它是不同箱中组件之间的权重之和。
这是我们的基本案例的图像:
...其中A
读入的矩阵在右侧,人口如下所示,矩阵A
中元素的分箱方式显示在中间。到目前为止,我可以计算罚分,这是教授给出的约束,我还可以确定每个 bin 中有多少元素,但是到目前为止,我还没有按照描述和图片所示计算成本。到目前为止,这是我的成本函数:
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]
应该将该连接反映为交叉边的权重总和两个垃圾箱。到目前为止,这还不能正常工作。