Java 一个好的启发式图搜索

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

我正在为一个具有不同距离的简单多出口迷宫实施A*路径查找算法,但是我无法找到合适的启发式,它似乎执行广度优先搜索

成本初始设置为1

以下是我的尝试:

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());

}