设置A *搜索

时间:2013-04-27 08:26:51

标签: java path-finding a-star heuristics

我正在编写一个程序的一小部分,我必须编写一个寻路算法。该函数接收所谓的“路径”,每个路径定义2D空间中的起点和终点。该算法需要找到最短且最有效(在某种程度上)的路径(从原点)来通过这些路线,从而最大限度地减少总体行进距离。

我做了一些研究,开始了一条我认为可行的道路。到目前为止,我已经将路线转换为有向图,所有这些图都被链接起来,好像它是一个理想化的路线图。然后我尝试在此图表上执行A *搜索。我使用的启发式算法计算了剩余行进的“路线”的总距离,并且使用的起点(G)值的距离仅仅是到达当前点的累积距离。这适用于某些输入,但其他人根本没有返回任何路径,我似乎无法找出原因。

我的启发式是否有可能是错误的,这会导致某处错误计算,或者A *程序本身错误的可能性更大?或者我在这里完全错误的轨道?

我将把getPath函数放在下面(用Java编写)以防万一。

提前致谢。

public ArrayList<Vector2> getPath()
{
    PriorityQueue<SearchNode> openList = new PriorityQueue<SearchNode>(10, new SearchNodeComparator());
    ArrayList<SearchNode> closedList = new ArrayList<SearchNode>();

    map.startJobs();
    searchDepth = 0;

    SearchNode start = searchableGraph.getNode(new Vector2(0, 0));
    int goalsLeft = map.getJobCount();

    start.setDistanceTraveled(0);

    openList.add(start);

    while (openList.size() > 0)
    {
        SearchNode current = openList.peek();
        searchDepth++;

        if (map.isJobEndPoint(current.getValue()))
        {
            map.completeJob(current.getValue());
            goalsLeft--;

        }

        if (reachedGoalState(current, searchableGraph.getNodes().size()))
        {
            return getFinalPath(current);
        }
        else
        {
            ArrayList<SearchNode> neighbours = getNeighbours(current);

            for (int i = 0; i < neighbours.size(); i++)
            {
                SearchNode node = neighbours.get(i);        
                System.out.print("Inspecting node" + node.getValue().toString());

                float distanceTraveled = current.getDistanceTraveled() + getDistance(current.getValue(), node.getValue());

                float heuristic = heuristic(node);

                if (!openList.contains(node) && !closedList.contains(node))
                {

                    node.setDistanceTraveled(distanceTraveled);

                    node.setDistanceToGoal(distanceTraveled + heuristic);

                    node.setParent(current);

                    openList.add(node);
                }
                else if(openList.contains(node))
                {
                    if (node.getDistanceTraveled() <= distanceTraveled)
                    {

                        node.setDistanceToGoal(distanceTraveled + heuristic);


                        node.setParent(current);
                    }

                }
            }

            openList.remove(current);
            closedList.add(current);
        }
    }

    return new ArrayList<Vector2>();
}

1 个答案:

答案 0 :(得分:0)

  

我使用的启发式算法计算了剩余行程的“路线”的总距离

A *使用的启发式必须是admissible;也就是说,它必须永远不会超过估计距离结束的距离

如果我理解你的描述正确,你的启发式不可接受,所以不能保证工作。