0

我正在研究遗传算法和 C 编程语言。我的任务是读入一个表示连通图的矩阵,然后根据节点之间的距离计算适应度,教授明确表示这不必精确,也不必遵循图上的约束。所以我的想法是将矩阵读入一个有效的二维数组。我现在需要将该二维数组转换为一维数组,我们将其称为机架,然后我们将机架打乱并将其分成两个相等长度的较小数组。

矩阵为 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

通过执行两个 fors 并让它们迭代直到 SIZE^2,你的array[i]迭代太多了。 i应该只到 20(或 SIZE),这是矩阵的i最大值j。为了完成这项工作,您需要第三个变量,每次将值更改为向量(左)时,该变量都会递增,并且此变量与 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.

最后,由于您正在使用图形,因此请尝试阅读有关图形路径算法(Dijkstra'sPrim'sFloyd'sJohnson's ...)的一些内容,您会发现对于您所有的人来说,这是一个无限的深思熟虑的解决方案图的问题(或大多数)。

希望这可以帮助。祝你好运!

于 2013-02-06T02:16:48.257 回答
0

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

了解左侧每个条目如何填充循环的逻辑,然后担心根据需要放置数组数据。

于 2013-02-06T02:07:10.390 回答