Java 一个好的启发式图搜索
我正在为一个具有不同距离的简单多出口迷宫实施A*路径查找算法,但是我无法找到合适的启发式,它似乎执行广度优先搜索 成本初始设置为1 以下是我的尝试:Java 一个好的启发式图搜索,java,path-finding,heuristics,Java,Path Finding,Heuristics,我正在为一个具有不同距离的简单多出口迷宫实施A*路径查找算法,但是我无法找到合适的启发式,它似乎执行广度优先搜索 成本初始设置为1 以下是我的尝试: public void search(Node startNode, Node goalNode){ System.out.println("Search Started"); boolean found = false; boolean noPath = false; Queue<Node> open
public void search(Node startNode, Node goalNode){
System.out.println("Search Started");
boolean found = false;
boolean noPath = false;
Queue<Node> open = new PriorityQueue<Node>(10,new Comparator<Node>(){
@Override
public int compare(Node t, Node t1) {
return Double.compare(t.getCost(), t1.getCost());
}
});
visited[startNode.getX()][startNode.getY()] = true;
order[startNode.getX()][startNode.getY()] = 0;
startNode.setCost(h(startNode, goalNode));
open.add(startNode);
while (found == false && noPath == false) {
if (open.isEmpty()) {
noPath = true;
}else{
Node current = open.remove();
if(current.getX() == goalNode.getX() && current.getY() == goalNode.getY()){
System.out.println("found Node");
printOrder();
found = true;
break;
}else{
for (int i = 0; i < 4; i++){
Node nextNode = getAction(current.getX(),current.getY());
System.out.println("getting node:" + nextNode.getX() + " " + nextNode.getY());
int g2 = current.getCost()+cost+h(current, goalNode);
System.err.println(g2);
nextNode.setCost(g2);
if (nextNode.getX() != -1) {
count++;
visited[nextNode.getX()][nextNode.getY()] = true;
order[nextNode.getX()][nextNode.getY()] = count;
open.add(nextNode);
}
}
}
}
}
}
对于典型的迷宫-一个出口,只有一条路径,路径宽度=1-A*比宽度优先没有优势,非常感谢您的帮助。它的区别只在地图上可见,就像你在战略游戏中看到的那样,在这些地图上,试图沿着目标的空中方向行走是有优势的,而且之前走过的距离具有重要意义。如果您愿意,请查看其他算法:
对于典型的迷宫-一个出口,只有一条路径,路径宽度=1-A*比宽度优先没有优势。它的区别只在地图上可见,就像你在战略游戏中看到的那样,在这些地图上,试图沿着目标的空中方向行走是有优势的,而且之前走过的距离具有重要意义。如果您愿意,请查看其他算法:
迷宫是什么样子的?在典型的迷宫中,曼哈顿距离是无用的。迷宫是什么样子的?在典型的迷宫中,曼哈顿距离是无用的。此外:A*是一种启发式宽度优先,因此它将首先找到最短的路径。你对它没有比严格的广度优先更好的表现感到失望,这是因为在维基百科页面上的A*上标记为
h(x)
的目标估计没有任何优势。事实上,你必须要有h(x)=0
(所以不要在启发式中使用它)!如果你不这样做,那么A*会选择目标的空中方向,并生成次优路径。谢谢,我想我现在知道了,我对每个节点应用了不同的权重,它会找到最短路径。我将查看链接到的Wiki页面,寻找替代算法。它不会产生次优路径,假设可接受的启发式(如欧氏距离)。但是由于开集管理,它很可能在更糟糕的时候发现它。另外:A*是一种启发式的广度优先,因此它会首先找到最短的路径。你对它没有比严格的广度优先更好的表现感到失望,这是因为在维基百科页面上的A*上标记为h(x)
的目标估计没有任何优势。事实上,你必须要有h(x)=0
(所以不要在启发式中使用它)!如果你不这样做,那么A*会选择目标的空中方向,并生成次优路径。谢谢,我想我现在知道了,我对每个节点应用了不同的权重,它会找到最短路径。我将查看链接到的Wiki页面,寻找替代算法。它不会产生次优路径,假设可接受的启发式(如欧氏距离)。但由于开放集管理,它很可能会在更糟糕的时候发现它。
public int h(Node current, Node goal){
return (goal.getX() - current.getX()) + (goal.getY() - current.getY());
}