1

私は遺伝的アルゴリズムを作成するタスクを割り当てられています。これは、相互接続の程度を最小限に抑えてコンポーネントを 2 つの機器ラックに割り当てることを目的とする割り当て問題です。

基本的に私がしなければならないことはA、コンポーネント接続の隣接リストであるマトリックスを読み取ることです。componentと componentcij間の接続数を表します。毎回対称である必要があります。母集団があり、すべての値は 2D 配列に格納されています。これが私の実装です。ij

読み込まれた行列Aは隣接行列であり、人口はアイテムをビン化する方法を決定するものです。読み込まれた行列の対応する要素が配置されている場合、ラックはbin0およびであり、同じ規則が の場合に適用されます。bin1population[cij] = 0Abin0population[cij] = 1

ここでの問題は、最小量の相互接続を与える母集団行列の行を見つけることです。これは、異なるビン内のコンポーネント間の重みの合計です。

これは、基本ケースのイメージです。

画面キャプチャ

...A読み込まれたマトリックスが右側にあり、母集団が下に表示され、マトリックス内の要素Aがビニングされる方法が中央に表示されます。まだペナルティを計算できます。これは教授によって与えられた制約です。また、各ビンにいくつの要素があるかを判断することもできますが、これまでの説明と図に示されているようにコストを計算することはできません。まだこれは私のコスト関数です:

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交差するエッジの重みの合計としてその接続を反映する必要があることです。 2つのビン。現時点では、これは正しく機能しません。jcost[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 に答える