八皇后启发式

我正在开发一个启发式方法,用于在8×8的棋盘上放置8个皇后。每个方格都有自己的淘汰数(表示如果在该方格放置一个皇后,会“淘汰”多少个空棋盘的方格),每个皇后应该放置在淘汰数最低的方格中。

我的问题是,我不知道如何持续降低特定方格的淘汰数,如果你能帮助我解决这个问题,我将不胜感激。另一个问题是,我觉得我的代码非常复杂,所以有什么建议可以让它更简单吗?

这是我的代码

public class Queen {private final int SIZE = 8;private int board[][] = new int[SIZE][SIZE]; // 8x8 boardprivate int hor[] = new int[SIZE]; // horizontal movesprivate int ver[] = new int[SIZE]; // vertical movesprivate 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 queenprivate 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 squarepublic void decreaseElimination () {}// end decrease eliminationpublic 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 boardpublic 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

}

我的主方法在单独的类中。


回答:

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注