Java 遗传算法-N皇后问题-对角冲突
我正在编写一个基于Java的遗传算法代码。我想解决N-queen问题,需要计算对角线上的冲突/碰撞。我无法正确地找到对角线中的碰撞 我已经找到了一个算法,但无法正确理解它是如何在我的代码上实现的。 我生成一个8x8的二维阵列Java 遗传算法-N皇后问题-对角冲突,java,genetic-algorithm,n-queens,Java,Genetic Algorithm,N Queens,我正在编写一个基于Java的遗传算法代码。我想解决N-queen问题,需要计算对角线上的冲突/碰撞。我无法正确地找到对角线中的碰撞 我已经找到了一个算法,但无法正确理解它是如何在我的代码上实现的。 我生成一个8x8的二维阵列 char Queens[][]={ {'.','.','.','.','.','.','.','.'}, {'.','.','.','.','.','.','.','.'},
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
-计数器的循环或带右
-计数器的循环) 因此,第一个变化应该是删除一个内部循环。出于性能原因,这也是有意义的左
- 第二个问题是,目前只统计同一行中的冲突,而不统计同一列中的冲突 因此,第二个变化应该是考虑同一列中的冲突。从编程角度来看,这与前面的情况类似,但现在您必须在类别顶部和底部而不是左侧和右侧进行思考
- 下一个问题涉及对角线上冲突的考虑(这是原始问题)
关于对角线冲突的伪代码可能来自。在这种方法中,候选解决方案被视为具有
基因的染色体。每个基因对应于nxn棋盘上的一行,并指示女王在该行中的位置。即,候选解决方案对应于大小为n
的数组,其中每个元素包含皇后在属于相应元素的行中的位置 相反,您的代码使用直接表示棋盘的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
-计数器的循环或带右
-计数器的循环) 因此,第一个变化应该是删除一个内部循环。出于性能原因,这也是有意义的左
- 第二个问题是,目前只统计同一行中的冲突,而不统计同一列中的冲突 因此,第二个变化应该是考虑同一列中的冲突。从编程角度来看,这与前面的情况类似,但现在您必须在类别顶部和底部而不是左侧和右侧进行思考
- 下一个问题涉及对角线上冲突的考虑(这是原始问题)
关于对角线冲突的伪代码可能来自。在这种方法中,候选解决方案被视为具有
基因的染色体。每个基因对应于nxn棋盘上的一行,并指示女王在该行中的位置。即,候选解决方案对应于大小为n
的数组,其中每个元素包含皇后在属于相应元素的行中的位置 相反,您的代码使用直接表示棋盘的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
有92个n=8
{ 'q', '.', '.', '.', '.', '.', '.', 'q' }, { '.', '.', '.', '.', '.', '.', '.', '.' }, { '.', '.', 'q', '.', '.', 'q', '.', '.' }, { '.', '.', '.', '.', '.', '.', '.', '.' }, { '.', '.', '.', '.', '.', '.', '.', '.' }, { '.', '.', 'q', '.', '.', 'q', '.', '.' }, { '.', '.', '.', '.', '.', '.', '.', '.' }, { 'q', '.', '.', '.', '.', '.', '.', 'q' },
- 一类包括从左上到右下的对角线。本案可按以下方式处理:
- 代码对冲突进行两次计数。这是不必要的,因为如果
- 一类包括从左上到右下的对角线。本案可按以下方式处理: