Java 八皇后启发式
我正在开发一种启发式方法,在8x8棋盘上放置8个皇后。 每个方格都有自己的消去数(如果一个皇后被放置在一个方格中,则表示一个空棋盘中有多少个方格被“消去”)。每个皇后应该被放置在消去数最低的方格中 我的问题是,我不知道该怎么做才能不断减少它们相应平方的特定消去数,所以如果你能帮我做到这一点,我将不胜感激。 另一个问题,我觉得我的代码非常复杂,所以有什么注释可以让它更简单吗 这是我的密码Java 八皇后启发式,java,artificial-intelligence,heuristics,n-queens,Java,Artificial Intelligence,Heuristics,N Queens,我正在开发一种启发式方法,在8x8棋盘上放置8个皇后。 每个方格都有自己的消去数(如果一个皇后被放置在一个方格中,则表示一个空棋盘中有多少个方格被“消去”)。每个皇后应该被放置在消去数最低的方格中 我的问题是,我不知道该怎么做才能不断减少它们相应平方的特定消去数,所以如果你能帮我做到这一点,我将不胜感激。 另一个问题,我觉得我的代码非常复杂,所以有什么注释可以让它更简单吗 这是我的密码 public class Queen { private final int SIZE = 8; privat
public class Queen {
private final int SIZE = 8;
private int board[][] = new int[SIZE][SIZE]; // 8x8 board
private int hor[] = new int[SIZE]; // horizontal moves
private int ver[] = new int[SIZE]; // vertical moves
private int lowestValue = 22;
private int[][] queens = new int[SIZE][2]; // 8 queens
public Queen () {
// initialize each square with its own elimination number
for (int row = 0; row < board.length; row++) {
for (int col = 0; col < board[row].length; col++) {
if (row == 0 || row == 7 || ((row >= 1 && row <= 6) && (col == 0 || col == 7))) {
board[row][col] = 22;
}
else if ((row == 1 || row == 6) && (col >= 1 && col <= 6) || (row > 1 && row < 6) && (col == 1 || col == 6)) {
board[row][col] = 24;
}
else if ((row == 2 || row == 5) && (col >= 2 && col <= 5)|| (row > 2 && row < 5) && (col == 2 || col == 5)){
board[row][col] = 26;
}
else if ((row == 3 || row == 4) && (col >= 3 && col <= 4)){
board[row][col] = 28;
}
}
}// end initializing
// initialize moves
//right
hor[0] = 1;
ver[0] = 0;
//left
hor[1] = -1;
ver[1] = 0;
//up
hor[2] = 0;
ver[2] = -1;
//down
hor[3] = 0;
ver[3] = 1;
//up right
hor[4] = 1;
ver[4] = -1;
hor[7] = -1;
ver[7] = 1;
//up left
hor[5] = -1;
ver[5] = -1;
//down right
hor[6] = 1;
ver[6] = 1;
// down left
for (int queen = 0; queen < queens.length; queen++) {
placeQueens(queen);
}
displayBoard();
}// end constructor
// eliminate squares according to the place of the queen
private void eliminate (int queen_row, int queen_col) {
// eliminate diagonal
int rowCopy = queen_row;// helper row
int colCopy = queen_col;// helper column
try {
// eliminate up right
for (int move = 0; move < 8; move++) {
rowCopy += ver[4];
colCopy += hor[4];
if (board[rowCopy][colCopy] > 0) {
board[rowCopy][colCopy] = 0;
}
}
}
catch (ArrayIndexOutOfBoundsException e) {
}
try {
rowCopy = queen_row;
colCopy = queen_col;
// eliminate up left
for (int move = 0; move < 8; move++) {
rowCopy += ver[5];
colCopy += hor[5];
if (board[rowCopy][colCopy] > 0) {
board[rowCopy][colCopy] = 0;
}
}
}
catch (ArrayIndexOutOfBoundsException e) {
}
try {
rowCopy = queen_row;
colCopy = queen_col;
// eliminate down right
for (int move = 0; move < 8; move++) {
rowCopy += ver[6];
colCopy += hor[6];
if (board[rowCopy][colCopy] > 0) {
board[rowCopy][colCopy] = 0;
}
}
}
catch (ArrayIndexOutOfBoundsException e) {
}
try {
rowCopy = queen_row;
colCopy = queen_col;
// eliminate down left
for (int move = 0; move < 8; move++) {
rowCopy += ver[7];
colCopy += hor[7];
if (board[rowCopy][colCopy] > 0) {
board[rowCopy][colCopy] = 0;
}
}
}
catch (ArrayIndexOutOfBoundsException e) {
}
// eliminate row
for (int col = 0; col < 8;col++) {
if (board[queen_row][col] > 0) {
board[queen_row][col] = 0;
}
}
// eliminate col
for (int row = 0; row < 8; row++) {
if (board[row][queen_col] > 0) {
board[row][queen_col] = 0;
}
}
}// end elimination
// decrease elimination number of each square
public void decreaseElimination () {
}// end decrease elimination
public void countEliminated () {
int counter = 0;
for (int row = 0; row < board.length; row++) {
for (int col = 0; col < board[row].length; col++) {
if (board[row][col] == 0) {
counter++;
}
}
}
System.out.printf("%d squares eliminated\n", counter);
}
public void placeQueens(int queenNum) {
int targetRow;
int targetCol;
// find lowest elimination number
for (int row = 0; row < board.length; row++) {
for (int col = 0; col < board[row].length; col++) {
if (board[row][col] > 0 && board[row][col] < lowestValue) {
lowestValue = board[row][col];
targetRow = row;
targetCol = col;
queens[queenNum][0] = targetRow;
queens[queenNum][1] = targetCol;
}
}
}
System.out.printf("queen %d has been placed in [%d][%d]\n", queenNum + 1, queens[queenNum][0], queens[queenNum][1]);
eliminate(queens[queenNum][0], queens[queenNum][1]);
decreaseElimination();
countEliminated();
}
// display board
public void displayBoard () {
for (int row = 0; row < board.length; row++) {
for (int col = 0; col < board[row].length; col++) {
System.out.printf("|%2d|", board[row][col]); // display elimination number of each square
}
System.out.println();
}
}// end displayBoard
公共类皇后{
私有最终整数大小=8;
专用int板[][]=新int[SIZE][SIZE];//8x8板
private int hor[]=new int[SIZE];//水平移动
private int ver[]=new int[SIZE];//垂直移动
private int lowerstvalue=22;
private int[]queens=new int[SIZE][2];//8个queens
公众皇后(){
//用自己的消去数初始化每个方块
对于(int row=0;row=1&&row=1&&col 1&&row<6)&&col==1 | | col==6)){
董事会[行][col]=24;
}
如果((行==2 | |行==5)和&&(列>=2和列2和列<5)和&(列==2 | |列==5)){
董事会[行][col]=26;
}
如果((行==3 | |行==4)和&&(列>=3和列0){
线路板[rowCopy][colCopy]=0;
}
}
}
catch(ArrayIndexOutOfBoundsException e){
}
试一试{
rowCopy=皇后大道;
colCopy=女王学院;
//左上消除
对于(int move=0;move<8;move++){
行复制+=版本[5];
colCopy+=hor[5];
如果(线路板[rowCopy][colCopy]>0){
线路板[rowCopy][colCopy]=0;
}
}
}
捕获(阵列索引边界外异常e){
}
试一试{
rowCopy=皇后大道;
colCopy=女王学院;
//右下消除
对于(int move=0;move<8;move++){
行复制+=版本[6];
colCopy+=hor[6];
如果(线路板[rowCopy][colCopy]>0){
线路板[rowCopy][colCopy]=0;
}
}
}
捕获(阵列索引边界外异常e){
}
试一试{
rowCopy=皇后大道;
colCopy=女王学院;
//左下消除
对于(int move=0;move<8;move++){
行复制+=版本[7];
colCopy+=hor[7];
如果(线路板[rowCopy][colCopy]>0){
线路板[rowCopy][colCopy]=0;
}
}
}
捕获(阵列索引边界外异常e){
}
//消行
for(int col=0;col<8;col++){
如果(董事会[皇后大道][col]>0){
董事会[皇后大道][col]=0;
}
}
//消色
用于(int行=0;行<8;行++){
如果(板[行][后柱]>0){
板[行][后柱]=0;
}
}
}//末端消除
//减少每个方块的消去数
公共无效减少消除(){
}//端减消除
已消除公众假期(){
int计数器=0;
对于(int row=0;row0和板[行][col]
}
我的主要方法在单独的类中。这段代码本身就有缺陷:
for (int queen = 0; queen < queens.length; queen++) {
placeQueens(queen);
}
for(int queen=0;queen
如果不同时决定将皇后1放置到8的位置,则无法决定将皇后0放置到何处。您已实现“第一次拟合”:
正如你在上面的例子中所看到的,第一次拟合并不能得到一个可行的解决方案
这里有一个算法确实有效(但规模非常大):
你不需要为自己的google it开发,你会找到的。事实上,我正在尝试用Java解决一个如何编写第9版的练习元问题:这个练习是围绕启发式问题还是围绕8皇后问题?因为这不是解决它的最佳方法。@BhavikAmbani:请阅读家庭作业标签wiki。@Mat正如Kareem所说,这是家庭作业,不久前我和我的一个学生做了这件事。一个直接的回溯解决方案,以及一个使用多台机器和Terracotta的并行方法。代码在这里:让你看一看。