有人可以在曼哈顿解释为java解决8个难题吗?
我正在编写一个A *算法,它可以解决Java中的8-puzzle问题,到目前为止,我已经实现了DFS,BFS,A *使用不同位置的磁贴数量,我只需要使用曼哈顿距离的启发来实现它。
正如你可能知道曼哈顿距离是每个瓷砖位移相对于其当前位置和其在目标状态下的指数的总和。
我搜索了一下,发现了这些堆栈流转主题:
计算曼哈顿距离曼哈顿A *
其中返回了以下代码:
int manhattanDistanceSum = 0;
for (int x = 0; x < N; x++) // x-dimension, traversing rows (i)
for (int y = 0; y < N; y++) { // y-dimension, traversing cols (j)
int value = tiles[x][y]; // tiles array contains board elements
if (value != 0) { // we don't compute MD for element 0
int targetX = (value - 1) / N; // expected x-coordinate (row)
int targetY = (value - 1) % N; // expected y-coordinate (col)
int dx = x - targetX; // x-distance to expected coordinate
int dy = y - targetY; // y-distance to expected coordinate
manhattanDistanceSum += Math.abs(dx) + Math.abs(dy);
}
}
这是我不明白,鉴于这个董事会和这个目标状态:
初始板:
1,2,5
3,0,4
6,7,8
目标状态:
0,1,2
3,4,5
6,7,8
如果我键入board [0] [0]值为1的值,这恰好是从其正确的位置移开1,我得到以下结果:
x = 0;
y = 0;
value = 1;
targetX = (value -1)/3; // 0/3 = 0
targetY = (value -1)%3 //0%3 = 0
int dx = x - targetX; // 0 - 0
int dy = y - targetY; // 0 - 0
manhattanDistanceSum += Math.abs(dx) + Math.abs(dy);
最终产生0 + 0,这显然是不正确的,因为它应该返回1的值。
有没有另一种方式来例如:
for(int i = 0; i < 3 i ++){
for(int j =0; j < 3; j ++){
int value = currentBoard[i][j];
int goalValue = getLocationOfValueInGoalState(value);
/* caluclate the value's X distance away from the returned goal state location for said value, then do the same for the Y */
}
}
希望有人能够理解我的问题,我现在有点困惑。
目标状态对你来说有什么不同,以及你正在查看的参考实现的目标状态是什么样子。
对于参考实现,如果目标状态如下所示:
1 2 3
4 5 6
7 8 0
就你而言,你希望曼哈顿的距离为:
0 1 2
3 4 5
6 7 8
快速解决方法是简单地重新定义您的目标状态为前者。
但是,如果后者是您真正想要的,那么将targetX / Y更改为不要从值中减1。
曼哈顿距离是指当对角移动棋子时距离的增加。 如果可移动瓷砖位于右上角,则要将该块移动到左下角,则不能直接沿对角线移动它。 你必须顺序左移然后下移。 增加的是曼哈顿的距离。 这个有趣的部分是洗牌算法。 曼哈顿距离在数学中也被称为出租车距离,http://en.wikipedia.org/wiki/Taxicab_geometry。
链接地址: http://www.djcxy.com/p/65565.html上一篇: Can somebody explain in Manhattan dstance for the 8 puzzle in java for me?