1

我被分配了创建遗传算法的任务,这是一个分配问题,其目标是将组件分配到两个设备机架中,以最小化互连程度。

基本上我要做的就是读取一个矩阵A,它是组件连接的邻接列表。cij表示组件i和组件之间的连接数j。每次都应该是对称的。我们有一个人口,所有的值都存储在二维数组中,这就是我的实现。

读入的矩阵A是我们的邻接矩阵,而人口将决定我们如何对项目进行分类。如果将读入的矩阵中的相应元素放入其中,则机架是bin0bin1,并且如果 ,则适用相同的规则。population[cij] = 0Abin0population[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]应该将该连接反映为交叉边的权重总和两个垃圾箱。到目前为止,这还不能正常工作。

4

1 回答 1

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;
}
于 2013-02-18T19:16:34.493 回答