Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 遗传算法-N皇后问题-对角冲突_Java_Genetic Algorithm_N Queens - Fatal编程技术网

Java 遗传算法-N皇后问题-对角冲突

Java 遗传算法-N皇后问题-对角冲突,java,genetic-algorithm,n-queens,Java,Genetic Algorithm,N Queens,我正在编写一个基于Java的遗传算法代码。我想解决N-queen问题,需要计算对角线上的冲突/碰撞。我无法正确地找到对角线中的碰撞 我已经找到了一个算法,但无法正确理解它是如何在我的代码上实现的。 我生成一个8x8的二维阵列 char Queens[][]={ {'.','.','.','.','.','.','.','.'}, {'.','.','.','.','.','.','.','.'},

我正在编写一个基于Java的遗传算法代码。我想解决N-queen问题,需要计算对角线上的冲突/碰撞。我无法正确地找到对角线中的碰撞

我已经找到了一个算法,但无法正确理解它是如何在我的代码上实现的。 我生成一个8x8的二维阵列

char Queens[][]={
                    {'.','.','.','.','.','.','.','.'},
                    {'.','.','.','.','.','.','.','.'},
                    {'.','.','.','.','.','.','.','.'},
                    {'.','.','.','.','.','.','.','.'},
                    {'.','.','.','.','.','.','.','.'},
                    {'.','.','.','.','.','.','.','.'},
                    {'.','.','.','.','.','.','.','.'},
                    {'.','.','.','.','.','.','.','.'},

            };
我已经找到了列和行的碰撞。只需要计算对角线碰撞

 for(int i=0;i<8;i++){
            Queens[myarr[i]][i] = 'q';
        }

int conflict=0;
        for (int i=0;i<8;i++){
            for (int j=0;j<8;j++){
                if(Queens[i][j]=='q'){




                    for(int left=j-1;left>=0;left--){
//                        System.out.print(left+"      "+j);
                        if(Queens[i][left]=='q'){
                            conflict++;
                        }
                    }


                        for(int right=j+1;right<8;right++)
                        {
                               if(Queens[i][right]=='q'){
                                conflict++;
                            }
                        }

您的代码存在一些问题:

  • 代码对冲突进行两次计数。这是不必要的,因为如果
    q1
    q2
    之间存在冲突,出于对称的原因,
    q2
    q1
    之间也存在冲突。因此,原则上,只在一个方向(向左或向右)计数就足够了。从编程的角度来说,这意味着只应使用两个内部循环中的一个(带
    -计数器的循环或带
    -计数器的循环)

    因此,第一个变化应该是删除一个内部循环。出于性能原因,这也是有意义的

  • 第二个问题是,目前只统计同一行中的冲突,而不统计同一列中的冲突

    因此,第二个变化应该是考虑同一列中的冲突。从编程角度来看,这与前面的情况类似,但现在您必须在类别顶部和底部而不是左侧和右侧进行思考

  • 下一个问题涉及对角线上冲突的考虑(这是原始问题)

    关于对角线冲突的伪代码可能来自。在这种方法中,候选解决方案被视为具有
    n
    基因的染色体。每个基因对应于nxn棋盘上的一行,并指示女王在该行中的位置。即,候选解决方案对应于大小为
    n
    的数组,其中每个元素包含皇后在属于相应元素的行中的位置

    相反,您的代码使用直接表示棋盘的
    nxn
    -矩阵。这意味着候选解决方案对应于
    nxn
    -矩阵,其中与带有皇后的字段对应的每个元素都包含字符
    q

    我不明白如何将伪代码与您的方法结合起来。这就是为什么我建议以下与您的方法兼容的替代方案:

    有两类对角线:

    • 一类包括从左上到右下的对角线。本案可按以下方式处理:

      for (int bottom = i + 1, right = j + 1; bottom < 8 && right < 8; bottom++, right++) {
          if (Queens[bottom][right] == 'q') {
              conflict++;
          }
      }
      

      …应导致20个冲突(两条对角线各有6=3+2+1个冲突,4行各有1个冲突,4列各有1个冲突:2*6+4*1+4*1=20)。

      您的代码存在一些问题:

      • 代码对冲突进行两次计数。这是不必要的,因为如果
        q1
        q2
        之间存在冲突,出于对称的原因,
        q2
        q1
        之间也存在冲突。因此,原则上,只在一个方向(向左或向右)计数就足够了。从编程的角度来说,这意味着只应使用两个内部循环中的一个(带
        -计数器的循环或带
        -计数器的循环)

        因此,第一个变化应该是删除一个内部循环。出于性能原因,这也是有意义的

      • 第二个问题是,目前只统计同一行中的冲突,而不统计同一列中的冲突

        因此,第二个变化应该是考虑同一列中的冲突。从编程角度来看,这与前面的情况类似,但现在您必须在类别顶部和底部而不是左侧和右侧进行思考

      • 下一个问题涉及对角线上冲突的考虑(这是原始问题)

        关于对角线冲突的伪代码可能来自。在这种方法中,候选解决方案被视为具有
        n
        基因的染色体。每个基因对应于nxn棋盘上的一行,并指示女王在该行中的位置。即,候选解决方案对应于大小为
        n
        的数组,其中每个元素包含皇后在属于相应元素的行中的位置

        相反,您的代码使用直接表示棋盘的
        nxn
        -矩阵。这意味着候选解决方案对应于
        nxn
        -矩阵,其中与带有皇后的字段对应的每个元素都包含字符
        q

        我不明白如何将伪代码与您的方法结合起来。这就是为什么我建议以下与您的方法兼容的替代方案:

        有两类对角线:

        • 一类包括从左上到右下的对角线。本案可按以下方式处理:

          for (int bottom = i + 1, right = j + 1; bottom < 8 && right < 8; bottom++, right++) {
              if (Queens[bottom][right] == 'q') {
                  conflict++;
              }
          }
          

          …应该会导致20个冲突(两条对角线各有6=3+2+1个冲突,4行各有1个冲突,4列各有1个冲突:2*6+4*1+4*1=20)。

          这似乎是一个完美的解释。我仔细阅读了您的所有建议,并将很快向您介绍这些建议。此外,如果使用少量人群(即5人)发起冲突,解决方案集是否会收敛到相同数量的冲突?我不确定我是否正确理解了这个问题。在
          n
          皇后区问题中,
          nxn
          板上的
          n
          皇后区应无冲突地排列。对于每个
          n
          都有许多解决方案,例如,如果
          n=8
          有92个
          { 'q', '.', '.', '.', '.', '.', '.', 'q' }, 
          { '.', '.', '.', '.', '.', '.', '.', '.' },
          { '.', '.', 'q', '.', '.', 'q', '.', '.' }, 
          { '.', '.', '.', '.', '.', '.', '.', '.' },
          { '.', '.', '.', '.', '.', '.', '.', '.' }, 
          { '.', '.', 'q', '.', '.', 'q', '.', '.' },
          { '.', '.', '.', '.', '.', '.', '.', '.' }, 
          { 'q', '.', '.', '.', '.', '.', '.', 'q' },