0

遺伝的アルゴリズムと C プログラミング言語を勉強しています。私の仕事は、接続されたグラフを表す行列を読み取り、ノード間の距離に基づいて適合度を計算することです。教授は、これが正確である必要はなく、必ずしもグラフの制約に従う必要もないことを明らかにしました。だから私の考えは、マトリックスを機能する2D配列に読み込むことです。次に、その 2D 配列をラックと呼ぶ 1D 配列にする必要があります。次に、ラックをごちゃまぜにして、同じ長さの 2 つの小さな配列に分割します。

マトリックスは 20*20 であるため、ラックのサイズは 400 である必要があります。

とにかく、これはこれを行うための私のコードですが、機能しません。

void TwoDtoOneD(int array[][SIZE], int left[SIZE*SIZE]){
    int i,j;
    for(i=0;i<SIZE*SIZE;i++){
        for(j=0;j<SIZE*SIZE;j++){
            left[i] = array[i][j];
        }//end for
    }//end for
}
4

2 に答える 2

0

left[j+i*SIZE] = array[i][j]

左の各エントリがループでどのように満たされるかのロジックをたどってから、必要に応じて配列データを配置することを心配してください。

于 2013-02-06T02:07:10.390 に答える
0

2 つの for を実行し、それらを SIZE^2 まで反復させると、array[i]反復が多すぎます。 i20(またはサイズ)までしか行かないはずです。これは、マトリックスのiとの最大値です。jこれを機能させるには、ベクトル (左) の値を変更するたびにインクリメントされる 3 番目の変数が必要です。この変数は、for ループ変数の開始とは関係ありません。

したがって、あなたの例では、次のようになります。

void TwoDtoOneD(int array[SIZE][SIZE], int left[SIZE*SIZE]){  /
  int i,j,k;
  k=0;
  for(i=0;i<SIZE;i++){
     for(j=0;j<SIZE;j++){
        left[k] = array[i][j];
        k++;
     }//end for
  }//end for
}

これで、left[]配列にk+1要素があり、まで反復処理できますk

最後に、グラフを扱っているので、グラフ パス アルゴリズム (ダイクストラプリムフロイドジョンソンなど) について読んでみてください。グラフの問題 (またはほとんどの問題)。

お役に立てれば。幸運を!

于 2013-02-06T02:16:48.257 に答える