所以我创建了一个应用程序,我必须使用 A* 算法找到从
startPos
到 endPos
的最短路线。我用两种最常见的启发式方法解决了这个问题:
1。曼哈顿距离
2。欧氏距离
他们不仅给我相同的路径,而且他们都探索相同的节点。有意义吗?
我计算距离的函数:
public static int manhattanDistance(int row1, int col1, int row2, int col2) {
return Math.abs(row1 - row2) + Math.abs(col1 - col2);
}
public static int euclideanDistance(int row1, int col1, int row2, int col2) {
int dx = col2 - col1;
int dy = row2 - row1;
return (int) Math.sqrt(dx * dx + dy * dy);
}
一个例子是当我有网格时:
S0000001000
11001000010
00000000000
00100000001
0000010100E
开始位置
S = (0.0)
和结束位置E = (4,10)
执行算法后我得到结果:
Calculating result using Manhattan Distance.
Nodes explored (33): (0, 0) (0, 1) (0, 2) (0, 3) (1, 2) (1, 3) (2, 2) (2, 3) (0, 4) (3, 3) (0, 5) (4, 3) (1, 5) (3, 4) (1, 6) (3, 5) (2, 6) (1, 7) (2, 7) (1, 8) (3, 6) (3, 7) (2, 8) (3, 8) (2, 9) (4, 8) (2, 10) (4, 9) (0, 8) (2, 1) (0, 9) (3, 1) (4, 1)
Path: (0, 0) (0, 1) (0, 2) (0, 3) (0, 4) (0, 5) (1, 5) (1, 6) (2, 6) (2, 7) (3, 7) (3, 8) (4, 8) (4, 9) (4, 10)
Calculating result using Euclidean Distance.
Nodes explored (33): (0, 0) (0, 1) (0, 2) (0, 3) (1, 2) (1, 3) (2, 2) (2, 3) (0, 4) (3, 3) (0, 5) (4, 3) (1, 5) (3, 4) (1, 6) (3, 5) (2, 6) (1, 7) (2, 7) (1, 8) (3, 6) (3, 7) (2, 8) (3, 8) (2, 9) (4, 8) (2, 10) (4, 9) (0, 8) (2, 1) (0, 9) (3, 1) (4, 1)
Path: (0, 0) (0, 1) (0, 2) (0, 3) (0, 4) (0, 5) (1, 5) (1, 6) (2, 6) (2, 7) (3, 7) (3, 8) (4, 8) (4, 9) (4, 10)
我们可以看到,不仅路径相同,而且节点以相同的顺序探索。应该这样吗?这样做有意义吗?所有场景都是这样吗?