- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在开发一种启发式方法,将 8 个皇后放在 8x8 的棋盘上。每个方格都有自己的淘汰号(表示如果在该方格中放置一个皇后,则“消除”空棋盘的多少个方格。)并且每个皇后应放置在具有最低淘汰号的方格中。
我的问题是我不知道该怎么做才能不断减少相应方 block 的特定消除数,所以如果你能帮助我,我将不胜感激。另一个问题,我觉得我的代码很复杂,所以有什么注释可以使它更简单吗?
这是我的代码
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
我的主要方法在单独的类中。
最佳答案
这段代码本身就有缺陷:
for (int queen = 0; queen < queens.length; queen++) {
placeQueens(queen);
}
如果不同时决定将皇后 1 到 8 放在哪里,就无法决定将皇后 0 放在哪里。您已经实现了“首次适配”:
如您在上面的示例中所见,首次拟合不会产生可行的解决方案。 More info in this manual (including algorithms that do work).
这是一个有效的算法(但扩展性非常差):
关于java - 八皇后启发式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13217979/
场景: Suppose I have a large pseudorandom graph complete with edge weights, but without any coordinate
我有一个巨大的人名列表,我必须在巨大的文本中进行搜索。 只有名称的一部分可以出现在文本中。并且可能存在拼写错误、打字错误或缩写。文本没有标记,因此我不知道文本中人名的开头位置。我不知道这个名字是否会出
我在尝试总结这些启发式算法的最坏情况比率时遇到了一些麻烦(这意味着它满足三角不等式)旅行商问题: 最近的邻居 最近的插入 最便宜的插入 最远插入 最近的邻居: Here它表示 NN 的 w-C 比率为
我正在为 2048 开发一个 AI。到目前为止它非常简单,我基本上是在尝试制作一个由递减方 block 组成的“蛇”,所以完美的游戏应该是这样的: ,虽然这和这个一样好: . 我的启发式方法是使用一个
我从 stdin 中读取了一个正整数 N,然后我试图确定 N 是否是素数。 我知道我可以将 N 除以所有正数直到 sqrt(N),但这很耗时,而且我的算法有时会给出误报,所以我正在寻找一种启发式方法来
我对高估/低估这两个术语感到困惑。我完全了解 A* 算法的工作原理,但我不确定高估或低估启发式算法的效果。 取直接鸟瞰线的平方是否高估?为什么它会使算法不正确?所有节点都使用相同的启发式。 直接鸟瞰线
我有一个问题,由一个有墙、目标和代理的方形迷宫组成。代理只能水平/垂直移动。在每一步,每个智能体从 1 个方格移动。 我必须实现 A* 算法来解决问题,但我很难找到一个很好的启发式算法来解决它。 每次
首先,我看到了这个答案,是的,它解释了 X-Y 启发式算法,但是示例板太简单了,我无法理解一般的启发式算法。 X-Y heuristic function for solving N-puzzle 有
我正在尝试为清晰 map 的吃 bean 人游戏想出一个又好又快的启发式方法。 我的启发式方法是尝试计算吃 bean 人到达 map 上每个有食物的点所需的最小可能距离。我当前的算法基本上是 Prim
我只是玩弄 Python 并发现了一件有趣的事情:我的计算机(i5,3 GHz)在尝试计算 10 ** 10 ** 10 几个小时后就停止运行了。我知道数学不是创建 Python 的目的,但我想知道是
我理解杀手启发式背后的想法以及它为什么有帮助。我正在努力解决的是如何在 Alpha-Beta 搜索例程中实现它。特别是如何保证只先尝试兄弟节点的杀手级 Action ?伪代码会有很大帮助。 最佳答案
我已经实现了 Clarke-Wright 启发法来解决 TSP(基于伪代码 here )。我已附上我在 Matlab 中的实现。然而,它对我来说不够快,并且需要 O(n2) 空间(因为成对距离)。我想
我是一名优秀的程序员,十分优秀!